程式碼規範----名字(把資訊裝入名字中、選擇不被誤解的名字)

weixin_33866037發表於2017-10-20

一、把資訊裝入名字中

1.選擇專業的詞

例1:使用getPage getName getData而不是單單是get這種空洞的詞,更深來說可以用fetch()、download()這種詞更好。

例2:

class BinaryTree{
int size();
}

這裡的size就是不明確的,沒有承載很多資訊。我們需要更專業的詞比如height();nodeNum();等

例3:

class Thread{
void stop();
}

對於stop我們也可以用更專業的詞講其具體化:比如pause() 、kill()、resume()

例4:找到更有表現力的詞

比如對於傳送send ,我們在不同情況下也可以使用不同的的詞去更有表現力的表達。
在向下分發的時候可以使用dispatch,分配可以使用distibute,還有deliver,route等同樣都是傳送卻?不同的表達力。
像start也有很多同義詞,create、launch、begin、open等

2.避免泛泛的名字

像tmp retval,除非使用它們有特殊的理由
retval 就是表達一個沒有很多資訊的返回值
tmp這個名字只應用於短期存在且臨時性為其主要存在因素的變數
對於 i,j,k這種可以表示式迭代器的使用,但是如果迭代器引數較多,可以更精確點,比如
if(club[ci].members[mi]==users[ui])
對於空泛名字,不是說不能使用,是要有一個理由。

3.用具體的名字代表抽象的名字

ServerCanStart()就不如CanListenrOnPort好

4.使用字首和字尾來給名字附帶更多的資訊

為名字附帶更多的資訊:

  • 帶單位的值
    start --start_ms
    size--size_mb
    limit--max_kbps
  • 附屬你想表達的其他重要的屬性
    html---html_utf8
    password----plaintext_password
  • 匈牙利表示法是一個在微軟廣泛應用的命名系統,它把每個變數的型別資訊都編寫進名字的字首裡,
    比如pLast 表達某資料結構最後一個元素的指標p
    比如cch 表達一個字元ch的計數count
    比如psz表達一個以零結尾zero的字串s的指標p

5.決定名字的長度

名字的長短應該和這個變數如何使用有關係。

  • 在小的作用域可以使用短的名字,而如果一個識別符號有較大的作用域,那麼它的名字就要包含足夠的資訊以便含義更清楚。
    比如一個變數的作用域在一個方法內,它是允許不用帶上太多資訊的。因為所有的資訊(變數型別,初值等)都很容易被看到,所以可以用很短的名字
    而如果定義的m只是一個全域性變數中的類成員,那就不容易讀了。
  • 首字母縮略詞和縮寫
    BEManager--BackEndManager 對於這種縮寫是會讓人費解的,讓新成員閱讀這種可能會不理解,所以要保證對於縮寫的使用別人的易讀的。
    而doc替代document
    str代替string 這種就是可以的,
  • 丟掉沒用的詞
    ConvertToString()----ToString()這樣有時名字中的某些詞拿掉也不會損失任何資訊就可以丟掉這種詞

6.利用名字的格式來表達含義

類:名詞,採用大駝峰命名法--所有單詞的第一個字母大寫,儘量避免縮寫。ActivityManager
方法:動詞或動名詞,採用小駝峰命名法,除首單詞外,其餘所有單詞的第一個字母大寫
例如 onCreate()
變數:小駝峰命名法,可把統一的量詞放在結尾處。
常量:下劃線命名法,MIN_WIDTH


二、不會被誤解的名字

不會被誤解的名字是最好的名字,讓閱讀程式碼的人理解本意,不會有其他歧義。
例子1:filter("age<20");這就會讓人誤解,是挑出年齡小於20的還是把小於20的去掉 同樣的還有limit
例子2:clip(text,lenght)---truncate(text,max_chars) length 也是會有歧義的 是位元組數、字元數還是字數。

  • 用min和max來表示包含極限 大於等於 少於等於 max_ min_ 是很好的字首
  • 用first和last來表示包含的範圍
  • 用begin和end來表示包含/排除範圍
  • 布林值命名 通常來講:加上像is、has、can、should這樣的詞,可以把布林值變得更明確。

相關文章