直接引用他的话,“例如,在OO世界中,你会听到很多关于‘模式’的内容。我想知道这些模式是否有时不是(c)情况下人类编译器正在工作的证据。当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性都是一个迹象,至少对我来说,表明我使用的抽象不够强大--通常是我手动生成某个宏的扩展所需写入的。”
我只是想知道每个人是否认为设计模式被过度使用,并且是代码抽象不足的症状。
设计模式被定义为以下内容(来自维基百科,但我也在一些书中看到了相同的内容)
在软件工程中,设计模式是解决软件设计中常见问题的通用可重用方案。设计模式不是可以直接转换为代码的完成设计。它是描述或模板,用于解决可以在许多不同情况下使用的问题。
如果你从一开始就应用设计模式而没有深入了解问题域,可能会导致问题。将设计模式用作指南或提示来解决问题。强制应用设计模式肯定不能提供足够抽象的解决方案。通常在企业软件中使用几种设计模式的变体或组合..有点像杂交。如果你说你从未使用过设计模式,那么你会很高兴知道像 foreach 循环实际上是一个迭代器模式,并且你可以在你身边寻找更明显的实现!
当我使用LISP编程时,我根本没有使用GoF设计模式,因为它并不适用于我所编写的程序。现在我正在使用C#进行编程,并且经常遇到一些情况,其中设计模式实际上可以简化正在编写的程序。
万物皆有时,万事皆有处。我见过代码中使用了太多的模式,这会支持你的观点,但也有可能出现模式不足的情况,使得代码难以维护,在进行更改时容易出错。
像这样概括性地说是有逻辑缺陷的,但如果你将问题重新表述为“在代码中是否存在过多的模式,这表明了一个更大的问题,即缺乏足够的抽象层次”,那么答案就是肯定的。但并不总是这种情况。
如果没有“问题”的背景,我们无法确定设计模式是否是解决方案。
没有必要使用设计模式——你总是可以编写忽略到目前为止所学习的所有编码知识的代码——它甚至可能会工作。但是设计模式可以使事情变得更加容易,为你提供了一个共享的语言来讨论设计。
设计模式并不代表过于少的抽象——它们试图增加抽象级别。你可以说“这一部分是访问者”,而不是“这里是一些递归遍历对象树,在其上执行某个操作的代码。”
如果模式不是解决方案,那么它们就是问题。我指的是:如果引入模式只是为了模式而不是为了解决应用程序中真实存在的设计问题,那么它很可能会导致问题而不是解决或预防问题。
我一直告诉同事们,在工作中《设计模式:可复用面向对象软件的基础》这本四人组的书是参考书,而不是好设计的手册。
是的,pg就在那里。如果你在整个应用程序中看到类似的代码,那么这意味着你缺少对该代码的抽象。更少的代码更好。
这里有另一篇关于这个主题的文章:http://blog.plover.com/prog/design-patterns.html