有意义的命名

名副其实

比如变量、函数、类的名称要能表示它是用来做什么事情的,应该怎么使用,不需要通过额外的注释,就能说明它的作用。

比如下面这段代码,乍一看根本不知道是用来做什么的:

  1. public List<int[]> getThem() {
  2. List<int[]> list1 = new ArrayList<int[]>();
  3. for (int[] x : theList)
  4. if (x[0] == 4)
  5. list1.add(x);
  6. return list1;
  7. }

我们需要通过上下文分析,才能知道这段代码是干什么的。如果我们对变量和函数赋予有意义的名称时,就能清晰的知道这段代码的作用,另外对 for、if 等代码块,建议使用大括号包起来,这样既对代码阅读有好处,又能避免不必要的错误。

  1. public List<int[]> getFlaggedCells() {
  2. List<int[]> flaggedCells = new ArrayList<int[]>();
  3. for (int[] cell : gameBoard) {
  4. if (cell[STATUS_VALUE] == FLAGGED) {
  5. flaggedCells.add(cell);
  6. }
  7. }
  8. return flaggedCells;
  9. }

做有意义的区分

为满足编译器或解释器的需要而做区分。例如,在同一作用域内两个变量是不能重名,我们经常使用 a1,a2 这种方式来避免编译出错。但是这种命名方式没有提供正确信息。比如下面这段代码:

  1. public static void copyChars(char a1[], char a2[]) {
  2. for (int i = 0; i < a1.length; i++) {
  3. a2[i] = a1[i];
  4. }
  5. }

a1 和 a2 不能表示对应变量的实质意义,参数名改为 source 和 destination 会像样许多:

  1. public static void copyChars(char souce[], char destination[]) {
  2. for (int i = 0; i < souce.length; i++) {
  3. destination[i] = souce[i];
  4. }
  5. }

废话是另一种没意义的区分。比如 Product 类和 ProductInfo 或 ProductData 类,它们的名称虽然不同,但是意义却是一样的。Info 和 Data 就像 a、an 和 the 一样,是意义含混的废话。

使用读的出来的名称

变量、函数、类的名称尽量使用能够读的出来的名称。比如下面的代码,在没有注释的情况下,根本不知道这些属性代表什么:

  1. class DtaRcrd102 {
  2. private Date genymdhms;
  3. private Date modymdhms;
  4. private final String pszqint = "102";
  5. /* ... */
  6. }

改成可读的名称:generationTimestamp 表示生成时间戳

  1. class Customer {
  2. private Date generationTimestamp;
  3. private Date modificationTimestamp;
  4. private final String recordId = "102";
  5. /* ... */
  6. }

参考

《代码整洁之道》

作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/crtgck 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。