Questions tagged «design-patterns»

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

2
Web开发的替代模式?(非MVC)[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 最近,我一直在阅读有关MVC及其与网络不兼容的博客文章。我了解了RMR体系结构之类的替代模式。 我很好奇,除了MVC,人们还在网上使用其他哪些模式?另外,如果有实现该模式的框架,请发布其链接。

16
最常用的设计模式是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 您认为哪种设计模式最受欢迎?

2
为什么构建器应该是内部类而不是其自己的类文件中?
许多Builder Pattern示例都将Builder其构建为对象的内部类。 这有一定道理,因为它表明了Builder构建的内容。但是,使用静态类型的语言,我们知道Builder构建的内容。 另一方面,如果Builder是内部类,则应了解Builder构建的类,而无需查看内部Builder。 而且,将构建器作为内部类可以减少导入的次数,因为外部类可以引用该构建器(如果您对此很在意)。 然后是一些实际的示例,其中Builder放在同一包中,而不是内部类(如)StringBuilder。您知道Builder 应该建立一个,String因为它名为so。 话虽这么说,我能想到的制作Builder内部类的唯一好理由是,您Builder无需知道类的名称或依赖命名约定就可以知道类的含义。例如,如果我StringBuilder是一个内部类,String我可能会知道它比我(推测性)早存在。 是否有其他原因可以使Builder内部类成为阶级,或者只是归结为偏好和仪式?

5
为什么在构造函数中使用setter并没有成为常见的模式?
访问器和修饰符(又名setter和getter)之所以有用,主要有以下三个原因: 它们限制了对变量的访问。 例如,可以访问但不能修改变量。 他们验证参数。 它们可能会引起一些副作用。 大学,在线课程,教程,博客文章和Web上的代码示例都在强调访问器和修饰符的重要性,如今,它们几乎像是代码的“必备”。因此,即使它们不提供任何附加值,也可以找到它们,例如下面的代码。 public class Cat { private int age; public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } 话虽如此,找到更有用的修饰符是很常见的,这些修饰符实际上会验证参数并抛出异常,或者如果提供了无效输入,则返回布尔值,如下所示: /** * Sets the age for the current cat * @param age an integer with the valid values between …

4
在构造函数中合法的“实际工作”?
我正在设计,但是一直遇到障碍。我有一个特定的类(ModelDef),它实际上是通过解析XML模式(例如DOM)构建的复杂节点树的所有者。我想遵循良好的设计原则(SOLID),并确保生成的系统易于测试。我打算使用DI来将依赖项传递到ModelDef的构造函数中(以便在测试过程中可以根据需要轻松地将其替换掉)。 不过,我正在努力的是创建节点树。该树将完全由简单的“值”对象组成,而这些对象无需独立测试。(但是,我仍然可以将抽象工厂传递到ModelDef中,以帮助创建这些对象。) 但是我一直在读,构造函数不应该做任何实际的工作(例如Flaw:Constructor可以进行实际工作)。如果“实际工作”意味着构造重量较重的相关对象,而以后可能希望将其存根进行测试,则这对我来说非常有意义。(这些应通过DI传递。) 但是像该节点树这样的轻量级对象呢?必须在某个地方创建树,对不对?为什么不通过ModelDef的构造函数(例如使用buildNodeTree()方法)呢? 我真的不想在ModelDef之外创建节点树,然后再通过(通过构造函数DI)将其传递进去,因为通过解析架构来创建节点树需要大量复杂的代码-需要进行彻底测试的代码。我不想将其委托给“胶合”代码(这应该是相对琐碎的,并且可能不会被直接测试)。 我曾考虑过将代码创建节点树放在一个单独的“构建器”对象中,但是犹豫称它为“构建器”,因为它与“构建器模式”并不完全匹配(后者似乎与消除伸缩无关。构造函数)。但是,即使我将其称为其他名称(例如NodeTreeConstructor),也只是为了避免让ModelDef构造函数构建节点树而感到有些破绽。它必须建在某个地方。为什么不在要拥有它的对象中?

6
类使用其自己的公共方法可以吗?
背景 我目前遇到一种情况,即我有一个设备同时发送和接收的对象。该消息具有以下几种构造: public void ReverseData() public void ScheduleTransmission() 该ScheduleTransmission方法需要调用ReverseData时,它被称为方法。但是,有时我需要从应用程序中实例化对象的地方进行ReverseData外部调用(并且应该完全在命名空间之外添加)。 至于“接收”,我的意思是ReverseData将在object_received事件处理程序中从外部调用该请求以撤消数据。 题 对象调用其自己的公共方法通常可以接受吗?

3
服务层是否应该捕获所有dao异常并将其包装为服务异常?
我有三层Spring Web应用程序:dao,服务和控制器。控制器从不直接调用dao,而是通过服务层进行调用。现在,大多数情况下,如果存在未处理的dao异常(运行时),则JSP将捕获该异常,并向最终用户显示错误消息。服务层是否应该捕获所有dao异常并将其包装为服务异常? try { daoInstance.someDaoMethod(); } catch(DataAccessException dae) { throw new ServiceException("message", dae); } 假设ServiceException也是运行时,并且也未处理。仅抛出DataAccessException而不是ServiceException有什么区别吗?我只是以为表示层不应该知道数据访问异常。但是我不认为捕获不可恢复的异常只是为了包装它们。

2
数据验证的设计模式
解决此问题的最佳设计模式是什么: 我有一个对象A。可以根据用户请求在数据库中注册或删除对象A。 在注册或删除对象之前执行数据验证。在注册对象之前,有一组规则需要检查,而另一组规则则是删除。这些规则中的一些对于这两种操作都是通用的。 到目前为止,我认为“ 责任链”设计模式最合适,但我在实施它时遇到了麻烦。

5
成功:/失败:阻止与完成:阻止
我在Objective-C中看到了两种常见的块模式。一个是一对成功:/失败:块,另一个是单个完成:块。 例如,假设我有一个任务将异步返回对象,而该任务可能会失败。第一种模式是-taskWithSuccess:(void (^)(id object))success failure:(void (^)(NSError *error))failure。第二种模式是-taskWithCompletion:(void (^)(id object, NSError *error))completion。 成功:/失败: [target taskWithSuccess:^(id object) { // W00t! I've got my object } failure:^(NSError *error) { // Oh noes! report the failure. }]; 完成: [target taskWithCompletion:^(id object, NSError *error) { if (object) { // W00t! I've got my object } …

11
在Bank world中选择代码设计工作或懒惰
我在一家出色的投资银行工作了两年。 我进行了一些技术项目,希望创建最优化的代码,同时尊重适应的良好设计模式,SOLID原则,demeter规律并避免各种重复的代码... 当生产交付=>零错误时,一切都按预期进行。 但是,大多数开发人员来找我是为了使我的所有代码过于复杂以至于无法理解阅读。我听了一个例子:“做一些if和instanceof,忘记多态性,这样很容易纠正紧急生产错误”。我不想回答…… 知道这些开发人员一点也不好奇,拒绝努力理解一个好的设计(例如,90%的开发人员不知道什么是策略模式,并且编写过程代码,并且从不进行设计,因为他们说,他们很简单) ),我的项目经理告诉我,我对银行世界的看法确实是错误的,而且过于理想化。 你会建议我什么?我要重申的是,我是否真的希望真正好的代码,或者让我适应大多数开发人员,对于我来说,重复设计代码对我而言,这并不是真正有趣的设计代码,而是我们开发人员工作的全部美。 或者相反,他们是否应该学习基本的面向对象原则和最佳实践以适应我的代码?

8
使用“ using”关键字时如何实现DRY原理?
考虑以下方法: public List<Employee> GetAllEmployees() { using (Entities entities = new Entities()) { return entities.Employees.ToList(); } } public List<Job> GetAllJobs() { using (Entities entities = new Entities()) { return entities.Jobs.ToList(); } } public List<Task> GetAllTasksOfTheJob(Job job) { using (Entities entities = new Entities()) { return entities.Tasks.Where(t => t.JobId == job.Id).ToList(); } …

5
另一种流行的语言如何在管理与Java / Java EE类似的复杂性时避免使用工厂模式?
工厂模式(或至少使用FactoryFactory..)是许多笑话的对接,例如此处。 除了具有冗长和“创造性”的名称(如RequestProcessorFactoryFactory.RequestProcessorFactory)之外,如果您必须使用Java / C ++进行编程并且有Abstract_factory_pattern的用例,那么工厂模式是否有根本上的错误? 另一种流行的语言(例如Ruby或Scala)如何在管理相似的复杂性时避免使用它呢? 我要问的原因是,在Java / Java EE生态系统的背景下,我看到的大多数批评都是工厂,但它们从未解释其他语言/框架如何解决它们。

8
如何在团队中促进使用Builder模式?
我们的代码库是新老程序员,像我自己一样,为了统一起见,他们很快就学会了按照做事的方式来做。考虑到我们必须从某个地方开始,我自己决定重构一个数据持有者类,如下所示: 删除了setter方法,并设置了所有字段final(我final理所当然地认为“ 好”)。事实证明,该二传手仅在构造函数中使用,因此没有副作用。 引入了一个Builder类 Builder类是必需的,因为构造函数(首先是提示重构的原因)跨越大约3行代码。它有很多参数。 幸运的是,我的一个团队的成员正在另一个模块上工作,并且碰巧需要设置者,因为他需要的值在流程的不同点可用。因此,代码如下所示: public void foo(Bar bar){ //do stuff bar.setA(stuff); //do more stuff bar.setB(moreStuff); } 我认为他应该改用构建器,因为摆脱设置器可以使字段保持不变(他们之前听说过关于不变性的内容),并且还因为构建器允许对象创建是事务性的。我草绘了以下伪代码: public void foo(Bar bar){ try{ bar.setA(a); //enter exception-throwing stuff bar.setB(b); }catch(){} } 如果引发该异常,bar将有损坏的数据,而使用构建器可以避免: public Bar foo(){ Builder builder=new Builder(); try{ builder.setA(a); //dangerous stuff; builder.setB(b); //more dangerous stuff builder.setC(c); return builder.build(); }catch(){} …

6
没有用例的松耦合是否是反模式?
对于某些开发人员而言,松散耦合是精心设计的软件的圣杯。当它使代码在可预见的将来可能发生的变化面前更加灵活,或者避免代码重复时,这无疑是一件好事。 另一方面,松散耦合组件的努力增加了程序中的间接访问量,从而增加了程序的复杂性,常常使程序难以理解,并常常使效率降低。 您是否认为在没有任何松散耦合用例的情况下专注于松散耦合(例如避免代码重复或计划在可预见的将来可能发生的更改)是一种反模式?松散的联轴器能否落入YAGNI的保护伞下?

4
函数式编程是否可以替代依赖项注入模式?
我最近读了一本书,名为《用C#进行函数式编程》,我发现函数式编程的不可变和无状态本质可以实现与依赖注入模式相似的结果,并且可能甚至是更好的方法,尤其是在单元测试方面。 如果对这两种方法都有经验的人可以分享他们的思想和经验以回答主要问题,我将不胜感激:函数式编程是否可以替代依赖项注入模式?

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.