關(guān)于代碼重構(gòu)

今天的主題是代碼重構(gòu)。好的代碼像剛出浴的美人,怎么看都看不夠,給人一種舒服的感覺;糟糕的代碼像邋遢的人,臟亂差,沒人愿意閱讀。作為一個輕度強迫癥,每次看到這樣的代碼,都難以忍受。

說到代碼重構(gòu),讓我想起吳軍在《文明之光》里講到的“壟耕種植法”,它由中國人發(fā)明創(chuàng)造,后傳至歐美,影響了全世界的糧食生產(chǎn)。據(jù)說歐洲人民還沒掌握這項技術(shù)以前,他們把種子隨意地撒在地里,任其自由生長,結(jié)果收成很低,如果種下20斤,大概只能收獲60斤左右糧食。而中國早在先秦時期畝產(chǎn)最少都在240斤以上,2007年我國小麥畝產(chǎn)達到720斤,這都得益于“壟耕種植法”。

寫代碼很像種地,要想有個好收成,就要好好管理代碼,讓它們有組織有紀律。嘿,看著多精神!當你看到糟糕的代碼,是改,還是不改?改吧,花時間;不改吧,會有隱患,可能將來就掉進這個坑,到時無論怎么罵娘都無濟于事。閑話少說,就說怎么改,以下是我認為比較有用的最優(yōu)實踐:

一、重構(gòu)是什么

簡單說,重構(gòu)是不影響程序外部行為的前提下,改善內(nèi)部結(jié)構(gòu),讓軟件設(shè)計更好,更容易理解,更持久、健壯、可擴展。

二、任務(wù)分解

首先是任務(wù)分解,將整個業(yè)務(wù)分解模塊,模塊分解子模塊,細之再細(稱為精細),直到不能再分。而不是把所有的業(yè)務(wù)邏輯放一堆,那會讓可讀性非常差。一般來說,人的關(guān)注點超過一個界限就不太能集中注意力,而出錯的概率也會相應(yīng)地提高。

經(jīng)常會看到一些代碼,他把所有邏輯放在一個方法體,從上往下讀,先讀第一塊邏輯,讀了很久還沒看到第二塊邏輯,這種代碼閱讀起來,體驗非常差。人的思維一般傾向于先整體再局部,否則很像“盲人摸象”,無法認清真相。看來,分解任務(wù)的方法也要符合人性的特點!

三、避免重復(fù)

避免重復(fù)就是程序的復(fù)用性,如果一個功能有兩處需要用到,就要考慮抽象成工具類或工具方法。往往只是多花一點點時間,就能讓維護的效率成倍增加,何樂而不為。程序喪失了復(fù)用性,也就不叫程序,就成了手工處理,純手工打造費事費力。避免重復(fù)性,最重要是時刻要有“工具”思維,怎么讓一個代碼盡可能處理更多的業(yè)務(wù),也就是“抽象”思維。

四、排列布局

優(yōu)先級很重要,很重要,很重要!任務(wù)分解成無法再分的原子后,按優(yōu)先級將之排列,優(yōu)先級高的(關(guān)鍵業(yè)務(wù))放在最顯眼地方,比如放到類的最上面。就像手機桌面,你一定會把最常用的軟件放在首頁;這樣,修改或找Bug時就能快速定位和排查。更多時候,這一點主要是針對某個類或架構(gòu)的某一層,讓它們看起來清晰明了,結(jié)構(gòu)化。另外,好的代碼結(jié)構(gòu)更容易看清業(yè)務(wù)邏輯,抽象起來也很容易。

五、格式、變量、注釋、條件判斷

格式,是我最在意的一個細節(jié),它就像是一個人的臉面,格式不好的代碼,很難勾起別人的欲望(你在想森么)。平時敲代碼,我都是自帶格式化,不需要格式化工具,你可能會說這很費時間。其實,當把它養(yǎng)成習(xí)慣并深入骨髓,一點都不花時間,很享受,不信試試?清爽的格式,讓你精神倍增,促使更多的產(chǎn)出。永遠相信,慢就是快!所以,該縮進的縮進,該換行的換行,該對齊的對齊,該空格的空格,該注釋的地方不要偷懶。

變量的命名,就是語義明確,看名知義。如果變量名都是 a,b,c,i,j,k,就脫離了業(yè)務(wù),技術(shù)永遠為業(yè)務(wù)服務(wù)。有語義的變量,才貼近業(yè)務(wù) ,才有人性,否則就是空中樓閣。

關(guān)于注釋,有人說,當你想要給代碼加注釋時,請先嘗試重構(gòu),好的代碼讓注釋變得多余(《代碼重構(gòu)》)。還有人說,一眼就能理解的代碼不需要加注釋。知乎上有一種說法,我是比較贊同:“注釋一定要有,但不需要太多,少而精是最好的。一定要重視并寫好注釋,為了湊數(shù)而寫注釋不如不寫。”類和方法上的注釋一般是不能省的,業(yè)務(wù)代碼的注釋就要看情況而定。如果代碼清晰,邏輯明了,變量名又很有“人性”,注釋可以不寫。

條件判斷指的是代碼塊里的if判斷,當一個判斷很復(fù)雜很長時,一定要拿出來單獨定義一個布爾變量,或定義一個判斷方法。有時if判斷的代碼都會超出屏外,閱讀起來很混亂。還有,if和其他嵌套不要超過3層。

六、結(jié)語

什么時候重構(gòu),我想最簡單的判定是:當你讀不懂一塊代碼或讀起來很費力時,就要考慮重構(gòu)了。另外,重構(gòu)應(yīng)該是隨時隨地,不要想單獨拿時間去重構(gòu),看到不好的代碼,立馬就修掉,世界就會清凈一點點。

At 2017.01.05

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容