设计模式何时成为问题而非解决方案?

57
我从未在需要使用设计模式的软件上工作过。根据保罗·格雷厄姆(Paul Graham)的Revenge of the Nerds文章,设计模式是缺乏抽象的迹象。
直接引用他的话,“例如,在OO世界中,你会听到很多关于‘模式’的内容。我想知道这些模式是否有时不是(c)情况下人类编译器正在工作的证据。当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性都是一个迹象,至少对我来说,表明我使用的抽象不够强大--通常是我手动生成某个宏的扩展所需写入的。”
我只是想知道每个人是否认为设计模式被过度使用,并且是代码抽象不足的症状。
26个回答

1

我宁愿使用过多的模式,也不愿意完全没有。当然,正确的平衡是目标。


1
那个句子没有意义:设计模式是缺乏抽象的标志,因为设计模式本身就是一种抽象!阅读这里的回答后,我同意编程语言应该有一种表达设计模式的方式。然而,这显然不可能适用于每一种情况。

0
我记得曾经看过一篇关于GoF的采访,其中有人问到常见的说法,即设计模式是用来替代语言缺失功能的工具。作者认为:A)任何语言都有设计模式(虽然不同),因为设计模式是为了解决语言特性而构建的工具;B)通过向语言中添加更多功能来消除对设计模式的需求是不可行的。

哇...一项可行性研究得出了“不可行”的结论?我原以为这种结论不存在的 ;) - Jason Punyon
设计模式是用来解决语言特点的工具。这就意味着GoF模式仅限于Java和类似语言(如C#)。对于其他语言,可能存在可识别的模式,但不会完全相同。我很想不再听到旧观念的新名称! - Javier

0

设计模式是解决常见问题的方案。

但首先,您需要知道问题是什么或在哪里。这就是人们未能正确使用模式的关键点。


0

我也还没有在我的代码中找到使用GoF“设计模式”的用途。程序员似乎已经掌握了GoF的书籍,并且现在大多数公司都希望你知道它们并应用它们。就在今天,我参加了一次面试,被问及我知道和使用哪些模式,以及如何将它们应用于一家大型银行的企业应用程序。

从我们以前的项目中学习的通用想法显然是有道理的。不合理的是特定的GoF模式周围的炒作和崇拜,人们将它们误认为是良好编码实践,并期望你喜欢并接受它们,以便被称为胜任的开发人员。

所以回答你的问题,我会说GoF设计模式的想法被大多数人误解和过度使用。我们需要成熟地进入更高级别的设计模式使用,作为一种适用于我们学习和改进面向对象编程的一般学习工具,而不仅仅是20个饼干切割器的想法来记忆和强制执行程序。没有万能药。


0

编程语言和口语一样,为您提供了表达任何想法的词汇。模式只是描述了一种表达方式,使人们能够在更高的层次上理解您所说的内容。

如果您容许我使用一个比喻:创作音乐是一个常见的“问题”,而音乐通常(显然并非总是)松散地组成为以下某种变体:

副歌 合唱 副歌 合唱 副歌 合唱 合唱

这确实是一种“模式”。但您仍需要写出这首歌曲,并不是每首歌都适合使用这种模式。

我试图表达的观点是,模式并不是编程或音乐的即插即用解决方案。它们是指导您入门的指南,也是您可以从中获得灵感并制作出符合您需求的东西的跳板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接