<讀書筆記> 代碼整潔之道
概述
本文引用地址:http://m.butianyuan.cn/article/201608/294841.htm1、本文檔的內(nèi)容主要來源于書籍《代碼整潔之道》作者Robert C.Martin,屬于讀書筆記。
2、軟件質(zhì)量,不僅依賴于架構(gòu)和項(xiàng)目管理,而且與代碼質(zhì)量緊密相關(guān),本書提出一種,代碼質(zhì)量與整潔成正比的觀點(diǎn),并給出了一系列行之有效的整潔代碼操作實(shí)踐,只要遵循這些規(guī)則,就可以編寫出整潔的代碼,從而提升代碼質(zhì)量。
3、該書介紹的規(guī)則均來自于作者多年的實(shí)踐經(jīng)驗(yàn),涵蓋從命名到重構(gòu)的多個(gè)編程方面,具有很好的學(xué)習(xí)和借鑒價(jià)值。
4、習(xí)藝要有二:知和行。你應(yīng)當(dāng)學(xué)習(xí)有關(guān)規(guī)則、模式和實(shí)踐的知識(shí),窮盡應(yīng)知之事,并且對(duì)其了如指掌,通過刻苦實(shí)踐掌握它!
前言
學(xué)習(xí)整潔代碼很難,它不止于要求你掌握原則和模式,你還得在上面下功夫,并自行實(shí)踐,體驗(yàn)失敗。你須觀察他人如何實(shí)踐與失敗,怎樣蹣跚學(xué)步,再轉(zhuǎn)頭學(xué)習(xí)他們的路數(shù),。
本書要求你多用信息,多用功,而且非常用功。如何用功?-大量閱讀代碼,并琢磨代碼好在什么地方,壞在什么地方。
本書大概分為三部分:原則、模式和實(shí)踐。
一、 使用有意義的命名
1、名副其實(shí)
注意命名,一旦發(fā)現(xiàn)有更好的名稱就換掉舊的,這么做閱讀的人會(huì)更開心
名稱本身應(yīng)該能解釋其含義,無需注釋就能看懂是最佳。比如
int d;//消失時(shí)間,以日計(jì)
int elapsedTimeInDays;
前者名稱沒有任何含義,在程序中使用時(shí)看不出這個(gè)變量的實(shí)際作用,需要對(duì)應(yīng)注釋才能看懂,因此遠(yuǎn)不如后者的名稱好!
2、避免誤導(dǎo)
程序員必須避免留下掩藏代碼本意的錯(cuò)誤線索,避免使用與本意相悖的詞。
提防使用細(xì)節(jié)之處差別較小的名稱
使用相同的拼寫方式,前后拼寫不一致(大小寫不同),就是誤導(dǎo)。在使用編輯器名稱自動(dòng)補(bǔ)全功能時(shí),拼寫相近的變量容易引起誤選。
避免使用小寫字母l和大寫字母O作為變量名稱,易與1和0混淆
3、做有意義的區(qū)分
避免以數(shù)字系列命名,其無法提供正確的信息和導(dǎo)向作者意圖的線索。
不要使用意義相近的名稱,比如ProductInfo和ProductData變量不同,意思一樣,容易引起意義混淆
不要使用冗余信息,比如NameString,難道Name會(huì)是一個(gè)浮點(diǎn)數(shù)嗎?如果是,就不該使用Name命名。
4、使用讀的出來的名稱
人類善于記憶和使用單詞,如果名稱無法閱讀或者發(fā)音,就不是一個(gè)好名稱,討論和交流時(shí)也難以表達(dá)。
比如函數(shù)名稱為:genymdhms()//生成日期,年月日時(shí)分秒。
不要使用傻乎乎的自造詞,而要使用恰當(dāng)?shù)挠⒄Z(yǔ)單詞
5、使用可搜索的名稱
比如字母e,f等就不是一個(gè)好的變量名,其是英文常用字母,不方便搜索,
單字母名稱僅限于本地局部變量使用,名稱長(zhǎng)短應(yīng)該與作用域大小相對(duì)應(yīng)
如果程序中多出使用相同數(shù)字,實(shí)現(xiàn)相同功能,則需要使用宏定義變量代替。
比如WORK_DAYS_PER_WEEK就比數(shù)字5好搜索,也更能體現(xiàn)作者意圖
6、避免使用編碼
無需把類型和作用域編進(jìn)名稱,這樣只會(huì)自找麻煩,既不便發(fā)音,也容易拼錯(cuò),對(duì)解決問題毫無幫助。
匈牙利標(biāo)記法,破壞了不編碼的規(guī)則,不應(yīng)該采用。
也不必使用成員前綴,應(yīng)該把類和函數(shù)做的足夠小,同時(shí)使用可以高亮和顏色標(biāo)出成員的編輯環(huán)境。(Keil,notepad++都支持)。
7、避免思維映射
不應(yīng)當(dāng)讓讀者把你腦中的名稱翻譯成他們熟知的名稱,這個(gè)問題常見于選擇使用問題領(lǐng)域的術(shù)語(yǔ)還是解決方案領(lǐng)域的術(shù)語(yǔ)時(shí)。
在作為局部變量時(shí),并且名稱沒有沖突時(shí),可以采用i,j,k作為循環(huán)變量。
專業(yè)程序員善用其能,編寫能讓他人理解的代碼
8、類名
類名應(yīng)該是名稱或者名詞短語(yǔ),例如Customer、Account,避免使用Manager、Data、Info這樣的類名,其不應(yīng)該是動(dòng)詞。
9、方法名
方法名應(yīng)該是動(dòng)詞或者動(dòng)詞短語(yǔ),比如postPayment、deletePage或s**e,屬性訪問應(yīng)該加上set、get、is前綴
10、每個(gè)概念對(duì)應(yīng)一個(gè)詞
給每個(gè)抽象概念選用一個(gè)詞,并且一以貫之。比如使用fetch、retrieve、get在多個(gè)類的中同種方法命名,就容易引起混淆。
11、別用雙關(guān)語(yǔ)
避免將以此用于不同目的,同一術(shù)語(yǔ)用于不同概念就是雙關(guān)語(yǔ)了。
比如多個(gè)類中都有add方法,該方法通過增加或者鏈接兩個(gè)現(xiàn)存值來獲得新值,如果一個(gè)新類的含義是,把單個(gè)參數(shù)放到群集(collection)中,使用add名稱,雖然保持了名稱一致,你是含義卻不同,應(yīng)該使用insert才對(duì)。
12、使用解決方案領(lǐng)域的名稱
因?yàn)橹挥谐绦騿T才會(huì)讀取你的代碼,因此名稱應(yīng)該選擇解決方案領(lǐng)域的名稱,而不是問題設(shè)計(jì)領(lǐng)域的名稱。比如名稱AccountVisitor就比JobQueue富有意義。
13、使用源自所涉及問題領(lǐng)域的名稱
當(dāng)不能使用程序員所熟悉的術(shù)語(yǔ)命名時(shí),就應(yīng)該采用所涉及問題領(lǐng)域的名稱
與所涉問題領(lǐng)域更加貼近的代碼,應(yīng)當(dāng)采用源自問題領(lǐng)域的名稱
14、添加有意義的語(yǔ)境
很少有名稱能夠自我說明-多數(shù)都不能,因此需要使用良好命名的類、函數(shù)來放置名稱,給讀者提供語(yǔ)境。
比如添加前綴addrFirstName、addrLastName、addrState,就可以提供語(yǔ)境,這些變量屬于地址范圍。更好的做法是,創(chuàng)建一個(gè)名稱為Address的類,來存放這些相關(guān)變量。
語(yǔ)境的增強(qiáng)也讓算法能夠通過分解為更小的函數(shù)而變得干凈利索。
15、不要添加沒有意義的語(yǔ)境
比如應(yīng)用(Gas Station Deluxe)簡(jiǎn)稱為GSD,因此為每個(gè)函數(shù)、類、變量增加同樣的前綴就GSD命名就不是一個(gè)好點(diǎn)子。
Address是個(gè)好名稱,但是如果需要與MAC地址、端口地址或Web地址區(qū)分,應(yīng)當(dāng)使用PostalAddress、MAC、URI,這樣的名稱更為精確。
16、總結(jié)
取名字最難地方在于需要良好的描述技巧和共有的文化背景
試試上面的規(guī)則,看你的代碼的可讀性是否有所提升。如果維護(hù)別人的代碼,使用重構(gòu)工具來解決問題,效果也好立竿見影,而且會(huì)持續(xù)下去。
評(píng)論