刚收到的私信问题:

java英文标识符中,是用大小写来区分是类型还是变量的,但使用了中文,就没法这么做了,有什么好的建议么?比如我定义一个状态枚举,再用这个类型定义一个变量,也是叫状态。英文中,类型是State,变量是state。中文下就不行了。

问题感觉比较有代表性,此文作一阶段小结。并不针对枚举类型,而是所有类型/接口。各人命名风格不同,此文仅对本人习惯作一介绍(主要以 Java 代码为例)。

最早开始与同好切磋这个问题是在两年多前的这帖:中文命名的特定问题, 相关风格及规范 · Issue #45 · program-in-chinese/overview

重名是否恰当

应该是首先考虑的问题。英文经常仅用大小写区分,并不意味着应该/必须照搬直译。以薛定谔的猫为例:

public class Cat {

  enum State {
    Dead,
    Alive
  }
  
  State state;
}

假定这里枚举类型 State 的含义是打开箱子观测时的状态,可以用“下场”,“结局”等等更能体现语义的词汇命名枚举类型。

2022-01-05 补:再思考后,这里的枚举类型命名应该侧重的是“死/活”这些静态概念,用“死活”比“状态”更明晰。而这里的变量 state 应该反映业务语义,最好明确到底是整个试验期间的状态,还是开箱观测时的状态,因此用“开箱状态”或“期间状态”更可读(中英对比如下)。一般来说,类型命名应尽量反映该类型本身的语义,而与该类型的个体所在的上下文语境无紧密联系。这应与 OO 的设计思路一致。换言之,如果出现了类名与变量名相同的情况,应该首先考虑类型的设计是否合理、命名是否在类型语义外加入了额外信息、变量名是否不够明确等等。

对比

这取决于代码的语义,以及设计。感觉比较难一概而论(如有具体实例欢迎在上面的 issue 跟帖/下面留言/私信继续探讨),但最好在采用其他手段区分之前,先认真考虑一下。因为这往往可以使语义更加明确,开发者也在推敲过程中能对代码目的有个更清晰的概念。

写到这里时,看了一下两年前的 中英文代码对比系列之Java一例,突感当时的思维僵化,请见最后增补。这与本文主题并不直接相关,但直译之弊可见一斑。

下面是如果避无可避,或者不愿在推敲上花过多功夫的一些权宜之计:

方法一

使用后缀突出属性。比如 class 后缀“类”,interface 后缀“接口”,enum 后缀“种类”(这个没有实践过)等等。比如这些小项目:

一个好处是,几乎可以杜绝和变量重名的情况出现。但贯彻风格也是个额外负担。

方法二

有时,项目写到一半才发现这个问题,而大多数类名已经写好,不带后缀。又懒得重命名所有类,那么就在这个重命名的地方对变量加前缀,比如这里的“某词条”:

      词条 某词条 = 英汉词典.查词(词条[0]);

这对偶尔出现的情况比较适用。

【先想到这么多】