1、命名篇
- 避免使用誤導性的命名,比如是
List
類型變量才會命名為accountList
;不使用小寫的字母L和大寫的字母O來命名變量,因為他們會和數字1和0混淆 - 變量的命名使用有區分意義的詞。比如,
ProductInfo
和ProductData
就沒區分;Info
和Data
就像the
、a
、an
一樣是混淆的廢話;變量名不出現Variable
,表名不出現Table
- 類名不出現
Manager
、Processor
、Data
、Info
這類類名;類名必須是名詞 - 使用工廠來新建對象比
new
對象要好,可以將構造函數private
化,比如Complex.fromRealNameNumber(23.0)
比new Complex(23.0)
要好 - 每個概念只使用一個詞。比如,
fetch
、retrive
和get
表示一個意思,盡量別同時出現多個
2、函數篇
- 函數應該短小,20行封頂最佳
- 函數應該只做一件事情,如果一個函數可以繼續拆分,則說明該函數不止做了一件事
switch
語句如果太長,可以考慮使用多態
來替代- 函數名不要怕長,最好使用描述性的名稱,能表達出函數的意義就好
- 函數參數:
- 函數的參數越少越好,最好別超過三個,三個或三個以上可以封裝成一個對象
- 對於傳入單個參數的函數,一種普遍的作用是使用該參數做別的事,另一種是操作該參數本身。這種情況參數名最好能區分這兩種形式,比如
String transform(StringBuffer in)
,告訴讀者期望的輸入和輸出類型。 - 如果需要向函數傳入布爾值,可能考慮將函數分為兩個函數使用
- 函數名最好由動詞加名詞組成,比如
write(name)
就不如writeFiled(name)
好,后者清楚知道name
是個filed
- 函數名要明確描述函數所做的所有事情,避免給調用者帶來意外的混亂
- 使用異常代替返回錯誤碼。錯誤碼是在要求調用者立即處理錯誤,異常可以在后面統一處理
- 使用了
try...catch
的代碼塊最好單獨抽離出來一個函數,再調用他,避免把主流程混亂 - 消除重復的代碼
3、注釋篇
-
注釋的作用是彌補我們在用代碼表達意圖時遭遇的失敗,所以說,注釋是一種失敗!
-
如果遇到需要寫注釋的情況,可以優先考慮是否能用變量名或方法名來表達,比如下面,第二種表達會更好:
// 判斷員工是否合法,並且年齡大於65歲 if(employee.flag && employee.age > 65) if(employee.isEligibleForFullBenefits())
-
好的注釋使用范圍:
- 表明法律、作者信息
- 提供有用的信息,比如對抽象函數注釋、對一個正則表達式期望匹配的格式注釋等
- 闡釋,對一個比較難懂的參數或返回值進行說明
- 警示,對一些重要代碼進行警示,防止別人修改該代碼
// TODO
對未完成的工作進行注釋- 公共API的Javadoc
-
壞的注釋實例:
-
多余的注釋,比如有無注釋意圖都很明顯的代碼
-
誤導性注釋,注釋和代碼實際行為不符合
-
循規式注釋,比如要求所有函數都要有Javadoc注釋
-
能用函數或是變量名時,就別用注釋
-
括號后后面的注釋,本意是好的,但是根本解決方法應該是縮短函數篇幅
while(xxxx){ ....... if(xxx){ ...... } // if } // while
-
注釋掉的不用的代碼直接刪除,別怕找不回
-
4、格式篇
-
封包聲明、導入聲明和每個函數之間使用 空行 隔開,提高代碼的視覺效果
-
質檢關系“親密”的概念應該相互 靠近,而不是空行隔開
-
變量的聲明應該在 靠近 使用的位置
-
類成員變量應該聲明在類的頂部,循環中變量應該在括號內聲明
-
相關函數,比如A函數調用了B函數,則A和B最好放在一起,而且A放在B上面
-
每行代碼長度最好不要太長,比如最好80個字符,或是100~120個字符內
5、對象和數據結構篇
-
類的私有變量如果提供了取值器和賦值器,那么它仍然是 暴露 了
-
墨忒爾定律:模塊不該去了解它所操作對象的內部情形。就是說,對象不改通過存取器暴露其內部變量。更准確的說,墨忒爾定律認為,類
C
的方法f
只能調用以下對象的方法
:- C
- 由f創建的對象
- 作為參數傳遞給f的對象
- C的成員變量的對象
即,方法不該調用任何函數返回的對象的方法,只跟朋友對話,不與陌生人對話
6、其他
- 函數不要返回控制,避免使用時檢查
- 函數參數不要傳遞空值
- 第三方API如果拋出大量異常,可以考慮封裝下再使用
說明:本文整理了部分書中觀點,有些觀點個人感覺有點苛刻不太實用,還有些章節直接略過了。想更詳細了解請參考原著。