Questions tagged «design-patterns»

设计模式是解决软件设计中常见问题的通用可重用解决方案。


2
依赖注入样式之间的实际区别是什么?
我是依赖注入的新手,我对应在应用程序中使用哪种样式有一些疑问。我刚刚阅读了Martin Fowler 的《控制容器的反转》和《依赖注入》模式,但是我无法获得构造函数,setter和接口注入之间的实际区别。 在我看来,一个使用另一个的原因仅是代码清理和/或清晰的问题。有什么区别?相对于其他方法,使用它们有什么优点或缺点,还是我刚才所说的? 在我看来,构造函数注入是最直观的,而接口注入则是最少的。另一方面,setter注入是一个中间术语,但是,您是否应该能够更改最初注入的依赖对象的实例?这种注入方式是否可以确保需要依赖项的对象始终被注入?我相信不会,但是如果我错了,请纠正我。

2
在RESTful API中实现命令模式
我正在设计HTTP API,希望使其尽可能地具有RESTful风格。 有些动作的功能会散布在一些资源上,有时需要撤消。 我以为自己,这听起来像是命令模式,但是我如何将其建模为资源呢? 我将介绍一个名为XXAction的新资源,例如DepositAction,它将通过这样的方式创建 POST /card/{card-id}/account/{account-id}/Deposit AmountToDeposit=100, different parameters... 这实际上将创建一个新的DepositAction并激活它的Do / Execute方法。在这种情况下,返回201 Created HTTP状态表示操作已成功执行。 之后,如果客户希望查看操作细节,则可以 GET /action/{action-id} 我猜应该阻止Update / PUT,因为此处不相关。 为了撤消操作,我想到了使用 DELETE /action/{action-id} 实际上将调用相关对象的Undo方法,并更改其状态。 假设我只对一次“撤消”感到满意,而无需重做。 这种方法可以吗? 有什么陷阱,不使用它的原因吗? 从客户的观点看是否明白?


2
寻找一些面向对象的设计建议
我正在开发一个应用程序,该应用程序将用于在工业环境中打开和关闭阀门,并且正在考虑这样的简单操作:- public static void ValveController { public static void OpenValve(string valveName) { // Implementation to open the valve } public static void CloseValve(string valveName) { // Implementation to close the valve } } (该实现会将一些字节的数据写入串行端口以控制阀门-从阀门名称派生的“地址”,以及“ 1”或“ 0”来打开或关闭阀门)。 另一个开发人员问我们是否应该为每个物理阀创建一个单独的类,其中有几十个。我同意,最好使用PlasmaValve.Open()而不是编写类似的代码ValveController.OpenValve("plasma"),但这是否太过分了? 另外,我想知道如何最好地考虑到一些假设的未来需求: 我们被要求支持一种新型的阀门,该阀门需要不同的值来打开和关闭它(不是0和1)。 我们被要求支持可以设置在0-100之间的任何位置的阀,而不是简单地“打开”或“关闭”。 通常,我会在这种情况下使用继承,但是最近我开始着手解决“继承之上的组合”问题,并想知道使用组合是否有一个更好的解决方案?

1
那么,“设计模式是否缺少语言功能”?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 我在程序员那里看到了这个问题的答案:对设计模式和OOP实践的思考如何在动态和弱类型语言中发生变化?在那里,我找到了标题为直截了当的文章的链接:设计模式缺少语言功能。但是在我发现片段对我来说似乎很吸引人的地方,并且可以凭经验加以验证,因为这样做有诱因,例如: PaulGraham说:“ Peter Norvig发现,设计模式中的23个模式中有16个在Lisp中是'不可见的或更简单的'。” 或另一句话证实了我最近在尝试使用JavaScript模拟类的人中看到的内容: 当然,没有人会说“功能”模式,“类”模式或我们认为理所当然的许多其他事情,因为大多数语言都将它们作为内置功能提供。OTOH,使用纯PrototypeOriented语言的程序员?可能会发现使用原型模拟类很方便... 我还考虑到设计模式是一种交流工具。因为即使我参与构建应用程序的经验有限,我也可以将其视为反模式(无效和/或适得其反),例如,这迫使一个小型PHP团队学习中小型Intranet App的GoF模式。我知道规模,范围和目的可以决定什么是有效的和/或富有成效的,但是我仍然没有找到有关这方面的技术概述。 我看到了一些小型的商业应用程序,它们将功能与OOP混合在一起并且仍然可以维护,并且我不知道是否有很多应用程序需要使用python编写单例,但是对我来说,一个简单的模块可以完成同样的事情。 那么,是否有研究,详尽的文章或其他形式的博览会考虑了设计模式,变通方法,更简单的实现方式或语言功能的替代?

2
持久性无关对象能够实现延迟加载吗?
持久性无知是单责任原则的应用,这实际上意味着域对象(DO)不应该包含与持久性相关的代码,而应该只包含域逻辑。 a)我认为这意味着联系较低层(即持久层)的代码位于业务逻辑层的其他类(OC)中的域模型之外? B)如果我的假设下一个)是正确的,那么DO,说Customer,从来没有包含的方法如GetCustomers或GetCustomerByID? c)如果我在a)和b)下的假设是正确的,并且假设Customer域对象对其属性的某些属性使用了延迟加载,则在某个时候Customer,内部逻辑必须联系OC,而OC则会检索延迟的数据。但是,如果Customer需要联系OC来接收延迟的数据,那么我们真的不能说域对象不包含与持久性相关的逻辑吗? 谢谢 回复jkohlhepp 1)我假设OrderProvider并且CustomerProvider类包含在业务逻辑层中? 2)我从您的答复中得知,b)下的假设是正确的? 3) ...我将检查是否填充了一些私人订单字段或该字段是否为空。如果为空... 但是据我所知,只要域代码需要检查是否order填充了私有字段,如果没有,请联系OrderProvider,我们已经违反了PI原则?

4
自定义字段和数据类型的设计模式/策略
是否有用于设计应用程序的通用策略或设计模式,这些应用程序具有向数据对象添加自定义字段或创建对象的自定义定义的能力。例如,我正在考虑使用诸如SalesForce之类的产品,您可以在其中拥有自己的信息类型,诸如Expression Engine之类的框架以及其处理渠道和渠道字段组的方式(示例),或者像wordpress一样的CMS如何具有以下功能:将字段添加到自定义帖子类型。

5
重载了开放/封闭原则的例子吗?
维基百科说 “软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改” 函数一词引起了我的注意,现在我想知道是否可以假定为方法创建重载可以视为“打开/关闭”原理的示例吗? 让我解释一个例子。考虑一下您的服务层中有一个方法,该方法在将近1000个地方中使用。该方法获取userId并确定用户是否为admin: bool IsAdmin(userId) 现在考虑在某个地方,有必要根据用户名而不是userId来确定用户是否为admin。如果我们更改上述方法的签名,那么我们已经在1000个地方破坏了代码(功能应禁止修改)。因此,我们可以创建一个重载来获取用户名,基于用户名找到userId以及原始方法: public bool IsAdmin(string username) { int userId = UserManager.GetUser(username).Id; return IsAdmin(userId); } 这样,我们通过为其创建重载扩展了功能(功能应可扩展)。 它是一个开放/封闭原则的例子吗?

8
真正的KISS解决方案有多“简单”?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我承认:大多数时候我都存在“保持简单和简短”的问题,因为尝试根据我读过的书,听说过的设计模式等使它变得如此热情-一种热情来自感觉到我在实现完美的正确道路上。 另一方面,是的,这有时会给我最后期限带来压力。 但是,每当我对自己说:“下次再简单一点,你就是愚蠢的!” 我觉得很难在下次出现时使其变得“简单”,因为它开始变得怪异……并且在一点之后变得不舒服。 然后我开始判断我对“简单”的理解... SIMPLE是否意味着它太短了,但是它很难维护和扩展? SIMPLE是否意味着打破许多OOP原则? SIMPLE是否意味着作弊? SIMPLE是否意味着只保留截止日期而没有交易?等等 其实是什么 问题是:可以根据KISS原理写出SIMPLE的确切定义吗?-如果有。 谢谢!

1
大量使用Ajax的Web应用程序的模式
到目前为止,我一直是开发Web应用程序的MVC模式的忠实拥护者。对于网络,我主要使用PHP(使用Kohana和CodeIgniter框架)和Ruby(RoR)开发。 随着我的应用程序在Ajax方面变得越来越繁重(单页应用程序等),我注意到我不禁出卖了MVC的最基本概念:Java语言正在做大部分工作;调用控制器只是为了请求视图或更多js / json代码似乎是错误的。 在努力将所有路由作业保留在控制器中之后,现在我从根本上将其分配给控制器和Javascript(即,从框架的PoV来看,是视图的一部分)。当请求json时,MVC的转换看起来更加明显:执行请求的js代码是控制器;框架的控制器仅充当模型数据的代理-实际上是我要的。 那么,我应该研究什么? 我当时在考虑使用纯JavaScript应用程序,例如,使用ribs.js和基于文档的JSON吐出数据库(couchDB)作为后端,但是我喜欢我的关系数据库。 另一个选择如下:我只是在PHP / ruby​​ / go / whatnot中创建“路由模型”。这些将分析请求,调用数据库,并返回一些json。 这种方法对我来说似乎很有趣,但是它没有任何实质性的文档或学术分析,因此我有点害怕这种飞跃。 有想法吗?

8
什么时候为小型重复代码段创建函数/方法,这是什么好代码实践?
在编写大型程序的过程中,我曾多次问过将代码放入一个函数或方法中有意义多少次复制和粘贴,什么是良好的经验法则?我一直在使用四行或更多行的经验法则,出现两次以上,然后创建包含该代码的简单函数/方法。您能想到更好的做法还是提供任何指示?这更多的是一般设计模式问题,而不是语言特定的问题。

3
是对Joshua Bloch的Builder设计模式的改进吗?
早在2007年,我读了一篇关于Joshua Blochs的文章,介绍“构建器模式”,以及如何对其进行修改以改善对构造函数和setter的过度使用,尤其是当对象具有大量属性(其中大多数是可选属性)时。这种设计模式的简要总结articled 这里。 我喜欢这个主意,从那以后一直在使用。它的问题,尽管从客户的角度来看非常干净而且易于使用,但是实现它可能是一件痛苦的事!对象中有许多不同的地方引用了单个属性,因此创建对象和添加新属性要花费大量时间。 所以...我有个主意。首先,使用约书亚布洛赫(Joshua Bloch)风格的示例对象: Josh Bloch风格: public class OptionsJoshBlochStyle { private final String option1; private final int option2; // ...other options here <<<< public String getOption1() { return option1; } public int getOption2() { return option2; } public static class Builder { private String option1; private int option2; …

4
避免使用初始化方法
我有这个现有的代码,其中他们有一个类和该类中的初始化方法。预期一旦创建了类的对象,他们就需要在其上调用initialize。 初始化方法存在 的原因该对象要尽早创建以具有全局作用域,然后在加载依赖的dll之后再调用初始化方法。 具有初始化 的问题该类现在具有此bool isInitialized,需要在每个方法中进行检查,然后再继续进行,如果未初始化则返回错误。简而言之,这是一个很大的痛苦。 一种可能的解决方案 在构造函数中初始化。仅在全局范围内有一个指向该对象的指针。加载dll后创建实际对象。 上述解决方案的问题 任何创建此类的对象的人都必须知道,仅在dll被加载后才需要创建该对象,否则它将失败。 这可以接受吗?

1
REST Web服务的身份验证/访问控制的软件体系结构
我正在设置一个新的RESTful Web服务,我需要提供一个基于角色的访问控制模型。我需要创建一个体系结构,该体系结构将允许用户提供用户名和密码来访问服务,然后根据角色限制他们如何使用服务(可以使用哪些服务,读取与读取/写入等)。分配给该用户。 我环顾了其他问题,发现了我想要的东西。例如,关于如何处理将凭证传递到REST服务的静态身份验证,最佳实践等方面,存在许多精彩的讨论。关于创建网站时程序员应了解的知识(每个开发人员在构建公共网站之前应了解的知识),也有一些很好的指导。 但是我找不到关于实现这些解决方案的软件体系结构的最佳实践和模式的好文章,文章和书。 特别: 用户信息和访问权限应如何存储?(数据模型,位置,格式) 有哪些好的设计模式可以表示和跟踪服务器中的这些模式?(内存中的会话,每次数据库查找等) 在代码库中以哪种安全方式将这些权利映射到服务的良好模式是什么? 哪些架构选择可以帮助保持系统更安全和可靠? 人们从战es中学到了什么? 我正在寻找针对任何特定技术之外的软件体系结构的设计模式和建议。 (如果技术很重要,我计划使用python,twisted和postgresql数据库来实现)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.