Design patterns 什么时候设计模式会让你的软件变得更糟糕?

Design patterns 什么时候设计模式会让你的软件变得更糟糕?,design-patterns,separation-of-concerns,anti-patterns,Design Patterns,Separation Of Concerns,Anti Patterns,什么时候设计模式会让你的软件变得更糟糕 我看过一个程序,他们在GUI和逻辑之间使用facade模式。他们认为没有对象可以通过此传输,因此只使用了原语类型,这使得编码变得困难。我认为如果不需要,软件可能会变得更糟糕。策略模式基本上使一部分功能“可插拔”,这意味着我们可以动态切换不同的实现。但是这种可插拔的功能通常会增加配置的复杂性(有时还会增加额外的开销),如果不需要,那就是浪费。我经常看到这种模式被滥用。当你误用它时,或者更糟糕的是,当你不必要地使用一种模式时。后者让我发疯,因为当我分析一段代码

什么时候设计模式会让你的软件变得更糟糕


我看过一个程序,他们在GUI和逻辑之间使用facade模式。他们认为没有对象可以通过此传输,因此只使用了原语类型,这使得编码变得困难。

我认为如果不需要,软件可能会变得更糟糕。策略模式基本上使一部分功能“可插拔”,这意味着我们可以动态切换不同的实现。但是这种可插拔的功能通常会增加配置的复杂性(有时还会增加额外的开销),如果不需要,那就是浪费。我经常看到这种模式被滥用。

当你误用它时,或者更糟糕的是,当你不必要地使用一种模式时。后者让我发疯,因为当我分析一段代码时,我自然会首先假设其中的每件事都有原因,当我看不到原因时,最安全的默认假设是我遗漏了一些东西。由于我不想冒着以未知或不可预测的方式破坏代码的风险,我浪费时间试图在弄乱它之前弄清楚它为什么在那里

当它的名字是利维时, 我只会使用一个特定的模式,如果它使我的生活(以及那些负责维护代码的人)更容易的话。我相信正确的设计模式选择和评论一样重要——也许评论更重要?您会发现,设计模式在很大程度上正式描述了我们作为开发人员多年来使用的技术


任何错误理解或错误应用的模式都会使代码变得更糟而不是更好。此外,任何仅仅为了模式而应用的模式,例如“我们现在是SOA!”。
通常,如果某个模式引入了“”,那么它的使用应该是可疑的。

如果您误用了某个设计模式,在错误的情况下应用它,则该设计模式可能会使您的软件变得更糟糕。常识应该是设计模式的完美伴侣

模式的误用有时与缺乏对与问题相关的力的理解以及模式对该问题提出的解决方案有关。此外,该模式的意图可能被误解,导致误用


为了更好地理解模式,您还需要了解概念,并阅读比GOF书籍更多的内容。一个建议是阅读以补充GOF的概念。

我会说,无论何时,只要您选择基于解决一个问题的模式,而不是您的软件打算解决的所有问题

相反,试图过度设计一个解决方案来适应所有可能的最终用例可能会导致您使用一个过于庞大的设计模式来适应大多数用例


因此,遵循这一模式的理想模式/水平应该介于两个极端之间

什么使EJB变得容易困难(EJB)

当您的问题的模式错误时。

我可以想到很多设计模式可能会出错。GoF书解释了它所讨论的所有模式的问题、解决方案和缺点。 -模式是问题的解决方案。如果这个问题不是你的问题,那么它很可能会变成一个反模式。 -模式有缺点,您应该意识到它们。 -当你不需要的时候。一个模式可能意味着很多类,而您正试图解决将来可能遇到但尚未解决的问题。 -如果您不了解它是如何工作的,并且实现错误,那么它也会变成一个反模式。你会得到很多无用的类和代码。 -当你开始对它上瘾的时候。层次结构太深、polimorphism或singleton的不当使用等都会造成问题


可能还有其他原因…

一般来说,当程序员认为模式就像用积木来构建软件时,你会得到一些非常奇怪的代码。

设计模式只是一种命名和记录常见代码结构的方法。因此,您不应该得出所有模式都是好模式的结论。在记录设计模式(如GoF)方面做得很好的人总是在模式描述中包含一个部分,描述什么时候应该使用模式,什么时候不应该使用模式。因此,大多数设计模式书籍的一半要点是回答这样一个问题:“什么时候设计模式会让您的软件变得更糟糕?”

许多没有经验的开发人员从不费心学习适当的使用部分,最终在不合适的地方应用模式。我认为这是造成围绕设计模式的许多负面因素的原因


总之,这个问题的答案应该是:-去阅读设计模式,它会告诉你。

几十年来,程序员经常花费时间通过应用他们不理解的实践来使软件变得更糟糕,而不是学习为什么这种做法是好的。
当程序员把事情搞砸时,使用某些工具/关键字/框架会让他们觉得自己很老练。一些常见的例子:

  • 加入大量的try/catch/finally块会让程序员觉得他们有错误处理方案,而实际上他们没有
  • 用存储过程替换sql会让程序员觉得他们有一个数据访问层,神奇地提高了效率、可重用性和封装性,而实际上他们没有
  • 使用类使许多程序员相信他们正在从事面向对象的编程,而事实上他们并没有(或者只是触及OO的表面)
这个名单可能会永远持续下去。这种趋势一直存在,也将永远存在,因为我们人类总是寻找捷径。我们在模式中经常看到这一点,因为模式