【问题标题】:Is there a best way to handle naming fads?有没有最好的方法来处理命名时尚?
【发布时间】:2009-02-09 00:13:05
【问题描述】:

在过去的一年和我团队代码库的一些工作中,我注意到命名约定的稳步发展。

例如,有很多类被命名来表达它们是一个可以帮助你做某事的类。

这是我发现的:

MyClassUtil
MyClassFactory
MyClassHelper
MyClassManager
MyClassService

在我看来,随着时间的推移,人们会为相对相同的事物提出命名约定,因此您最终会得到一个包含所有约定的代码库,而不是以一致的方式命名所有内容。所有新东西都是根据最新的时尚命名约定命名的,因此您几乎可以通过当时流行的约定来判断一段代码的时代。

处理这种倾向的最佳方法是什么?真的有问题吗?随着这些命名时尚的流行,人们应该使用最新的时尚吗?是否应该使用新的命名约定重命名所有现有项目?还是应该接受这种多样性是不可避免的?

【问题讨论】:

    标签: naming-conventions fad


    【解决方案1】:

    它们看起来不像是时尚......所有这些名称都暗示了课程的目的,而且这些目的是不同的。对于编程,一切都在名称中,应该非常谨慎地选择它们。品种不需要逃避。名称不同,因为类的用途不同。

    MyClassUtil - 一些与 MyClass 一起工作的实用程序,但它没有附带。也许 MyClass 属于您正在使用的库,但您经常使用一些更高级别的函数,您需要在某个地方放置它们。

    MyClassFactory - 以抽象的方式创建 MyClass 的实例。这允许您编写需要 MyClass 实例的代码。它可以从 MyClassFactory 中获取这些新实例。这将允许工厂在未来进行修改以提供 MyClass 的不同特定实现。也许在单元测试下,工厂只是提供虚拟/模拟 MyClasses。这意味着可以测试使用工厂的类而无需更改它,只需更改工厂,然后您就可以隔离正在测试的类。

    MyClassHelper -好吧,我可能同意,也许这可以更具体。它对 MyClass 有帮助,但又是什么。也许这有点类似于 MyClassUtil。但是,MyClassUtil 可能是与 MyClass 一起使用的通用函数,而帮助程序使用 MyClass 的特定实例进行初始化,然后可以对该实例执行操作。您需要为每个要帮助的 MyClass 提供一个新的助手。

    MyClassManager - 也许这处理 MyClass 实例池并存储或编排它们。例如。在 CommunicationsManager 中,该类将处理连接在一起的类,这些类处理与以太网或串行等端口或连接的通信,以及一个处理通过它发送的通信协议以便它可以传输数据包的类,以及一个处理这些数据包中的消息。

    MyClassService - 服务可以为您做事,例如给定邮政编码将其转换为网格参考。通常一个服务可以解决很多具体的事情。对于邮政编码示例,此类可能具有可以与不同网站对话以进行转换的实现。

    【讨论】:

    • 优秀的答案。我必须承认我并不完全相信它们是时尚......但我的脑海中有一个挥之不去的疑问......因此问题。只要我知道每个名字都有不同的具体含义,我就可以使用它并更好地命名我创造的东西。
    • 无论命名是否正确,至少有人在公共类中抛出公共代码。
    【解决方案2】:

    您在上面给出的所有类的名称都向我表明与面向对象原则的明显背离。无法说明“MyClassUtil”或“MyClassService”的作用。它可以是任何东西。类命名应该是具体的,并且应该清楚地传达类的实际功能。这些都没有。处理这种倾向的最好方法是复习面向对象的编程技能并相应地命名类。

    现在,这些示例可能在应用程序架构中指出了这些类所代表的功能,而您对“MyClass”的使用只是在运行时更明确的占位符,在这种情况下,我会不要将这些视为命名时尚,而是将其视为类本身功能的描述性指标,并带有应用程序底层架构的松散暗示。

    【讨论】:

    • 那么不同的命名约定在什么情况下适用。什么时候应该使用 Helper、Manager 和 Service?
    • 再一次,这完全取决于应用程序的编程架构。当您需要将域业务对象的架构支持与业务对象本身区分开来时,可以使用后缀。
    【解决方案3】:

    如果这很普遍,团队需要花一些时间研究 OO 设计:阅读备受推崇的 OO 框架的源代码、有关设计模式的书籍或 Evans “领域驱动设计”等书籍。

    “Util”和“Manager”通常是糟糕设计的症状——“代码味道”。在它根深蒂固的特殊上下文(Rails 应用程序)之外的“Helper”也是如此。

    “工厂”和“服务”具有精确的技术含义,您可以检查代码是否符合这些设计模式。

    一般的补救措施是与团队坐下来,明确讨论您期望从这些命名方案中获得哪些好处,哪些有意义,哪些没有意义,然后在接下来的几个月内应用重构技术逐步淘汰你们都认​​为是代码气味的名称。

    命名很重要。不能掉以轻心,也不是主观的事情。诚然,对于给定的命名问题,通常有不止一个正确答案。然而,很少有很多答案与之前的选择一致,这是关键。

    【讨论】:

    • 很棒的答案...这确实帮助我更好地理解了事情。到目前为止,这个答案帮助我学到了最多的东西。谢谢!
    • 出于兴趣,您能推荐一些备受推崇的 OO 框架吗?在我看来,我正在考虑我经常使用的开源工具……比如 NHibernate 或 Mono。很多人都在使用这些,这是他们受到尊重的标志,还是有良好的 OO 设计模型?
    • OO 不是关于框架,而是关于设计。当一个工具被许多人使用时,这意味着许多人发现它对某个目的有用,但它并没有说明该工具是否促进了良好的设计。 (嗯,依赖注入框架促进了良好的设计。例如 Guice。)
    • 当我编写“备受推崇的框架”时,我想到了 MVC 的 Smalltalk 实现——我最仔细地研究了 Dolphin,但存在其他变体——以及 Java 核心库。随着时间的推移和多次重新实现保持稳定。
    【解决方案4】:

    建议将名称重命名为更好的名称并重构代码,以便每个类都有一个清晰的responsibility。要知道使用什么样的名称,请阅读 Tim Ottinger 关于Meaningful Names 的文章。

    当一个类只做一件事时,给它起一个描述性的名字通常很容易。诸如“经理”之类的词含糊不清,可能表明该类负责执行许多不相关的事情,没有简单的名称能够描述该类的作用。如果只看类名就能知道类是做什么的,那么这个类就是一个好名字。

    【讨论】:

    【解决方案5】:

    我真的不明白工厂或服务如何适应特定的时尚......

    工厂是一种设计模式,如果类真的是工厂,那么它是一个非常合适的名称。

    如果一个类是 Windows 服务,那么将其称为服务有什么问题?

    除非你发现执行所有重命名重构的成本太高,即使你真的很想这样做,否则没有问题。

    【讨论】:

    • 但在我的代码库中,列为服务的东西甚至不是“Windows 服务”……通常会有诸如 MyClassRetrievalService、MyClassGroupingService、MyClassSomethingElseService 等之类的东西……
    【解决方案6】:

    为什么不使用静态分析工具来帮助实施一套风格和一致性规则?

    如果您身处 .NET 世界,Microsoft 提供了一个名为 StyleCop 的工具

    【讨论】:

      【解决方案7】:

      在您给出的类名示例中,“MyClass”是否代表实际的类名,所以您真的看到像“PersonnelRecordUtil”或“GraphNodeFactory”这样的名称? MyClassFactory 是一个非常糟糕的类的实际名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2013-01-01
        • 2012-02-01
        • 2013-11-09
        • 1970-01-01
        相关资源
        最近更新 更多