【问题标题】:Can anybody give me an example of overused design patterns?任何人都可以给我一个过度使用的设计模式的例子吗?
【发布时间】:2009-01-21 19:08:00
【问题描述】:

我一直在听到和阅读人们遇到过度使用设计模式的案例。好的,误用的设计模式是可以理解的现象。过度使用的设计模式究竟意味着什么?

你有任何例子吗?为什么你认为模式太多?

【问题讨论】:

    标签: language-agnostic design-patterns oop


    【解决方案1】:

    singleton 可能是最多的overused design pattern。当它超出范围并且更适合直接实例化对象时,我经常看到它在许多情况下使用。

    在那之后,我相信factory pattern 被过度用作实例化对象的快捷方式,很多时候并没有真正的需要。

    【讨论】:

    • +百万工厂。我见过人们使用工厂方法在 ASP.NET 表单上创建文本框。
    • PS:它是实例化,而不是实例化。 instance是名词,instantiate是动词形式。
    • P.P.S.由于我们处于迂腐的潮流中,因此“创建”可能比实例 (v) 和实例化都要好 :-)
    【解决方案2】:

    面向对象,它不再是一种设计模式,而是一种生活方式。我已经看到很多程序代码在对象和对象中被大量使用,因为时代精神说“大概你是面向对象的”,而几行 C 和结构也可以做到。

    我认为它是最被过度使用的设计模式,因为它(可能)是最广泛使用的设计模式,而且它的优点很少受到质疑。

    【讨论】:

      【解决方案3】:

      我投票给 ActiveRecord。

      许多流行的数据访问框架使用 ActiveRecord 作为唯一数据访问模式,这是一种万能的解决方案,尽管 Martin Fowler 的“企业应用程序架构模式”一书中描述了几种其他数据访问模式,并详细说明每种模式的优势以及如何决定何时使用每种模式。

      【讨论】:

      • 无论如何它都会被映射到 SQL,很明显它没有充分利用可用于处理数据的表达能力。
      【解决方案4】:

      (有时)所谓的 JavaBeans-Pattern:每个字段的 getter 和 setter。 Highly questionable 并且非常普遍。

      【讨论】:

        【解决方案5】:

        我猜 Singleton 很容易被过度使用(尽管它确实有其合法用途)。

        对单例模式的依赖称为Singletonitis。 :) 症状至少包括不必要的高耦合和测试变得更加困难。

        编辑:作为 Singletonitis 的处方治疗方法,您可以尝试 Inline Singleton,Joshua Kerievsky 在 Refactoring to Patterns 中进行了描述。

        编辑 2:有关单例的良好讨论,请参阅这个较早的问题:What is so bad about Singletons

        【讨论】:

        • 我以为单身人士是单身人士的炎症。上瘾肯定是单身狂吗?这里的一些海报是单身恐惧症。
        【解决方案6】:

        序言:一般来说,Singleton 被认为是最被滥用的模式,只是因为事实上许多人会使用它来编写内联编程,如果不是在现实中,而其他人用它来代替全局变量。

        正文:有一本书叫“A Pattern Language”,比著名的 GoF 早几年。它要求在项目的不同方面使用相似的语言——它显然对“设计模式”产生了重大影响,并且了解这两种文本的人认为它更胜一筹。

        我个人的经验是,GoF 仅在某些情况下有用,与涵盖所有 OOP 相去甚远。实际上,我觉得很有趣的是,其中一些模式在其他语言中已经过时,而其他模式只是在重复描述相同的场景(适应和翻译的东西之间真的有那么大的区别吗?)

        一般来说,模式是一件好事。单例通常使用静态 getInstance 方法很好。许多 MVC 结构使用类似的命名约定是好的。另一方面,模式不是一切,需要记住。

        推荐阅读: http://perl.plover.com/yak/design/

        【讨论】:

        • 很好的参考资料。我将 Christopher Alexander 的模式和 GoF 模式之间的区别视为描述需求和描述实现之间的区别。
        • 我在开始真正阅读 GoF 的同时遇到了它,它给了我一个非常受欢迎的视角。
        【解决方案7】:

        单例模式,仅适用于极少数情况,使测试更加困难。它不仅被过度使用,而且在 Java 和 C# 中的实现通常很糟糕 - 人们经常在它不仅不合适而且相对难以正确时急于进行双重检查锁定。

        编辑:我真的应该意识到每个人都会发布相同的内容。

        下一个例子,工厂模式,特别是它在 Java DOM API 中的使用。布莱赫。

        【讨论】:

        • 我第一次看到一个名为SomethingFactoryFactory 的Java 类时,我还以为是个笑话。唉...
        • 我还没有看到一个糟糕的 C# 实现,因为他们都在使用你的代码 Jon yoda.arachsys.com/csharp/singleton.html。其实这是一个谎言,我见过一个没有使用任何锁定机制的 C# MVP
        • @Chris:我见过根本没有锁定的人,以及使用没有 volatile 修饰符的双重检查锁定的人。在 Java 中太常见了……希望这篇文章能产生一些影响 :)
        【解决方案8】:

        我会说Singleton 被过度使用了。通常有比使用本质上是全局变量更好的解决方案。

        【讨论】:

          【解决方案9】:

          我要权衡一下过度使用的 Singleton。很多时候,开发人员只学习这一种模式并在静态类同样有效时使用它。

          【讨论】:

          • 如果我使用像 Objective-C 这样没有静态类的语言怎么办?
          【解决方案10】:

          我认为比过度使用设计模式更严重的问题是,热心的开发人员误用了模式,他们最近学习了一种新的模式工具并决定需要尝试一下。最近我一直在阅读 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

          因此,设计模式的问题可能是误用和视野狭隘,这是由于认为所有设计良好的软件都必须符合“四人组”中描述的模式之一。

          【讨论】:

          • 尝试模式没有错;最好的学习方式是边做边做。但它应该在一次性代码上完成,而不是作为实际需要部署的项目的一部分。
          【解决方案11】:

          这实际上是由我们唯一的 Jeff Atwood 在 Coding Horror 中讨论的:

          http://www.codinghorror.com/blog/archives/000380.html

          【讨论】:

            【解决方案12】:

            我经常看到在只有一个提供者的情况下使用提供者模式。这似乎是一大堆额外的工作,没有任何好处。

            【讨论】:

              【解决方案13】:

              我也投票给 Singleton:抽象服装的全球化。

              还有工厂,因为这样可以更容易地不去考虑在给定程序中对象是如何连接在一起的。

              【讨论】:

                猜你喜欢
                • 2012-06-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-02-27
                • 2020-03-21
                • 2012-01-10
                相关资源
                最近更新 更多