读《代码整洁之道》第二章随笔 有意义的命名

 

让人引起重视的代码,名副其实

有意义的命名

如果你在给变量、函数或类命名的时候非常随意,如下:

1.1

int d;  //elapsed time in days;消逝的时间


//又或者是


List list1 = ...
List list2 = ...

当别人第一次看到此代码时并不知道它要干什么, 命名d ,并没有体现出来任何意义。

 

修改为如下命名:

1.2

int elapsedTimeInDays;   //一天中消逝的时间

int daysSinceCreation;    //创建天数

 

提高代码的清晰度,而不至于像上面的代码一样模糊。

 

有意义的区分

 

如下,字母o 与 0, 字母l 与 1。

1.3

int a = l;
if(o == l)
  a = o1;
else
  l = 01;

又或者,1.. 3...,如下

1.4

public static void copyChars(char a1[], char a2[]){
  
      //TODO...
}

 

重构1.4的代码,如果是JDK源码的话,它会这么写

1.5

public static void copyChars(char source[], char destination[]){
  
      //TODO...
}

 

资源-》目的地。

 

禁止用或者最好不用缩写

其实有时候开发为了图方便,或多或少都会缩写的。但本书不建议这么做。

举例:

1.6

Date genymdhms;    //生成时间戳
Date modymdhms;   //修改时间戳

重构后

Date generationTimeStamp; 
Date modificationTimeStamp;

 

禁止或者最好不要用前缀后缀

用前缀确实没有什么大的意义,因为程序员在读命名时都是忽略前缀或者后缀的。

 

类名命名的规则

类名和对象一般用名词或者名词短语命名。

 

方法名

一般用动词或者动词短语命名。

根据JavaBean的标准,在一个类中一般有三种动词

  1. get
  2. set
  3. is

举例

1.7

String name = employee.getName();

customer.setName("mike");

if(paycheck.isPosted)....

 

 

小结

本书所在意的命名长短不是命名的长度,而是它够不够干净利落。

 

再看一组对比

1.8

//打印猜测统计
private void printGuessStatistics(char candidate, int count){
  
   String number;
   String verb;
   String pluralModifier;          //修饰词

   if(count == 0){
       number = "no";
       verb = "are";
       pluralModifier = "s";
    }else if(count == 1){
           ....
    }else {
           ....
    }
  

    String guessMessge = String.formate(....)
    print(guessMessage);
}

 

在一个方法里,变量贯彻始终。本书建议对其进行分解,重构如下

public Class GuessStatisticMessage {

  private String number;
  private String verb;
  private String pluralModifier;
 

  public String make(char candidate, int count){
        createPluralDependetMessageParts(count);
        return String.format(
            "......"
        )
  }

  public void createPluralDependetMessageParts(int count){
         
        if(count == 0){
            thereAreNoLetters();
        }else if(count == 1){
            thereOneLetters();
        }else{
            thereAreManyLetters(count);
        }
  }



  public void thereAreNoLetters(){
         //TODO...
  }

  public void thereOneLetters(){
         //TODO...
  }
  public void thereAreManyLetters(count){
         //TODO...
  }

}                 

 

刚开始会很疑惑,我直接if else 不行吗? 一目了然。

 

但是看了重构后的代码会发现,它的步骤太紧凑了,而且分工明确! 函数变化从上到下,看的很舒服。

 

posted @ 2021-07-05 08:15  无上仰无  阅读(82)  评论(0)    收藏  举报