三天看完一本書,說出來我都不信,不過我還真是史無前例的做到了, 現在分享一下我的收獲,希望大家拍磚,共同討論一下.
<<會說話的代碼>>一書是我們BJDP小組里的王洪亮老師的一本著作,第一次聽王老師分享時,就被王老師的技術折服了,如果大家在北京,有興趣的話可以參與我們這個"北京設計模式學習小組(BJDP)"(免費參與哦), 相信每一個人都會有所收獲 .
還是說回書,這本書主要闡述了怎么樣讓我們寫的代碼具有自我的表達能力,讓每一個程序員都能看懂,而且易擴展和維護.主要從以下幾個方面着手:命名,注釋,風格與結構,架構.(以下內容是我從書總結出來,再加上自己的理解,如有不對,與作者無關哦)
1. 命名:
1)最好全要英文,不要加入地方特色(拼音,法語之類),
2)最好不要使用縮寫,相似單詞太多了,對con-有太多的猜測,(除那些約定俗成的)
3)最好不要超過16個字符,太長不容易看懂,而且命名太長可能是設計上有問題.
4)見名知義,無意義的名字最好不要起:temp,a,para1,list (循環變量除外).
5)包或項目的名稱:組織/公司+項目+功能/模塊,如.Microsoft.Windows.Common.Controls這樣能避免與第三方模塊集成出現重名的情況.
6)接口不要以I開頭,有時一開始定義的接口,改着改着就成了抽象類了,此外要說推薦,就推薦使用-able結尾表能力,如Cloneable,Runnable.
7)基類要選用具有通用意義的名詞:Model,View,Control.有些抽象類可以加前綴Abstract+
8)方法命名:動詞(+名詞).這里名詞根據實際情況可有可無,如果有的話,根據返回值的情況確定是否用復數形式.
9)考慮使用時樣子如類名LeapYear,方法名isLeapYear,初看都不錯,但使用時就發現LeapYear.isLeapYear()不如LeapYear.isLeap()更好.
10)常量都大寫,單詞多的話之間采用下划線,常量多的話可以通過開頭詞進行分組.
11)多使用對應詞語:
min max | positive negative | start stop | begin end | source destination | from to | previous current next | create destory | plus minus |
connect close(disconnect) | upload download | add remove | add sub | enable disable | pause resume | open close | initialize finalize | request response |
success fail | bottom top | include exclude | input output | import export | width height | up down | valid invalid | push pop |
get set | first last | befor after | ||||||
2. 注釋
1)如果有版本管理工具,那么就不要修改記錄的注釋了.
2)如果你還不知道todo那就要查一下啦
3)JavaDoc不是萬能的,對那些需要指明的地方,還需要我們特別注釋.
4)異常處理中 如果catch不做任何處理,那就需要寫注釋.
3. 風格與結構
1)看看自己寫的代碼是否整齊,IDE可以幫助我們縮進對對齊,以表現出更好的代碼層次關系.
2)長方法,我個人理解超出一屏就太長了,IDE的Rafactor就派上用場了:提取方法,或者看一下是不是這個方法做了不該它做的事.
3)某行太長,每次只能拖到滾輪才能看全的行,是不是太長了呢,
4)去掉false 和true:if(candidate.visible==false)與if(!candidate.visible)哪個更好一些呢.
5)長參數列表,有的書說參數個數可以是7+-2,本人作者建議參數小於3,最好一個都不要.我覺得如果架構設計的好的話,可以實現(有難度啊),起碼是個方向.具體方法是:引入參數對象或提取字段.
6)長分支:if else或swich Case.解決辦法有:合並同類項(減少代碼),狀態/策略模式(會生成多個類,可以通過配置文件進和步簡化),
7)魔法數字與魔法字符串:硬編碼在代碼的數字或字符,不僅不易修改,而且還看不懂它是什么意思.用配置文件試一試.
8)去掉return前的判斷:比較以下三段代碼:你會發現....
1 //first para 2 public boolean hasMore(){ 3 boolean flag=false; 4 if(list.size()>0){ 5 flag=true; 6 } 7 return flag; 8 } 9 10 11 //second para 12 public boolean hasMore(){ 13 if(list.size()>0){ 14 return ture; 15 } 16 return false 17 } 18 19 20 //third para 21 public boolean hasMore(){ 22 return list.size()>0 23 }
9)嵌套過深圈復雜度越高,越容易引起Bug,主要的方法有:提取方法(雖然實際上沒有減少層數,不過會改后續重構提供方便),提前判定,用while代替for
具體實例,請看書中的實例.
10)Don't Repeat Yourself:老生常談的問題了.解法有:同一類內的提取方法,子類間的抽取方法到父類,相互之間沒關系類可以把共有方法移植到工具類.
11)采用正則表達式進行內容或格式校驗.替代那些if else if .....
12)使用Lambda表達式簡化代碼.
4.架構
1)通過使用OOA與OOD來設計系統.
2)盡量滿足SOLID設計原則.
3)想要實現以上兩點:去啃本GOF的設計模式吧.
書中內容有很多,我只是選取了其中的一部分,作為我的讀書筆記, 不算是"書透"吧,希望王老師不要責怪.
以后爭取每讀完一本書,都寫一篇讀書筆記,對自己的幫助真的很大.也希望大家看了,能夠有所收獲.