【发布时间】:2009-01-21 19:08:00
【问题描述】:
我一直在听到和阅读人们遇到过度使用设计模式的案例。好的,误用的设计模式是可以理解的现象。过度使用的设计模式究竟意味着什么?
你有任何例子吗?为什么你认为模式太多?
【问题讨论】:
标签: language-agnostic design-patterns oop
我一直在听到和阅读人们遇到过度使用设计模式的案例。好的,误用的设计模式是可以理解的现象。过度使用的设计模式究竟意味着什么?
你有任何例子吗?为什么你认为模式太多?
【问题讨论】:
标签: language-agnostic design-patterns oop
singleton 可能是最多的overused design pattern。当它超出范围并且更适合直接实例化对象时,我经常看到它在许多情况下使用。
在那之后,我相信factory pattern 被过度用作实例化对象的快捷方式,很多时候并没有真正的需要。
【讨论】:
面向对象,它不再是一种设计模式,而是一种生活方式。我已经看到很多程序代码在对象和对象中被大量使用,因为时代精神说“大概你是面向对象的”,而几行 C 和结构也可以做到。
我认为它是最被过度使用的设计模式,因为它(可能)是最广泛使用的设计模式,而且它的优点很少受到质疑。
【讨论】:
我投票给 ActiveRecord。
许多流行的数据访问框架使用 ActiveRecord 作为唯一数据访问模式,这是一种万能的解决方案,尽管 Martin Fowler 的“企业应用程序架构模式”一书中描述了几种其他数据访问模式,并详细说明每种模式的优势以及如何决定何时使用每种模式。
【讨论】:
(有时)所谓的 JavaBeans-Pattern:每个字段的 getter 和 setter。 Highly questionable 并且非常普遍。
【讨论】:
我猜 Singleton 很容易被过度使用(尽管它确实有其合法用途)。
对单例模式的依赖称为Singletonitis。 :) 症状至少包括不必要的高耦合和测试变得更加困难。
编辑:作为 Singletonitis 的处方治疗方法,您可以尝试 Inline Singleton,Joshua Kerievsky 在 Refactoring to Patterns 中进行了描述。
编辑 2:有关单例的良好讨论,请参阅这个较早的问题:What is so bad about Singletons
【讨论】:
序言:一般来说,Singleton 被认为是最被滥用的模式,只是因为事实上许多人会使用它来编写内联编程,如果不是在现实中,而其他人用它来代替全局变量。
正文:有一本书叫“A Pattern Language”,比著名的 GoF 早几年。它要求在项目的不同方面使用相似的语言——它显然对“设计模式”产生了重大影响,并且了解这两种文本的人认为它更胜一筹。
我个人的经验是,GoF 仅在某些情况下有用,与涵盖所有 OOP 相去甚远。实际上,我觉得很有趣的是,其中一些模式在其他语言中已经过时,而其他模式只是在重复描述相同的场景(适应和翻译的东西之间真的有那么大的区别吗?)
一般来说,模式是一件好事。单例通常使用静态 getInstance 方法很好。许多 MVC 结构使用类似的命名约定是好的。另一方面,模式不是一切,需要记住。
【讨论】:
单例模式,仅适用于极少数情况,使测试更加困难。它不仅被过度使用,而且在 Java 和 C# 中的实现通常很糟糕 - 人们经常在它不仅不合适而且相对难以正确时急于进行双重检查锁定。
编辑:我真的应该意识到每个人都会发布相同的内容。
下一个例子,工厂模式,特别是它在 Java DOM API 中的使用。布莱赫。
【讨论】:
我会说Singleton 被过度使用了。通常有比使用本质上是全局变量更好的解决方案。
【讨论】:
我要权衡一下过度使用的 Singleton。很多时候,开发人员只学习这一种模式并在静态类同样有效时使用它。
【讨论】:
我认为比过度使用设计模式更严重的问题是,热心的开发人员误用了模式,他们最近学习了一种新的模式工具并决定需要尝试一下。最近我一直在阅读 Misko Hevery 的一些关于依赖注入的博客 (http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/) 条目。他的主要主张之一是,作为全局实例实现的单例模式严重限制了可测试性,应该避免。
几天前,我从 Christian Gruber 的博客中读到了一篇关于模式的有趣观点。他建议它们作为讨论架构的工具很有用,但不应在设计概念期间使用,以免软件架构恶化为他所谓的“数字绘画”。请参阅有关设计模式的段落:http://www.geekinasuit.com/2008/12/testability-re-discovering-what-we.html。
因此,设计模式的问题可能是误用和视野狭隘,这是由于认为所有设计良好的软件都必须符合“四人组”中描述的模式之一。
【讨论】:
这实际上是由我们唯一的 Jeff Atwood 在 Coding Horror 中讨论的:
【讨论】:
我经常看到在只有一个提供者的情况下使用提供者模式。这似乎是一大堆额外的工作,没有任何好处。
【讨论】:
我也投票给 Singleton:抽象服装的全球化。
还有工厂,因为这样可以更容易地不去考虑在给定程序中对象是如何连接在一起的。
【讨论】: