【问题标题】:When to include a design pattern name in class name?何时在类名中包含设计模式名称?
【发布时间】:2014-04-18 16:37:31
【问题描述】:

在我上一个项目中,我注意到在类名中包含设计模式名称非常方便。例如:

  • ContextLazyFactory
  • RunOnceMediator
  • 第三方调解员
  • MyProjectCliFacade
  • 二进制门

它使项目易于阅读。额外的好处是您不会使用自己的名称,例如“RunOnceManager”、“ContextDelayedConstruction”、“ThirdPartyInterface”等,这些名称可能仅对作者具有尖锐的意义。另一方面,我不希望在 STL 中看到像 vector_container 这样的类。你觉得怎么样?

我目前对这个主题的看法是:作为类层次结构中重要节点的类应该在其名称中包含其设计模式,以强调层次结构并使项目更易于阅读。

【问题讨论】:

    标签: design-patterns


    【解决方案1】:

    在很多情况下对我来说似乎很自然:

    • 命名设计模式是为了解释它们的作用
    • 类被命名以解释它们的作用

    如果用设计模式术语来解释一个类的目的最简单的方法,为什么不使用它呢?

    另一方面,当设计模式主要是偶然时,则排除它。例如,一个类可能恰好是一个单例,但这不是它在生活中的主要目的,所以我不希望在名称中看到“单例”。将其与主要目的是成为其他对象的工厂的工厂进行比较 - “FooFactory”非常有意义。

    【讨论】:

    • 投反对票的人:请提供评论以解释您在投反对票时不同意答案的原因。
    • @Jon 在这种情况下,我认为可以公平地假设反对者对将其放在名称中或根本不放在名称中感到强烈,无论哪种情况,我都不认为您可以做很多事情该信息(除了对此进行长时间的讨论)。
    • 解释他们对哪一个有强烈的感觉将是一个开始:)
    【解决方案2】:

    我同意你的看法。我唯一要添加的(不用说真的)是确保类名中的模式名称确实使用实际使用的模式。

    我曾经看到一个名为 XxxxFactory(或类似的东西)的类,它与工厂模式一点也不相似!

    【讨论】:

      【解决方案3】:

      我还在类名中使用设计模式名称,以提高可读性并易于其他人理解。

      Vectors 对我来说已经是一个集合,所以不需要 _collection。顺便说一句,容器不是设计模式。

      【讨论】:

        【解决方案4】:

        如果生成的名称足够清晰,请继续使用它。

        但在某些情况下,生成的名称要么笨拙,要么含糊不清。在这种情况下,请使用最恰当的名称。

        【讨论】:

          【解决方案5】:

          我认为在名称中使用设计模式是一个的想法。例如,在我的一款游戏中,我有:

          GameLevelAbstract
          InGameArea
          MainMenu
          

          后两个类(InGameArea 和 MainMenu)子类 GameLevelAbstract 并实现它的纯虚方法。我可以在我的源视图中看到该类是抽象的,并且立即知道它是或不是我正在寻找的。​​p>

          另一个例子是我的图形外观:

          GraphicsFacade
          OpenGLGraphics
          DirectXGraphics
          

          与我上面的设置完全相同,只是它处理图形。

          我发现在寻找课程时使用名称中的设计模式非常有用且信息丰富。我确实认为某些东西不应该在名称中使用,例如 Singleton,但是 Flyweight、Factory 或 Facade 是我认为非常适合用于实现这些模式的类的名称的设计名称示例。

          我认为如果你使用好的类名来帮助程序员一目了然地掌握你的类的功能是一件好事。

          在大多数情况下,我认为陈述某物是数据结构或算法并不是一件好事。 “LinkedListDataStructure”或“BubbleSortAlgorithm”并没有增加程序员对类的理解,因为“LinkedList”在它的功能上是显而易见的。

          【讨论】:

          • +1 我也喜欢将“abstract”放在抽象类的类名中。标准的 .NET 命名约定是“MyClassBase”,但我更喜欢“AbstractMyClass”
          • “LinkedListDataStructure”或“BubbleSortAlgorithm”并没有增加程序员的理解力。也完全同意这一点。类的名称是其接口的一部分,接口不应该像这样宣传实现细节。可惜我不能+2你;)
          • 我不喜欢基类名称中的Abstract,因为当我看到X 派生自Y 时,我认为X 是一个类型 of Y(例如,DogAnimal 的类型,而不是 AbstractAnimal)。尽管AbstractY 类型的变量是一个抽象引用,但它并不指向抽象的东西。
          【解决方案6】:

          至少有一个缺点:如果由于某种原因类在重构后不使用该模式,则必须重命名它或使用错误名称的类。

          【讨论】:

          • 同意,但设计模式会指示对象的行为。如果重构后对象的行为方式不同,那么它可能应该是一个新类...
          【解决方案7】:

          将设计模式名称添加为类名真的很好。这使代码更容易理解。类名应该是有意义的,并且应该反映类的功能。当在类名中添加模式名称时,它增加了可读性,因为它也反映了用于设计类的技术。我更喜欢这种类型的类名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-26
            • 2011-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-25
            • 2014-11-04
            相关资源
            最近更新 更多