3

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

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

这是我发现的:

MyClassUtil
MyClassFactory
MyClassHelper
MyClassManager
MyClassService

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

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

4

7 回答 7

5

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

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

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

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

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

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

于 2009-02-09T00:43:19.313 回答
4

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

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

于 2009-02-09T00:18:27.440 回答
4

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

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

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

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

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

于 2009-02-09T01:11:42.617 回答
2

建议将名称重命名为更好的名称并重构代码,以便每个类都有明确的职责。要了解使用哪种名称,请阅读 Tim Ottinger 关于有意义名称的文章。

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

于 2009-02-09T01:26:26.887 回答
0

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

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

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

除非您发现执行所有重命名重构的成本太高,即使您确实想要执行它们,否则没有问题。

于 2009-02-09T00:19:48.980 回答
0

为什么不使用静态分析工具来帮助执行一组样式和一致性规则?

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

于 2009-02-09T03:10:19.943 回答
0

In the classname examples you give does "MyClass" stand for an actual class name, so that you are really seeing names like "PersonnelRecordUtil" or "GraphNodeFactory"? MyClassFactory is a really bad actual name for a class.

于 2009-02-09T15:38:16.777 回答