【问题标题】:What is the most underused or underappreciated design pattern? [closed]什么是最未被充分利用或被低估的设计模式? [关闭]
【发布时间】:2010-03-04 21:31:28
【问题描述】:

我最近阅读了很多关于设计模式的文章,其中一些可以让我们的生活变得更轻松,而其中一些似乎只是让事情变得复杂(至少对我来说是这样)。我很想知道每个人都认为哪些设计模式未被充分利用或被低估。有些模式很简单,许多人甚至没有意识到他们正在使用一种模式(装饰器可能是最常用的,但没有意识到)。我的目标是让我们模式新手了解一些更复杂或未知的模式以及为什么我们应该使用它们。

【问题讨论】:

  • +reopen:完全有效的问题,也是一个有用的问题。如果您不想看到主观问题,请将“主观”标签添加到您的忽略列表中。
  • 如果有人将其设为社区 Wiki,我将投票开放。 Rob,您可以编辑问题并将其设为“社区 Wiki”吗?
  • 我投票结束这个问题,因为它似乎是一个民意调查而不是一个实际问题。

标签: design-patterns


【解决方案1】:

对于新手来说最重要的“模式”是

  • 保持简单
  • 了解为什么所谓的良好做法是好的,这样您就可以判断它们是否适合特定情况。
  • 您必须平衡针对某种情况的相互竞争的关注点,而不仅仅是考虑一个问题。 (解耦 v. 凝聚力,测试健全性 v. 完整性,良好实践 v. 时间)

具有很酷名称的正式模式而言,我认为审查专注于接口的模式很有帮助,因为它可以帮助您从依赖关系和契约的角度思考,而不仅仅是对象。或者正如鲍勃叔叔(马丁)所说,依赖于抽象,而不是具体化。所以我的答案是:

参见Dependency Inversion PrincipalSOLID Principals 之一(我相信您已经分析过了)。仔细看,DI is very simple 虽然它经常过于复杂。我相信在更广泛的背景下看待它也很重要,这是一种思考设计的每个级别和部分的方式,而不仅仅是以某种方式排列的代码。

一个小小的警告。我认为一些模式新手对模式过于狂热,并且认为代码不是好的,除非它实现了一个模式,并且一个模式使一个解决方案变得很好。他们有时会关注模式而损害其他良好的 OOP/D 实践。这是个错误。 Solid先生本人explains this here

【讨论】:

    【解决方案2】:

    代码越少越好。

    【讨论】:

    • 根据 joel ... 是的 ... 但更少的代码也不意味着不可读的代码 ..
    • 并不总是更好。更简单(几乎)总是更好,但更少的代码不一定更简单。有时,良好的封装和关注点分离可能会导致更多的代码行,尽管这会增加整体的简单性。
    • 我不完全同意这一点,我认为更短的方法更好,但是如果将所有内容都塞进一行,而将其作为一个块更容易阅读,那么更少的代码并不是更好。跨度>
    • “更简单的代码就是更好的代码”怎么样?
    • 代码越少越好。编码中最难的部分是阅读开发人员的代码。您必须阅读的代码越少,代码就越容易理解。 i = i + 1 是有原因的;不如i+=1;或 i++;
    【解决方案3】:

    我是蒙特卡罗单元测试的忠实粉丝。许多非常复杂、高效的算法极难测试,因为有很多不同的代码路径和边缘条件。如果存在一种与您的复杂算法执行相同操作的简单算法,或者甚至是一种简单地进行不同权衡的算法(例如哈希表与平衡树),您可以生成大量随机输入,并将其提供给朴素高效的算法,并确保结果匹配。我以这种方式发现了大量奇怪的边缘案例错误,否则这些错误几乎是不可能找到的。

    【讨论】:

      【解决方案4】:

      前几天我实现了策略模式,它用于封装方法,而不是在运行时交换。有点像命令模式,但更解耦。

      这就是我使用它的方式。我必须将文件发送给第三方,我有几个选项可供选择,我有 FTP、SFTP、FTPS 和 SMB。

      界面:

      interface ITransferStrategry
      {
          void TransferFiles(System.Collections.Generic.IList<string> files);
      }
      

      实施:

      public class FTPTransfer : ITransferStrategry
      {
      
          public void TransferFiles(IList<string> files)
          {
              // Transfer to FTP Code Here
          }
      
      }
      

      上下文:

      public class TransferContext
      {
      
          private ITransferStrategry _strategy;
      
          public TransferContext(ITransferStrategry strategy)
          {
              this._strategy = strategy;
          }
      
          public void Send(IList<string> files)
          {
              this._strategy.TransferFiles(files);
          }
      
      }
      

      客户:

      public void Client()
      {
         TransferContext context = new TransferContext(new FTPTransfer());
         context.Send(files);
      }
      

      它非常容易维护。希望这对任何人都有帮助。

      【讨论】:

      • 我无法区分抽象工厂。
      • 我喜欢这种模式。 +1 对于我可以使用的东西。
      • 这种模式更直接。使用抽象工厂,您可以提供一个接口来创建层次结构或系列,也就是各种相关或不独立的方法,而无需指定它们的具体类。
      【解决方案5】:

      常识和效率可以代替所有的设计模式。

      编辑:看到评论者没有明白我的意思......

      我想说的是,与其记住所有的设计模式并用这些术语思考,不如简单地思考一下问题,然后根据常识和你的经验,以一种高效而优雅的方式解决它.很有可能,您会想出一种或多种这些设计模式。但是您无需提前了解它们即可使用它们。无论如何,我永远无法掌握记住这 20 多种模式的名称,并记住每个名称所代表的含义。

      【讨论】:

      • 真的吗?我认为我不能同意这一点...
      • 使用“模式”背后的想法是减少重新发明的数量。不过, 需要常识来检测何时使用或不使用模式。
      • 技术上正确但完全具有误导性。你可以对算法说同样的话,或者说只要你有基本的逻辑原理,那么你就不需要学习数学,因为你可以根据需要进行计算。设计模式可能会被滥用,但抽象出共性而不是重新发明轮子的概念在任何领域都极为重要。
      • 我对此表示同情,但不同意。我厌倦了一切都是一种模式,厌倦了人们思考特定模式而不是真正考虑情况。我很生气新手想要跳过艰苦的 OOP/D 思维并直接进入模式。但是,它们确实有一个很好的地方,可以作为初学者的轻读物,以及尝试进入高级的中级。但是,如果初学者要阅读 Code Complete 或 Patterns 书籍,Code Complete 是一个简单的选择。
      • @Patrick Karcher:你不同意我的回答还是 cmets 不同意我的回答?
      【解决方案6】:

      余额

      我的意思是,有各种各样的模式和准则,但都可能被过度应用,从而导致反模式效应。

      什么如何应用已知实践的经验伴随着你写的每一行,你与其他程序员的每一次讨论,以及每一次阅读来自有想法的人的文章不同。

      【讨论】:

      • +1。不是真正的模式,但在我看来它更重要。如果他们不称重和评估,就没有准备好接受模式。
      • 是的。它会阻止另一个关于例如的问题。单身...
      【解决方案7】:

      最未被充分利用的设计模式是....所有这些。如前所述,许多使用设计模式的人并没有正确地判断利弊。我还发现“为什么这么关注模式的细节?我不需要知道名字”的论点被越来越多的人抛出,但这两者都远远超过了不使用或不思考的人关于设计模式。

      Y-Combinator 刚刚发布了此链接,指向免费的大学计算机科学讲座页面 - http://lecturefox.com/computerscience/ - 许多高级主题,但没有一个关于 OOP 或设计模式的主题。

      【讨论】:

        【解决方案8】:

        一流的功能。

        【讨论】:

        猜你喜欢
        • 2010-11-07
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多