您好,登錄后才能下訂單哦!
整潔的代碼
1.習藝之要
1).知:習得有關原則、模式和實踐的知識,窮盡應知之事,并且要對其了如指掌
2).行:通過刻苦實踐掌握它
2.閱讀本書原因
1)。你是個程序員
2)。你想成為更好的程序員
3.勒布朗法則:
稍后等于永不
4.花時間保持代碼整潔不但有關效率,還有關生存
5.程序員遵從不了解混亂風險的經理的意愿,也是不專業的做法
6.趕上期限的唯一方法,做得快的唯一方法----就是始終盡可能保持代碼整潔
7.破窗理論
8.整潔的代碼只做好一件事
力求集中,每個函數、每個類、模塊都全神貫注于一事,完全不受四周細節的干擾和污染
9.整潔的代碼應當明確展現出要解決問題的張力
10.簡單代碼規則:
按重要順序:
.能通過所有測試
沒有重復代碼
體現系統中的全部設計理念
包括盡量少的實體,比如類、方法、函數等
無重復代碼:
如果同一段代碼反復出現,就表示某種想法未在代碼中得到良好的體現,應該盡力
去找出到底那是什么,然后再盡力更清晰地表達出來
11.提高表達力
1)。有意義的命名
2)。只做一件事
3)。小規模抽象
12.想要干得快、想要早點做完、想要輕松寫代碼,先讓代碼易讀
有意義的命名
1.一旦發現有更好的名稱,就換掉舊的
2.名副其實
如果名稱需要注釋來補充,就不是名副其實
3.避免誤導
做有意義的區分
使用讀得出來的名稱
使用可搜索的名稱
如:MAX_CLASSES_PRE_STUDENT
4.類名
類名和對象名應該是名詞或名詞短語,如Customer WikiPage Account
AddressParser
不應該是動詞
5.方法名
應該是動詞或動詞短語,如postPayment deletePage save
屬性訪問器、修改器、斷言,應該根據其命名前加上get、set、is前綴
函數
1.短小是函數的第一規則
2.只做一件事,做好這件事
3.每個函數一個抽象層級
如 getHtml() 高
PathParser.render(pagePath) 中
.append("\n") 低
函數中混雜不同的抽象層級,會讓人迷惑
自頂向下讀代碼:向下規則
4.函數參數
最理想的參數是零(零參數函數),其次是一,盡量避免三個參數及以上的函數
從測試角度,參數越多越難測
5.轉換結果的函數應該體現在返回值
6.應該盡量將二元函數轉換為一元函數(元:參數個數)
7.參數對象
如果函數看來需要三個或以上參數,說明其中一些參數應該封閉為類
如:
Circle makeCircle(double x, double y, double radius);
|
Circle makeCircle(Point center, double radius);
從參數創建對象,從而減少參數數量,當一組參數被共同傳遞,往往就是該有自己名稱的某個概念的一部分
8.動詞與關鍵詞
給函數取好名字,能較好地解釋函數的意圖,以及參數的順序和意圖
如一元函數 writeFile(name) 動詞/名詞
將參數的名稱編碼成函數名,如
assertEqual->assertExceptedEqualsActual(excepted, actual)
9.避免使用輸出參數,如果函數必須修改某種狀態,就修改所屬對象的狀態
面向對象語言中對輸出參數的大部分需要已經消失,因為this也有輸出參數的意味
10.分隔指令與詢問
public boolean set(String attribute, String value);
if(set("username", "unclebob"))...
上述為指令與詢問都在set函數中,應該改為
if(attributeExists("username")) {
setAttribute("username", "unclebob")
}
11.使用異常替代返回錯誤碼
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch (Exception e) {
logger.log(e.getMessage())
}
完美的隔離(try catch 代碼塊主體抽離 )
public void delete(Page page) {
try{
deletePageAndAllReferences(page);
}catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deltePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e)
{
logger.log(e.getMessage());
}
12.錯誤處理就是一件事
如上述代碼,如果關鍵詞try在某個函數中存在,它就是該函數的第一個單詞,而且在catch/finally代碼塊后面也不該有
其他的內容
13.依賴磁鐵
public enum Error {
OK,
INVALID,
NO_SUCH,
LOCKED;
}
使用異常替代錯誤碼,新異常就可以從異常類派生出來,無需重新編譯或重新部署
14.重復可能是軟件中一切邪惡的根源
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。