乱用英文

297 阅读5分钟

英文命名的最低限度的要求是写出来的代码要像是在用英语表达
命名之所以如此重要,因为它是一切代码的基础。就像写文章一样,一个错别字满天飞的文章,很难让人相信它会是一篇好的文章,所以,命名的重要性是如何强调都不为过的。

坏味道排查列表

  1. 违反语法规则
  2. 不准确的英文词汇
  3. 英语单词拼写错误

解决方案

  1. 制定代码规范
  2. 建立团队词汇表
  3. 经常性的进行代码评审

举例说明

违反语法规则的命名

来看个例子

public void completedTranslate(final List<ChapterId> chapterIds) {
  List<Chapter> chapters = repository.findByChapterIdIn(chapterIds);
  chapters.forEach(Chapter::completedTranslate);
  repository.saveAll(chapters); 
}

初看直线,这个方法的命名似乎没有什么问题,甚至觉得这个英文命名还挺不赖(我自己在写项目的时候还会因为自己特意用了完成时而沾沾自喜:joy:)。它要做的事讲一些章节的信息标记为翻译完成,似乎这个函数名也反应了这个意思。
那这个英文命名有什么问题呢?
首先我们要明确命名的规则: 类名是一个名词,表示一个对象,而方法名则是一个动词,或者是动宾短语,表示一个动作

补充知识:
动词和它的宾语叫做动宾结构。动宾结构发生支配或影响与被支配被影响的关系,这种关系的组合同样也是动宾结构。
动,指的是动词。比如吃、提出、打扫等都是动词。
宾,指的是宾语。在一个短语或者一句话里,跟在动词或者形容词后边的成分叫宾语,宾语通常由名词等充当。比如米饭、意见、等等。
那动宾结构就是这两个成分组在一起的短语或者句子就是动宾结构。比如吃米饭、提出意见、打扫教室等。
注意:
在英文当中,动词分为及物和不及物动词,及物的动词(vt)可以直接跟名词形成动宾短语,不及物动词(v)则不行
及物动词指的是:可以直接跟宾语的动词就是及物动词
及物动词后面一定要有宾语


以此为标准衡量这个名字,completedTranslate 并不是一个有效的动宾结构。completed是不及物动词,Translate也是一个动词。
如果把这个名字改成动宾结构,只要把“完成”译为 complete

complete 译为完成,及物动词vt

“翻译”用成它的名词形式 translation 就可以了

translation 以为翻译,名词,作为宾语形成动宾短语

所以,这个函数名可以改成 completeTranslation:

public void completeTranslation(final List<ChapterId> chapterIds) {
  List<Chapter> chapters = repository.findByChapterIdIn(chapterIds);
  chapters.forEach(Chapter::completeTranslation);
  repository.saveAll(chapters); 
}

不准确的英文词汇

导致这个问题出现的原因其实很简单,国内程序员面临的很尴尬的一个问题就是英语没那么好(俺也一样:joy:)
举一个具体的例子:
我们要实现一个章节审核的功能,一个同事先定义出了审核的状态:

public enum ChapterAuditStatus {
    PENDING,
    APPROVED,
    REJECTED;
}

你觉得这段代码有问题吗?如果看不出来,一点都不奇怪。如果你用审核作为关键字去字典网站上搜索,确实会得到 audit 这个词。所以,审核状态写成 AuditStatus 简直是再正常不过的事情了。
然而实际上我们用的跟多的审核的词是review。抛开前缀不看,同样是审核,一个用了 audit,一个用了 review。这显然是一种不一致。本着代码一致性的考虑,我们希望这两个定义应该采用同样的词汇。 二者的区别是什么呢? audit 会有更官方的味道,更合适的翻译应该是审计,而 review 则有更多核查的意思,二者相比,review 更适合这里的场景。于是,章节的审核状态也统一使用了 review

很多人习惯的做法就是把中文的词扔到字典网站,然后从诸多返回的结果中找一个自己看着顺眼的,而这也往往是很多问题出现的根源。这样写出来的程序看起来就像一个外国人在说中文,虽然你知道他在说的意思,但总觉得哪里怪怪的。(就好像你妈妈做好饭叫你吃饭说的是:“儿子来进食了”,开个玩笑,哈哈,大概就是这个意思:joy:)

其实面对这种问题,我们的解决方案就是简建立起一个业务词汇表,不断的去完善它,然后我们在起名的时候就可以先去词汇表中查,如果有就直接用,没有再去完善词汇表,这样就保证了大家的理解以及命名保持了一致

英语单词的拼写错误

public class QuerySort {
    private final SortBy sortBy;
    private final SortFiled sortFiled;
    ...
}

上面这段代码有什么英文命名上的问题吗?
这段代码其实是把查询的排序做一个封装,但是注意看sortFiled属性,乍一看感觉应该就是排序的字段,但是细一看Filed,什么鬼排序文件吗,难道是我们理解错了???
其实这个仅仅是写这个代码的同学的一个失误,导致的拼写错误,偶尔的拼写错误是不可避免的,这就像我们写文章的时候,出现错别字也是难免的。如果是一些拼写错误是很直白的,一眼就能看出来,但是如果是这种很隐晦的拼写错误,直接改变了单词的含义,那么就需要跟当事人确认了。
对今天的程序员来说,工具已经很进步了,像 IntelliJ IDEA 这样的 IDE 甚至可以给你提示代码里有拼写错误(typo),不少支持插件的工具也都有自己的拼写检查插件,比如Visual Studio Code 就有自己的拼写检查插件。在这些工具的帮助之下,我们只要稍微注意一下,就可以修正很多这样低级的错误