首发于中文编程

中文命名标识符如何区分类型和变量

刚收到的私信问题:

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

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

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

重名是否恰当

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

public class Cat {

  enum State {
    Dead,
    Alive
  }
  
  State state;
}

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

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

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

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

方法一

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

吴烜:烂尾工程: Java实现的汇编语言编译器zhuanlan.zhihu.com图标吴烜:在Maven Central发布中文API的Java库zhuanlan.zhihu.com图标

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

方法二

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

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

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

【先想到这么多】

发布于 2019-11-27

文章被以下专栏收录