CleanCode筆記---有意義的命名

轉載請附帶本文地址,謝謝!

1. 命名應該和實際意義相符合

反例:

int w;
int h;

public int fun(){
    return w*h;
}

從代碼中看不出任何信息,w和h是何含義?

不如改爲:

int width;
int height;

public int calculateArea(){
    return width*height;
}

這樣沒有註釋也能看懂代碼的意圖.


2.避免誤導

如果僅僅給你一個accountList,很容易讓人誤以爲是一個賬戶類表.

Account[] accountList;

//此處又很長的代碼

accountList = getAccountList(); //你能辨別出accountList是什麼嗎?

爲了避免誤導,應該改爲:

Account[] accountGroup;

//此處又很長的代碼

accountGroup = getAccountGroup(); //你能辨別出accountGroup是什麼嗎?

3.做有意義的區分

現在有三個類:

public class Account{}

public class AccountInfo{}

public class AccountData{}

僅僅從類名你能區分這三個類有什麼區別嗎?
既然要區分他們就應該取一個有意義的名稱區分.


4.用讀得出的名稱

有的程序員喜歡用自造的詞語,比如:

public void lxmcreateData(){
    //代碼內容
}

你能讀出來上面函數的名稱嗎?函數本意是想創造數據,但是lxm是什麼意思?翻到類頭註釋才知道,作者叫Lixiaoming.
如果改爲下面這樣,是不是更好讀呢?

public void createData(){
    //代碼內容
}

5.用可搜索的名稱

經常在代碼中可以見到類似a,b,w,h,e等這樣的命名,而且同一個類中多次出現,特別是作爲臨時變量的i,j,k.當想查找時,編輯器也不知道你想要查找哪一個.
例如:

private List<Student> studentList;
public float getMathAvgScore(){
    float s = 0;
    for(int i = 0; i < studentList.size(); i++){
        s = s + studentList.get(i).getMathScore();
    }
    float a = s/studentList.size();
    return a;
}

public float getAvgScore(){
    float s = 0;
    for(int i = 0; i < studentList.size(); i++){
        s = s + studentList.get(i).getTotalScore();
    }
    float a = s/studentList.size();
    return a;
}

如果改爲下面這樣,你覺得哪個更好呢?

private List<Student> studentList;
public float getMathAvgScore(){
    float mathTotalScore = 0;
    for(Student student : studentList){
        mathTotalScore = mathTotalScore + student.getMathScore();
    }
    float mathAvgScore = mathTotalScore/studentList.size();
    return mathAvgScore;
}

public float getAvgScore(){
    float totalScore = 0;
    for(Student student : studentList){
        totalScore = totalScore + student.getTotalScore();
    }
    float avgTotalScore = totalScore/studentList.size();
    return avgTotalScore;
}

6.不要使用命名編碼

什麼是命名編碼?就像前面的lxmcreateData()函數名就是命名編碼.

命名前綴

就像前面的lxmcreateData()一樣,該類中存在很多類似lxmXXX的函數,變量.
在命名時應避免使用這樣的前綴

命名後綴

使用Eclipse時,我們生命一個變量時,往往會給出命名提示:

String nameString

這是很不必要的,不需要在變量後面都帶上該變量的類型,除非該變量的命名不足以表現出其類型.


7.避免思維映射

每一個變量應明確其含義,不要讓人在大腦中給其一個含義映射!
比如:

for(int i = 0; i < studentList.size(); i++){
    s = s + studentList.get(i).getMathScore();
}

與下面相比:

for(Student student : studentList){
    mathTotalScore = mathTotalScore + student.getMathScore();
}

下面的代碼更直觀,而上面的代碼會讓人去記住s代表什麼含義.


8.類名

類名和對象名應該是名詞活名詞短語,如Customer,WikiPage,Account,AccountParser等,避免使用Manager,Processor,Data,Info等這樣的類名.類名不應該是動詞.


9.方法名

方法名應該是動詞或動詞短語,如postPayment,deletePage或save.
屬性訪問與修改和斷言應該根據其命名,並依照javabean標準加上get,set,is前綴.
如:

String name = person.getName();

person.setName("Jack");

player.isPlaying();

10.別裝幽默

命名應該是直來直去的名稱,不要使用一些俗語或俚語(不要以爲別人都和你一樣英文閱歷很深).
別用whack()來表示kill().


11.每個概念對應一個詞

如果你要寫一個控制類,比如控制音頻類.如果使用了AudioManager就不要在使用AudioController.否則別人是弄不懂二者之間區別.


12.別用雙關語

比如add一詞又很多含義,不要爲了保持方法名一致就命名爲add.
把單個條目放到集合中可以用put,不要用add;
把單個條目放大數據庫中可用insert,不要用add.


13.使用解決方案領域的名稱

有時同一個事物在不同領域有不同的含義,在寫代碼的過程中要用和項目相關領域的詞彙命名.


14.使用源自於所涉及問題領域的名稱

儘量使用問題所在的領域的詞語來命名,這樣可以明確代碼解決問題的領域.


15.添加有意義的語境

有些詞語會有一詞多義的現象,如果找不到代替該詞更好名稱,那麼至少給該詞添加能明確含義的語境.


16.不要添加沒用的語境.

就像前面的lxmcreateData()一樣,前綴lxm是沒有任何含義的.一定不要附帶這樣的沒有意義的語境.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章