相关疑难解决方法(0)

命名类 - 如何避免将所有内容称为"<WhatEver> Manager"?

很久以前我读过一篇文章(我相信一篇博客文章),它让我在命名对象的"正确"轨道上:非常谨慎地命名程序中的东西.

例如,如果我的应用程序(作为一个典型的业务应用程序)处理用户,公司和地址我有一个User,一个Company和一个Address域类 - 可能在某个地方UserManager,一个CompanyManager和一个AddressManager会弹出来处理这些事情.

所以,你可以告诉那些UserManager,CompanyManager和AddressManager做什么?不,因为Manager是一个非常通用的术语,适用于您可以对域对象执行的任何操作.

我读过的文章建议使用非常具体的名称.如果它是一个C++应用程序并且该UserManager工作正在分配并从堆中释放用户,那么它将不会管理用户,而是保护他们的出生和死亡.嗯,也许我们可以称之为UserShepherd.

或者可能UserManager的工作是检查每个User对象的数据并以加密方式对数据进行签名.然后我们有一个UserRecordsClerk.

现在这个想法一直困扰着我,我尝试应用它.并且发现这个简单的想法非常难.

我可以描述这些类的功能和(只要我不进入快速和脏编码)我写的类只做一件事.我想念从名称到名称的是一种名称目录,一种将概念映射到名称的词汇表.

最终,我想在我的脑海里有类似图案目录的东西(通常设计图案很容易提供对象名称,例如工厂)

  • Factory - 创建其他对象(从设计模式中获取命名)
  • 牧羊人 - 牧羊人处理物体的生命,它们的创建和关闭
  • 同步器 - 在两个或多个对象(或对象层次结构)之间复制数据
  • 保姆 - 帮助对象在创建后达到"可用"状态 - 例如通过连接到其他对象

  • 等等

那么,你如何处理这个问题呢?你有一个固定的词汇表,你是否动态发明新的名字,或者你认为命名的东西不是那么重要或错误?

PS:我也对链接​​到讨论这个问题的文章和博客感兴趣.首先,这是让我思考它的原始文章:在没有"经理"的情况下命名Java类


更新:答案摘要

以下是我在此期间从这个问题中学到的内容的一些总结.

  • 尽量不要创造新的比喻(保姆)
  • 看看其他框架做了什么

关于这个主题的进一步文章/书籍:

以及我从答案中收集的主观名称前缀/后缀的当前列表:

  • 协调员
  • 生成器
  • 作家
  • 读者
  • 处理器
  • 容器
  • 协议
  • 目标 …

oop naming design-patterns naming-conventions

1147
推荐指数
11
解决办法
20万
查看次数

有哪些类名可能表示需要重构?

我发现了一些像这样的文章,这些文章表明某些词语永远不应该被用作类名的一部分.当一个类在名称中包含其中一个单词时,表示代码应该被重构或重新设计.

例:

经理

理由:由于几乎所有课程都"管理"某些内容并且"经理"的含义非常广泛,人们可以将很多职责交给"经理"课程,同时仍然能够宣称课程"只有一件事".因此,使用"Manager"命名一个类并没有说明该类实​​际上做了什么.前面提到的文章"命名没有'经理'的Java类",显示了这一点:

例如,使用名为"UrlManager"的类 - 您无法判断它是否汇集URL,操纵URL或审核它们的使用.所有的名字告诉你,这不是一个URL,但它确实与它们一起工作.另一方面,名称"UrlBuilder"可以更好地描述该类的功能.

另一个例子:

帮手

原因:像"ThreadHelper"这样的类名使人们想知道为什么需要它以及为什么它不能只是"Thread"类的一部分.它实际上是适配器还是装饰器?如果是这样,那就这样命名.班级"线程"已经承担了太多的责任吗?如果是这样,重构并为新类赋予有意义的名称."助手"没有说明它正在做什么或它如何帮助.

类名中的其他单词是否表示需要重构或重新设计,应该避免?为什么?

编辑:我认为这些词语经常被使用

  • 它们通常具有广泛的含义
  • 它们几乎适合所有环境
  • 他们阻止设计师考虑更好的设计或名称
  • 人们相信使用它们是可以的

清洁代码一书列出了更多,但没有给出任何理由:

避免使用类名称中的管理器,处理器,数据或信息等字样.

如果有人能为他们提供可能的理由,那就太棒了.

相关问题:

命名类的最佳方法是什么?

refactoring naming

11
推荐指数
2
解决办法
2028
查看次数