协慌网

登录 贡献 社区

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

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

例如,如果我的应用程序是(作为一个典型的业务应用程序)处理的用户,公司和地址,我有一个User ,一个Company和一个Address域类 - 也许某处UserManager ,一个CompanyManagerAddressManager会弹出一个手柄那些事。

所以,你可以告诉那些UserManagerCompanyManagerAddressManager吗?不,因为 Manager 是一个非常通用的术语,适用于您可以对域对象执行的任何操作。

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

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

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

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

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

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

  • 等等

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

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


更新:答案摘要

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

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

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

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

  • 协调员
  • 生成器
  • 作家
  • 读者
  • 处理器
  • 容器
  • 协议
  • 目标
  • 变流器
  • 调节器
  • 视图
  • 实体

这条道路的好建议:

不要命名瘫痪。是的,名字非常重要,但它们不足以浪费大量时间。如果你不能在 10 分钟内想出一个好名字,继续前进。

答案

我问了一个类似的问题 ,但在可能的情况下,我尝试复制. NET 框架中已有的名称,并在 Java 和 Android 框架中寻找想法。

似乎HelperManagerUtil是你为协调不包含状态的类而附加的不可避免的名词,通常是程序性的和静态的。另一种选择是Coordinator

您可以使用名称获得特别紫色的内容,并选择MinderOverseerSupervisorAdministratorMaster ,但正如我所说,我更喜欢将其保留为您习惯使用的框架名称。

您在. NET 框架中找到的一些其他常见后缀(如果这是正确的术语)是:

  • Builder
  • Writer
  • Reader
  • Handler
  • Container

您可以查看source-code-wordle.de ,我已经分析了. NET 框架和其他一些库的类名最常用的后缀。

前 20 名是:

  • 属性
  • 类型
  • 帮手
  • 采集
  • 变流器
  • 处理器
  • 信息
  • 提供商
  • 例外
  • 服务
  • 元件
  • 经理
  • 节点
  • 选项
  • 上下文
  • 项目
  • 设计师
  • 基础
  • 编辑

我都是为了好名字而且我经常写下在选择名字时要特别小心的重要性。出于同样的原因,在命名事物时我对隐喻很谨慎。在最初的问题中,“工厂” 和 “同步器” 看起来就像它们似乎意味着的好名字。然而,“牧羊人” 和 “保姆” 不是,因为它们是基于隐喻 。在你的代码的类不能是名副其实的保姆; 你称之为保姆,因为它照顾其他一些非常像现实生活的保姆照顾婴儿或小孩。这在非正式演讲中是可以的,但不是(在我看来)可以在代码中命名类,这些代码必须由谁知道谁知道何时知道。

为什么?因为隐喻是文化依赖的,并且通常也是个人依赖的。对你来说,命名一个班级 “保姆” 可以非常清楚,但也许对其他人来说并不是那么清楚。除非您编写的代码仅供个人使用,否则我们不应该依赖它。

在任何情况下,惯例都可以成就或破坏隐喻。 “工厂” 本身的使用是基于一个比喻,但它已经存在了很长一段时间,并且目前在编程世界中是众所周知的,所以我认为使用它是安全的。然而,“保姆” 和 “牧羊人” 是不可接受的。