在去年和我的团队代码库中有一些工作,我注意到命名惯例的稳步发展。
例如,有很多类被命名为表示它们是一个可以帮助你做某事的类。
以下是我发现的那些:
MyClassUtil
MyClassFactory
MyClassHelper
MyClassManager
MyClassService
在我看来,随着时间的推移,人们会为相对相同的事情提出命名约定,因此您不必以一致的方式命名所有内容,而是使用具有一些约定的代码库。所有的新东西都是根据最新的时尚命名惯例命名的,所以你几乎可以通过当时流行的惯例告诉一些代码的时代。
应对这种趋势的最佳方法是什么?这真的是个问题吗?随着这些命名时尚流行,人们应该使用最新的时尚吗?是否应该使用新的命名约定重命名所有现有项目?或者,人们应该接受这种不可避免的东西吗?
答案 0 :(得分:5)
它们看起来不像时尚......所有这些名字都暗示了这个阶级的目的,而且这些目的是不同的。通过编程,这一切都在名称中,应该非常谨慎地选择它们。品种不需要逃脱。名称各不相同,因为课程的目的各不相同。
<强> MyClassUtil 强> - 一些与MyClass一起使用的实用程序,它没有附带。也许MyClass属于你正在使用的库,但是你经常使用一些更高级别的函数,你需要在某个地方放置它们。
<强> MyClassFactory 强> - 以抽象的方式创建MyClass的实例。这允许您编写需要MyClass实例的代码。它可以从MyClassFactory获取这些新实例。这将允许工厂在将来修改以提供MyClass的不同特定实现。也许在单元测试下,工厂只提供虚拟/模拟MyClasses。这意味着使用工厂的类可以在不需要更改的情况下进行测试,只需更改工厂,并且可以隔离正在测试的类。
<强> MyClassHelper 强> - 哦,我可能会同意,也许这可能更具体。它可以帮助MyClass,但是什么。也许这有点类似于MyClassUtil。但是,可能MyClassUtil是与MyClass一起使用的通用函数,而帮助器是使用MyClass的特定实例初始化的,然后可以对该一个实例执行操作。您需要为每个想要帮助的MyClass提供一个新助手。
<强> MyClassManager 强> - 也许这会处理一个MyClass实例池并存储或编排它们。例如。在CommunicationsManager中,该类将处理与处理端口或连接(如以太网或串行)的类连接的类,以及处理通过它发送的通信协议的类,以便它可以传输数据包,以及处理这些数据包中的消息。
<强> MyClassService 强> - 服务可以为您做事,就像给定邮政编码将其转换为网格参考一样。通常,服务可以解决许多特定事物。使用邮政编码示例,此类可能具有可与不同网站通信以进行转换的实现。
答案 1 :(得分:4)
上面给出的所有课程名称都向我表明了与面向对象原则的明显背离。没有办法告诉“MyClassUtil”或“MyClassService”是做什么的。它可能是任何东西。类命名应该是特定的,并且应该清楚地传递类的实际功能。这些都没有。处理这种趋势的最好方法是了解面向对象的编程技巧并相应地命名类。
现在,可能是这些示例指出了应用程序体系结构中这些类所代表的函数,并且您对“MyClass”的使用仅仅是在运行时更确定的东西的占位符,在这种情况下,我不会不要将这些视为命名时尚,而是将其视为类本身功能的描述性指标,并提供应用程序底层架构的松散提示。
答案 2 :(得分:4)
如果这种情况普遍存在,团队需要花一些时间研究OO设计:阅读源代码以获得备受推崇的OO框架,设计模式书籍或Evans“Domain Driven Design”等书籍。
“Util”和“Manager”通常是设计不佳的症状 - “代码味道”。 “Helper”也属于特殊情境(Rails应用程序)以外的地方。
“工厂”和“服务”具有精确的技术含义,您可以检查代码以确定它是否符合这些设计模式。
一般的补救措施是与团队坐下来,并明确讨论您期望从这些命名方案中获得什么好处,什么是有意义的,什么不是,然后在接下来的几个月中应用重构技术逐步淘汰你们都认为是代码味道的名字。
命名很重要。它不应该掉以轻心,也不是主观问题。确实,对于给定的命名问题,通常有多个正确的答案。但是,很少有很多答案与以前的选择一致,这是关键。
答案 3 :(得分:2)
建议将名称重命名为更好的名称并重构代码,以便每个类都有一个明确的responsibility。要知道要使用哪种名称,请阅读Tim Ottinger关于Meaningful Names的文章。
当一个类只做一件事时,给它一个描述性的名字通常很容易。诸如“经理”之类的词语含糊不清,可能表明该班级负责执行许多不相关的事情,没有简单的名称能够描述该班级的作用。如果通过查看类的名称就可以知道类的作用,那么该类有一个好名字。
答案 4 :(得分:0)
我真的不知道工厂或服务如何适应特定的时尚......
工厂是一种设计模式,如果这个类真的是一个工厂,那么它就是一个非常合适的名称。
如果某个类是Windows服务,那么调用它的服务有什么问题?
除非您发现执行所有重命名重构的成本太高,即使您确实想要这样做,也没有问题。
答案 5 :(得分:0)
为什么不使用静态分析工具来帮助实施一组样式和一致性规则?
如果您在.NET世界中,Microsoft提供了一个名为StyleCop
的工具答案 6 :(得分:0)
在你给出的classname示例中,“MyClass”代表一个实际的类名,所以你真的看到像“PersonnelRecordUtil”或“GraphNodeFactory”这样的名字? MyClassFactory是一个非常糟糕的实际名称。