1. 程式人生 > 其它 >讀《程式碼整潔之道》第二章隨筆 有意義的命名

讀《程式碼整潔之道》第二章隨筆 有意義的命名

讓人引起重視的程式碼,名副其實

有意義的命名

如果你在給變數、函式或類命名的時候非常隨意,如下:

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 不行嗎? 一目瞭然。

但是看了重構後的程式碼會發現,它的步驟太緊湊了,而且分工明確! 函式變化從上到下,看的很舒服。