重構經過了十幾年的發展和應用,可以說它是極限程式設計中程式設計師最愛的實踐之一了,紛紛爭相在專案裡應用。重構工作坊、codekata重構練習等各種提公升能力的方式也屢見不鮮,幫助程式設計師們去追求優秀的**和設計。然這仍然擺脫不了人們對它的各種抱怨:「搞什麼,又重構」,「重構出defect來了」,「專案緊,最近不要再重構了」,「重構到什麼時候停呀」。小菜也這樣被專案中的人抱怨著,覺得很委屈,找到了大牛小明。
小菜:有一大段**不合我意,寫的很爛。我就想最近剛好新學了點技巧,看了下模式,趕緊大幹一場。沒想到做著做著組裡都反對。小明:那你有什麼目標?重構想達到什麼效果?
小菜:目標?啥意思?
小明:我們做事情得有目標,重構任務也是一樣的。
小菜:我不太清楚,我就是想把這段**改了,我刪了好多**,測試好多都紅了。專案好像下週發布,專案經理小東也問我什麼時候完工;測試小花還說我前兩天做的功能有問題,問我是不是又重構了;
小明:你呀,今天來對了。這兩天我也在琢磨這個戲,重構七宗罪,正好給你來講一下。
「沒有目標而生活,恰如沒有羅盤而航行。」做事情得有乙個目標,拿計程車舉例:「師傅,我要去機場」。計程車師傅很清楚我們的目的地。然如果我們說,「師傅,我就是來坐車的,你隨便開吧」,就是再有經驗的司機也沒辦法把你送到終點。重構也是一樣,它需要能夠解決一定的問題,要有乙個目標的引領,否則黑咕隆咚做了半天也不知道自己做了啥,最後不得不全部回滾,白費工夫。
那麼重構是什麼,它解決什麼問題呢?
所謂重構是對軟體內部**及其結構的調整,期望改善**質量,促使程式設計架構更趨合理。說白了,重構解決的就是**和**結構的問題,它開始自壞味道,其目標就是要消除壞味道,消除那些「不合我意」的因素,讓**的意圖更清晰。
martin在《重構》一書中提到了22個常見的**壞味道,都可以作為我們重構的目標,來指引我們的重構。如:
- 消除同一類兩個方法之間的重複**
- 消除某一類中的長方法
- 重新命名
- 刪除a類中的死**
- 簡化複雜的條件語句
同時,重構的範圍也應是那段壞味道的**,在重構過程中對其,也僅對其進行修改。
小菜:我明白了。這一段**其實我就是想先去除重複問題的,結果改著改著就改到別的地方了。
經理,我先改上50塊錢的,你看行不行?重構是整理**保持輕裝前行的重要手段,然而我們也需要能夠明確知道重構要做什麼,最終的產出如何驗證。總不能對專案經理說,我先改上50塊錢的?
上文提到了消除複雜條件語句是這次重構的目標,那麼簡化22行-32行複雜的條件語句就是乙個更具體的重構目標。有了這樣乙個具體清晰的目標,「重構什麼時候停」也就是乙個很容易回答的問題了,不用擔心專案經理天天問你啥時候完工了。
重構其實不僅有**級別的重構,還包括模組級別的重構、架構級別的重構。不同級別的複雜度不同,消除的壞味道不同,需要的時間也不同。一般來講**級別的重構可以在小時和天以內,架構級別需要的時間會更長一些,比如幾周或幾月或幾年。
「非常的建設需要非常的破壞。」很多人都認同這一觀點。但對遺留的應用軟體、構築過半的專案卻容不得推倒重來。以我觀察,在開始重構時僅憑自己對**的理解就進行剪下、複製、刪除、新增等大刀闊斧修改的人不在少數,尤其還沒有完全掌握重構手法的新人們。結果當然錯誤百出,導致測試「獎賞」一片紅。修復這些錯誤**少則幾個小時,多則幾天,這不是重構,這是重寫。
小菜:那怎麼破呢?所以小菜啊,這是20個招式,回去加緊練習啊;三月後再來見我。
小菜:是不是就像拳擊比賽,不能空有一身蠻力,也得有技巧。重構過程中,經常出現為了消除乙個壞味道,改了a類的方法,又改了b類的變數,不得不改了c類;最後發現這三者之間還有依賴,導致進行不下去了,波及面越來越廣,時間越來越長,專案經理在催,最後不得不放棄所有的**。小明:孺子可教也。
老子說:「治大國,如烹小鮮。」調整乙個正在執行中的系統也如治國,不要期望一次性調整到漂亮的**或架構,而是要遵循「小步前進」的方法。從問題著手,每次重構一小步。針對乙個問題有目的修改,修改完後測試,測試通過後提交**,再進入下一輪重構。如果在改動過程中發現了其他需要修改的地方,不要順便重構,你可以把它記下來,作為下一輪重構的內容。
這種做法在**和模組層面都是相對比較容易實踐,而針對架構層次的調整就相對比較複雜。這也是很多架構師需要去思考的問題,如何漸進式重構。不搞一下子半年一年的重構,而是以週以月為單位,快速的迭代,能夠很快的驗證結果獲得收益。
對於簡單的**級別重構如果做得好是可以不用驗證結果的,然對於模組級別或架構級別的重構,是需要的。在我遇到的多次重構架構失敗的例子中,很多是因為越做越發現很難驗證結果的正確性,越做越不知道改的對不對,最後發現很難回答老闆和客戶的問題不得不失敗。
同時也可以借助於sonar、structure101這樣的一些成熟工具度量和管理這些結果。
《重構》是martin和kent對他們多年以來整理**的實踐的總結,然這背後體現的是他們對軟體技術的深層次思考和經驗。很多新人執著於學習重構手法而疏於學習背後的心法,有些可惜。
robert c martin的《**整潔之道》和《敏捷軟體開發:原則、模式與實踐》、《設計模式》、eric的《領域驅動設計:軟體核心複雜性應對之道》、《架構之美》等都是幫助大家修煉心法的不錯選擇,他們可以讓你更深層的了解**,更高層面看待系統,鍛鍊你的嗅覺,提公升你的**能力。
我們不得不承認對**的重構是有風險的,尤其是模組或架構級別。這段**的業務是什麼,為什麼當時這麼設計,測試覆蓋率是多少,如果這樣改會不會影響到其他模組?對其他角色有什麼影響?這些問題都要逐一回答。在風險相對較大的改動更要如此,需要和團隊成員,各個角色,包括專案經理和客戶進行溝通,談論這次重構的好處和風險,獲得足夠的評估,從而能夠做出合適的重構決策,將風險降到最低。
今天就聊這些吧。不過小菜啊,你不要擔心,重構和做其他事情一樣,要有目標有方法有策略有結果。我們在進行的時候需要以終為始,不忘本心。最重要的是要提公升技術能力,學習安全重構手法,小步前進,漸進式的重構,不斷驗證重構的收益,才能迎接乙個乙個的重構任務,真正的成為清理**的高手。
加油吧,我看好你哦。
學習七宗罪
理論 b color red 實踐 color b 掌握 b 誤區一 注重理論,輕視實踐 學習新知識前想把關於這方面的理論全部掌握後再去實踐。b 解決方法 在了解理論之後,就立即去實踐,實踐驅動理論的學習,這樣掌握理論才更加紮實,不容易忘記 b 誤區二 不善於做筆記,不善於總結。b 解決方法 人總是...
我的七宗罪
我的七宗罪 前幾天看到乙個很有意思的部落格,首頁上寫著一句我非常欣賞的一句話,回味至今 珍愛生命,遠離部落格 說得真好!火熱的世界盃讓我暈頭轉向 連 都有一半不准了,呵呵 趁現在睡不著 凌晨6 04 頭腦清醒,列舉一下我的七宗罪吧。罪行一 吸菸量遞增 慢性自殺 慢性殺老婆 慢性殺同事 呵呵,跟我一起...
絕望的《七宗罪》
本文 昨天深夜看完了 七宗罪 這是一部有濃厚宗教色彩的 看到片名,就想起與之相似的 第七封印 如果說伯格曼在 第七封印 中對信仰的根源和上帝的存在進行了追問和 那麼 七宗罪 展示的就是如果丟掉信仰,世界將會怎樣。影片中的紐約,灰暗 潮濕 骯髒 混亂,接連不斷的 簡直就是人間地獄。開頭是老少兩代警官追...