设计模式批评来源

时间:2010-10-21 18:54:55

标签: design-patterns

我正在阅读维基百科上的design patterns页面,特别是“批评”部分。

你能指点我一些关于设计模式缺点的文章或书籍吗?

7 个答案:

答案 0 :(得分:29)

我所遇到的大多数对设计模式的批评都与对他们认为只是良好的面向对象实践的结构和标签的厌恶有关。大多数模式归结为编程到接口,以及其他SOLID principles。我们的感觉是,当我们教授模式时,我们会让开发人员,特别是初级开发人员尝试将所有问题都塞进他们所学习的模式集中,与他们采用更“直接”的方法相比,这会产生更多迟钝和麻烦的问题。

我倾向于同意这样的观点:一旦你开始学习模式,你就会过度使用它们,但是,通常你会很快离开那个阶段,然后进入一个更高效和专业的软件职业。

作为奖励,here is a bit of mild criticism from Jeff Atwoodsome critical insights from Mark Dominus

答案 1 :(得分:4)

对设计模式的一个大批评是关于一些设计模式到底有多“通用”。例如,策略模式实现似乎在缺少lambda / first-class函数的语言中更具相关性(和复杂性)(比较Java与Ruby,甚至与C#“功能”方法相比,here )。

但我认为这个论点并不否认设计模式确实存在这一事实,并且它们是一种非常好的,与语言无关的理解描述的方式软件架构。即使某些设计模式在某些语言中具有更容易的实现,或者直接支持某些语言,它仍然成立。

当然,我也同意许多企业设计模式不适合纯函数式语言。但我也相信功能世界也有自己的一套设计模式(如Monad)。

答案 2 :(得分:4)

Alan Kay本人对模式非常关键,因为他不相信软件应该如此大肆吹嘘。 Here's a 2012 Dr. Dobbs interview with Kay

  

“关于编程的最灾难性的事情 - 选择10个最糟糕的编程方式之一 - 这是一个非常流行的基于模式语言的运动。当克里斯托弗亚历山大第一次在建筑学中做到这一点时,他正在寻找2000年的方式人类已经让自己感到舒服了。所以实际上有一些东西,因为他正在处理一个没有那么大变化的基因组。我认为他从中获得了几百个有价值的模式。但是试图做的错误计算中的假设是我们对编程一无所知。因此,从今天的编程实践中提取模式会以一种他们不应得的方式使它们高贵。它实际上给了它们更多的标记。“

答案 3 :(得分:3)

设计模式通常表示为特定编程语言(通常是Java或C ++)中的一组技巧。通常不解释何时以及为什么需要使用模式,以及何时最好不使用它。通常没有解释在完全不同的编程语言中会发生什么。

因此,人们会产生这样一种印象,即1)设计模式来自天空,由天才发明,2)GoF书籍需要记忆,3)模式需要始终在各种情况下应用。

在我看来,设计模式是高度语言特定的(LISP有一套完全不同于Java的“设计模式”)和特定问题(取决于项目,你使用或不使用模式,即使它是“理论上”适用于您的代码中的这个地方)。 GoF书籍是Java语言手册的有用伴侣,但不是一套关于“一般编程”的永恒原则。

答案 4 :(得分:2)

大约十年前,设计模式大肆炒作;在我看来,大多数批评都是关于开发应用程序并应用你能想到的所有模式。当你把咆哮因素拿出来时,激烈的争论是非常无聊的 - 是的,太多的东西都不好,对于没有经验的程序员来说,锤子上的东西看起来像钉子一样。

有时候,有人会发现他一直在做的事情有一个名称和评论,它不值得拥有一个名字(错过了设计模式有关命名有时显而易见的事情的点,以便你可以谈谈他们。)

除此之外,你基本上留下了这样一个事实,即某些语言内置了一些模式,而另一些则没有,以及关于如何随着时间推移某些模式成为编程语言功能的学术争论。

除此之外,我还没有看到有关设计模式的有效批评。它们肯定存在,有时它们很有用,当有人在凌晨3点叫醒你时,你不必知道所有这些,这就是它。 :)

答案 5 :(得分:0)

我经历了GoF书出版的那段时间(大约在1995年),我记得阅读过的一个主要推动力(或者至少是引起如此多关注的原因)是,对于大多数开发人员而言,OOD仍然是新事物。根本不了解如何制作对象。

所以这本书问世了,展示了一些常见的上课模式以及它们如何协同工作。

因此对此提出批评:它现在可能不像当时那样重要。那时,以及之后的几年中,框架(尤其是Java)的框架数量不如后来的框架。现在,您可以找到许多优秀的面向对象代码的示例。如果有一些作者把非常好的OO代码库的快照放在一边,写一本关于为什么他们认为它们如此出色的书,那会不会很好呢?

对我来说,这些模式的最佳用途是在看到它们时就知道它们,了解它们的缺点(请参阅“访问者模式”,并注意系统的哪些部分更容易扩展),并在撰写本文时吸取这些教训您自己的代码。

答案 6 :(得分:-1)

我确信设计模式有助于构建有关编程技术的教育课程,但我认为它们不会成为软件行业的通用语言。它们可以反作用,作为一种沟通设计的方式,因为它们迫使设计符合既定的模式,它们允许设计过于随意地描述,并且它们迫使任何试图理解设计的人阅读有关设计模式的书。