很久以前我读过一篇文章(我相信一篇博客文章),它让我在命名对象的"正确"轨道上:非常谨慎地命名程序中的东西.
例如,如果我的应用程序(作为一个典型的业务应用程序)处理用户,公司和地址我有一个User,一个Company和一个Address域类 - 可能在某个地方UserManager,一个CompanyManager和一个AddressManager会弹出来处理这些事情.
所以,你可以告诉那些UserManager,CompanyManager和AddressManager做什么?不,因为Manager是一个非常通用的术语,适用于您可以对域对象执行的任何操作.
我读过的文章建议使用非常具体的名称.如果它是一个C++应用程序并且该UserManager工作正在分配并从堆中释放用户,那么它将不会管理用户,而是保护他们的出生和死亡.嗯,也许我们可以称之为UserShepherd.
或者可能UserManager的工作是检查每个User对象的数据并以加密方式对数据进行签名.然后我们有一个UserRecordsClerk.
现在这个想法一直困扰着我,我尝试应用它.并且发现这个简单的想法非常难.
我可以描述这些类的功能和(只要我不进入快速和脏编码)我写的类只做一件事.我想念从名称到名称的是一种名称目录,一种将概念映射到名称的词汇表.
最终,我想在我的脑海里有类似图案目录的东西(通常设计图案很容易提供对象名称,例如工厂)
保姆 - 帮助对象在创建后达到"可用"状态 - 例如通过连接到其他对象
等等
那么,你如何处理这个问题呢?你有一个固定的词汇表,你是否动态发明新的名字,或者你认为命名的东西不是那么重要或错误?
PS:我也对链接到讨论这个问题的文章和博客感兴趣.首先,这是让我思考它的原始文章:在没有"经理"的情况下命名Java类
以下是我在此期间从这个问题中学到的内容的一些总结.
关于这个主题的进一步文章/书籍:
以及我从答案中收集的主观名称前缀/后缀的当前列表:
提出好的,准确的课程名称是众所周知的困难.如果做得好,它会使代码更加自我记录,并提供一个词汇表来推断更高抽象级别的代码.
实现特定设计模式的类可以根据众所周知的模式名称(例如FooFactory,FooFacade)给出一个名称,直接模拟域概念的类可以从问题域中获取它们的名称,但是其他类呢?当我缺乏灵感,并且想避免使用泛型类名(如FooHandler,FooProcessor,FooUtils和FooManager)时,有什么类似于程序员的词库吗?
您对如何组织和命名实用程序类有任何意见吗?
每当我遇到一些代码复制时,可能只是几个代码行,我将它们移动到实用程序类.
过了一会儿,我往往会得到很多的小静态类,通常只有一个方法,我usualy放在一个utility是它和类臃肿的命名空间.
例子:
ParseCommaSeparatedIntegersFromString( string )
CreateCommaSeparatedStringFromIntegers( int[] )
CleanHtmlTags( string )
GetListOfIdsFromCollectionOfX( CollectionX )
CompressByteData( byte[] )
Run Code Online (Sandbox Code Playgroud)
通常,命名约定会告诉您将类命名为名词.我经常最终得到很多类HtmlHelper,CompressHelper但它们的信息量不大.我也尝试过非常具体的HtmlTagCleaner,通常每个实用程序方法最终会有一个类.
您对如何命名和分组这些辅助方法有任何想法吗?
我正在阅读书清洁代码http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882
作者提到您应该在类的名称中避免使用管理器,处理器,数据或信息等单词.我到处都用过这些.什么是更好的名字?我有一个负责启动和停止连接的类.所以我把它命名为ConnectionManager.