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