有些读者看到标题就开始敲键盘了,还需要写文章?命名不就是abc、123等吗,名字一定要有意义,有什么意义呢?但在现实中,虽然知道名字应该有意义,但很多程序员还是逃不出命名的沼泽。灵丹妙药命名法中的精确度是什么?看代码:是不是很正常?为什么不?那我问你,这段代码是做什么的?你必须集中精力阅读代码的细节。看完你说这段代码是把一个章节的翻译状态改成翻译。为什么你必须阅读这段代码的细节才能知道这个方法在做什么?问题是方法名——processChapter,方法是处理章节,但是名字太宽泛了。如果将“将章节的翻译状态改为正在翻译”称为处理章节,那么请问:将章节的翻译状态改为已翻译并修改章节内容是否也可以称为处理章节?所以,这个Method名确实是太宽泛了,没有大错,但是不够严谨!乍一看,这个名字是有含义的,但实际上并不能有效体现这段代码的具体含义。如果是信息处理系统,你根本无法判断。这是博客平台还是图书馆管理系统?从传播的角度来看,这不是一种有效的信息表达。理解它需要花费大量的时间和精力。命名过于宽泛,无法准确描述。这是很多代码命名的现状,也是祖传代码难以理解的根本原因。回想一下这些名称:data、info、flag、process、handle、build、maintain、manage、modify……这些都是太宽泛的名称。当这些名字出现在你的代码中时,你可以确定作者并没有想好用什么名字,就开始将其命名为灵丹妙药,继续编码。时间长了,不能叫加工篇,那叫什么?该名称应准确描述该方法的作用。此代码是“将章节更改为翻译”。它不应该被称为changeChapterToTranlsating吗?相对于processingchapter来说,这个名字算是一个进步,但并不是一个好名字,因为它更多的是描述这段代码在做什么的细节。而把一段代码封装成一个方法,是因为我们不想知道太多的细节。如果把细节摊开,和直接看代码细节没什么区别。一个好的名字应该描述意图,而不是细节。为什么此代码会将翻译状态更改为正在翻译?必有图。将翻译状态更改为正在翻译是因为我们在这里开始了翻译过程。所以这个方法应该叫startTranslation术语命名法再看一段代码:这个!会不会有问题?我每天都看到这种代码。是的,我知道你们都在写这种风格的代码,这里还有另一个经典问题:技术术语命名法。之所以叫bookList,是因为它声明的类型是List。这种命名几乎随处可见,比如xxMap,xxSet。这也是一个简单的命名法,但它会导致很多问题,因为它是基于技术实现细节的。我们都知道面向接口编程的原则,就是不去实现编程,因为接口是稳定的,而实现是易变的、不稳定的。大多数人只认为这个原则是针对类型的,但命名也应该遵循。比如我发现我现在需要的是一个独特作品的集合,就是要把这个变量的类型从List改成Set。我相信你会改变变量类型,但是你会改变变量名吗?不确定,一忘记就会出现:一个bookList变量其实是一个Set类型!怎么命名呢?肯定有一个更能表达意图的这个代码的名字是getabunchofbooks,所以才叫books。名称更简单,更具表现力。归根结底,使用专业术语一般是因为缺乏相应的模式。比如Redis直接出现在业务代码中:一般来说,这里真正需要的是缓存。Redis只是缓存模型的一种具体实现:但实际上,缓存的概念也是一个技术名词,不应该出现在业务代码中。春天做得很好。在使用Spring的时候,如果需要缓存,通常会加注:很多人喜欢用专业术语来命名,多半是因为:用熟悉的语言写代码的时候,很多都是参考别人的代码,优秀的代码是一些开源技术项目。在一个技术项目中,这些技术术语其实就是它的业务语言。但是对于我们的业务项目,我们不能生搬硬套。如果这部分真的是在处理一些技术,用专业术语没有什么错,但是如果我们是在处理业务,就要尽量避免使用专业术语。xxMap这样的名字表示一个映射关系,比如:bookid和book的映射关系,不也可以命名为bookIdMap吗?Map代表一种数据结构,映射关系建议写成Mapping。进阶前的低趣味,其实本质上都是同一个问题:对业务的不了解。编写可维护的代码使用业务语言。那么你怎么知道你的名字是否是商务用语呢?告诉PM这个词,看看他是否理解它的意思。如果团队中的每个人都按照自己的理解来命名,那么命名可能会百家争鸣。因此,一个好的团队实践就是建立一个团队的业务词汇表,统一业务命名。当团队对业务有了一致的理解后,或许可以发现更高级的恶臭:看方法名,应该是确认章节内容通过了审核。但是有个疑问,chapterId是审核章节的ID,没问题,但是userId是什么?了解了背景后,才知道这里需要userId,因为需要记录审稿人信息。通过业务分析,发现这个userId不是一个好名字,因为需要多加解释。更好的名字是reviewerUserId,因为这个用户在当前场景下就是审稿人(Reviewer)角色。这也是万灵药的命名法,但不是那种一眼就能看出来的臭味,而是需要在业务层面讨论的,所以算是高级臭味了。
