设计模式通常是造就好坏的力量吗?[关闭]


33

我听说它辩称,自切面包以来,设计模式是最好的选择。我还听说过有人认为设计模式会加剧“第二系统综合症”,它们被过度使用,并且使用户认为自己是比实际更好的设计师。

我倾向于更接近以前的阵营,但是最近我看到了这样的设计,其中几乎每个交互都被观察者关系所取代,而所有事情都是单例。

那么,考虑到收益和问题,设计模式通常是好是坏,为什么?

Answers:


53

设计模式是一种语言,不是建议编写程序或合同。它们的主要用途是事后解释,说明如何(或将要)实现组件或系统。您不必说太多细节,只需说几句话就可以很好地描述实现,以使侦听器可以了解它的工作原理以及其中的重要内容。

Alex:嘿,如何创建配置文件?

鲍勃:它们是由位于的工厂产生的config.h

现在,Alex知道配置文件的创建涉及不平凡的准备工作,因为否则它们的创建将不会包含在工厂中。

但是,如果Bob是一个以模式为首的假人,并且只在这里和那里使用过模式,那么Alex就无法告诉任何有关配置创建的信息,因为Bob到处都使用了factory。这也将导致程序过于复杂。

因此,首先编程,然后在代码中发现模式,反之亦然。这就是有效使用它们的方式。


11
无论如何+1,尤其是对于“ then spot pattern”而言-正是我们首先获得了pattern,但是一直在寻找反复出现的问题
Frank Shearar

16
出于某种原因,它们被称为设计模式。尽管在编码时发现模式没有错,但是在编码开始之前识别适当的模式也没有错。问题在于像锤子一样工作,认为一切都是钉子。
乔治·玛丽安

11
重要的是要发现代码工作方式中的模式,而不是说“我应该为该代码使用哪种设计模式”,这很容易导致官僚主义代码膨胀。尤其是当您以不同的编码方法误用一种语言针对一种语言的DP时。
彼得·布顿

好答案。我对采用的定义:任何技术只有在构建链中被确定为可执行的可编译工件后,才被视为采用。在构建链中,没有多少书,博客和令人振奋的手法值得一个真正的指导。

14

设计模式很棒。如果使用得当,它们可使代码更易于维护,更易于阅读和使用。成为一名优秀的程序员的一部分是知道何时停止,并知道任何进一步的重构都将超过收益。仅使用设计模式并不能使一个人成为一个好的程序员,但是知道何时何地使用它们就可以了。就像这个世界上的其他任何东西一样,设计模式可能会被极端化和滥用。我知道我仍在(并会很长时间)在我的代码中寻求这种完美的平衡,其中每个设计模式都有一个目的,并且就如拼图游戏一样完美地落入位置。


10

如果正确使用设计模式,那就太好了。

记住设计模式的思想起源于建筑是很有用的。体系结构可以千差万别。但是,任何建筑物中都存在许多核心思想。这样,可以将模式视为设计的基础。重要的是要注意,并非每座建筑物都包含所有可能的建筑模式。

假设您正在设计房屋。与其将前门敞开在街道上,不如在进入房屋之前先要有一个庇护区,即一间休息室。该区域将适合某种模式。即,它将有两个入口,一些墙壁,可能还有一个屋顶。注意,该模式未指定门,窗或墙壁数。在大多数实现中,将有两个门,四个墙,可能还有窗户。但是,该模式描述了一个带有两个入口的封闭区域。一个人从房子外面通向前厅,另一个人进入房子的其余部分。这里的关键是,如果要使用前厅,则必须围成一个区域,并提供进入该区域的两个入口。

编程中设计模式的典型问题是过度使用,并且认为它们是解决任何问题的灵丹妙药。他们不是。它们是交流和思考有用的编程思想的方式。如果特定语言的语法部分是实体,则模式描述了一些有用的方式来安排它们以满足特定需求。


+1很好的解释,特别是在设计系统时最好使用它们。不幸的是,有关在何处以及如何使用这些模式的知识主要来自重构先前系统的经验,这些经验仅在实施期间才被发现。所以我的版本是一个较小的扩展:首先考虑,然后编写代码。然后分析结果,必要时进行重构。下次,在编码之前会出现更多模式:-)
Lorand Kedves,2012年

7

我认为设计模式更多是“ 建议 ”,而不是绝对必须遵循的不变合同。为什么?正是由于您提到的原因。在所有内容中遵循设计模式会导致大量的代码混乱,从而破坏了首先使用模式的目的。

这就是为什么我讨厌像Java Practices这样的网站。当然,有些想法是好的,但是作者决定按照他提到的每个设计模式编写一个完整的程序(加上一个框架)。作者还用可怕的引号写了每篇文章,使读者认为实际的Java实践是可怕的,应避免像瘟疫一样避免。

TL; DR:使用设计模式。只是不要虐待他们


我通常对设计模式持怀疑态度和愤世嫉俗。我不认为我直接有机会在我的职业工作中使用它们。可能是因为我不使用Java或“硬核” OO C ++。有趣的是。理查德·加布里埃尔(Richard Gabriel)报告说,设计模式的发起者(建筑体系结构中的亚历山大)在将设计模式实际应用于建筑物时遇到了一些令人讨厌的失败,而且似乎并没有真正达到亚历山大在设计模式中寻找的质量。
保罗·内森

2

也可以在SO上看到线程。另一个POV设计模式是样板代码,以弥补所使用方法的不足。我不喜欢过分地庆祝这些解决方法。


然而,人们仍在继续使用需要这种样板的语言,而不是使用使这些模式变得不必要的语言。
Frank Shearar

我的想法正好。
missingfaktor

1
设计模式永远不应被视为样板。样板被定义为“必须在很少或没有改动的情况下在许多地方包含的代码段”。在另一方面,设计模式是没有的代码只是块。它们是有关如何构建代码以解决某些类型的设计问题的广泛原则。它们没有特定的实现。设计模式的实现应始终根据项目的需求而变化。
克拉莫伊(Kramii)恢复莫妮卡(Monica)2011年

@Kramii:例如,命令式编程语言中的“函数对象” /“函数器”是样板代码,而函数是第一类。您无需在此处编写任何代码,该语言支持该语言。反之亦然,您必须在Haskell中使用一个称为“ IO Monad”的“设计模式”来获取顺序的命令式I / O,您可以使用命令式语言免费获得该命令。我建议遵循我链接到的线程。
LennyProgrammers

1
@ Lenny222:我已经阅读了链接,并同意您的观点,即模式可以克服语言的缺点。但是,我不同意您使用“样板”一词。样板通常指重复执行相同的代码-通常等同于复制粘贴代码或至少模板化的代码片段。OTOH设计模式的实现应根据要求以不同的方式实现。
克拉莫伊(Kramii)恢复莫妮卡(Monica)2011年

0

我更喜欢那些在中间的人。就像海报正确指出的那样,对模式的理解并不能使您成为优秀的开发人员。另一方面,对模式的理解将帮助您成为一名优秀的开发人员。

了解模式的关系并在项目​​中(处于概念阶段)查看模式,这将使您成为一名优秀的开发人员。


0

人们常说设计模式为编程问题提供了现成的解决方案。他们是什么问题?“如何更改对象行为,但将更改与系统其余部分隔离开呢?”

GoF模式被认为可以提供与系统其余部分的隔离(封装),但是通常很难通过使用其设计模式来知道系统的哪个部分具有可变性。我没有遵循他们提出的分类方案(创造性的,行为的和结构的),而是绘制了模式的差异并提出了另外两种方案来对其模式进行分类:生命周期和组件封装层次结构。

设计模式封装层次结构

从该表可以看到封装层次结构,设计模式可以应用于组件的每个级别。但这有意义吗?组件是否需要在建议的封装级别上提供行为变化,并且在该级别上使用了正确的模式吗?如果未正确回答这些问题,则很可能会错误地应用设计模式。仅仅因为可以在汽车机舱中内置垂直枢轴,这并不是一个聪明的主意。


0

用类似于金钱的方式,应将设计模式视为具有高资本成本但运营成本低的解决方案。设计模式在额外的编码,冗长性以及它们所产生的额外间接性的概念重要性方面花费了一大笔钱。它们也倾向于锁定设计的其他方面。例如,使用模板方法会迫使您以大量的OO风格进行编程。

但是,如果您需要解决许多紧密相关的问题,这些问题之间的差异可能很小,或者将来肯定需要以某些特定方式大量修改一段代码,那么前期成本是值得的,因为设计模式为您的代码增加了灵活性。使用模式比不使用模式更容易解决或解决第二套紧密相关的问题。


0

这两个阵营都是正确的-如果正确使用它们,这是好事,如果到处都是,它们是坏事。


0

设计模式可能会吸引您,但总体而言,编码也是如此。编写终极工具箱很容易引人入胜-您只需要牢记YAGNI即可阻止您偏离路线,了解应用程序需要多少结构。IMO这仅取决于个人,是他们经验/判断的标志。


0

我认为设计问题与您不断尝试将其应用于代码的问题无关。对我来说,这主要是关于开发人员的通用语言。说“我们遵循构建者模式”要比一遍又一遍地说明整个过程要容易得多。

我现在正在重新阅读企业应用程序体系结构模式,因为我偶然发现了很多遵循该书其中一种模式的代码。我认为不是故意选择遵循其中一种模式,但是如果您可以说“ 这是一个事务脚本 ”,并且每个人都清楚理解这意味着什么,那么它肯定会有所帮助。

但是我喜欢这样的想法,当您设计新功能或全新应用程序时,可以从准备好的模式目录中进行选择。如果有针对某些问题的行之有效的解决方案,为什么还要重新发明一切呢?

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.