1. 程式人生 > >寫給所有程式設計師_起個好名字是成功的一半

寫給所有程式設計師_起個好名字是成功的一半

時隔我做程式設計師兩年了,現在才意識到為檔案,為變數,為函式起個好名字的重要,我倍感慚愧,但又為現在意識到這點感到幸運。

1.沒意義的名字
例子:

int a = 1;
int b = 2;
int c = a + b;
System.out.println("c="+c);

這段程式碼很簡單,輸出兩個數的和,但有個問題,你能看到c就知道是兩數和嗎?如果我們的程式碼足夠多,當每次看到a,b,c的時候,我們都要嘗試用邏輯去解析這段程式碼,這造成時間的大量浪費,因為這個名字除了區別不同變數外,沒有帶給我們任何有用的訊息。

2.讓人誤解的名字

int apple = 1;
int
banana = 2; int orange = apple + banana; System.out.println("orange ="+orange);

這段程式碼包含著邏輯炸彈,因為名稱存在意義,我們往往會在意名稱的含義。第一眼看到以為是要輸出橘子的有關係,但發現竟然不是,然後又要從頭看起。apple是啥?banana是啥?他們兩個相加有什麼意義?如果這樣的程式碼足夠多,我保證一定比a,b,c更讓人抓狂。

讓人誤解的名字往往讓人先想含義,發現不正確又要從頭看起。

3.數字命名

int a1 = 1;
int a2 = 2;
int a3 = 3;
int a4 = a1 + a2 ;
System.out
.println("a4 ="+a4 );

數字命名導致我不得不去檢視與之相關的名字。既然都以a開頭,又用編號區分,我打賭他們之間一定存在某些關係。不行,一定不能寫錯,我要看看它的幾個兄弟是什麼意思。。。每次看到這種程式碼的時候我難免這樣想,不得不去看看它的“兄弟”是幹嘛的,甚至有的時候會應為粗心,而寫錯。比如上面的a4 = a1+a2;
我寫成a1+a3,這真的很難一眼看出來。

數字命名導致閱讀者要檢視兄弟名稱,容易書寫錯誤且不容易檢查。

4.大家來找茬

int naturalFirstNum = 1;
int naturalSecondNum = 2;
int naturalSumNum = naturalFirstNum + naturalSecondNum;
System.out
.println("naturalSumNum ="+naturalSumNum );

如果有相似的名字,請把它們不同的部分寫在開頭,其次是結尾,不要把這部分放在中間,這會增大錯誤率,容易書寫錯誤且不容易檢查。

看到上面三個數的不同之處了嗎?它們開頭結尾都相同,但是中間不同,這樣真的很容易弄錯,如果你不得不這樣寫,請將naturalFirstNum 改為firstNaturalNum,naturalSecondNum改為secondNaturalNum 同理修改naturalSumNum;如果命名規則要求固定開頭(類似btnServiceCommit,前面幾個字母表示控制元件),那就讓它們的結尾不同naturalNumFirst.

5.不要加和型別相同的名字,這會給你的查詢替換工作加大難度

List<Integer> list = new ArrayList<>();

這個名字有兩個槽點:1.你搜索list的時候會把List也搜尋出來,如果我全域性替換名稱,會造成大面積的錯誤,因為我把List也替換了。2.沒意義,因為一旦我賦值錯誤了,強型別語言IDE會提醒,看到這個名字我也不知道它的作用是什麼。
這種情況通常發生在自定義的類,比如:

Apple apple = new Apple();

聰明的程式設計師往往會這樣寫:

Apple mApple = new Apple();

mApple比apple這個名字好,因為它讓IDE的查詢替換工作更加容易

好的名字

int firstNum = 1;
int secondNum = 2;
int sumNum = firstNum + secondNum;
System.out.println("sumNum ="+sumNum );

注意到了嗎?我用firstNum來代替num1,這樣識別度會增強,firstNum和secondNum不像num1和num2這樣容易弄錯。因為是變數名所以採用名詞,不要寫成動詞firstAdd,這容易讓人眩暈,1+?這是什麼?用動詞不能完整的表達變數名的意思。

同樣的,函式名(方法名)要使用動詞+名詞

public static void main(String []args){
    int firstNum = 1;
    int secondNum = 2;
    System.out.println("sumNum ="+addTwoNums(firstNum,secondNum ));
}

public static int addTwoNums(int firstNum,int secondNum){
    return firstNum + secondNum;
}

上面的名稱:addTwoNums就是動詞+名詞格式,不用看程式碼單獨看名字,就知道這個函式(方法)是求兩數和的,這就是這種命名方式的好處。單用動詞add,絕對不會馬上知道這個具體的工作。是新增到資料庫?新增到列表?還是求和?要有個識別的過程,這個過程,我稱之為浪費時間的過程。

特殊:按鈕或超連結類控制元件命名

雖然也算變數名,通常表示一個動作,如:
提交資料,比如修改手機號,比如登入
所以使用動詞或動名詞形式:
btnCommit,btnModifyPhoneNumber