重構程式碼的7個階段

coolshell發表於2013-04-12

  你曾去想重構一個很老的模組,但是你只看了一眼你就噁心極了。文件,奇怪的函式和類的命名,等等,整個模組就像一個帶著腳鐐的衣衫襤褸的人,雖然能走,但是其已經讓人感到很不舒服。面對這種情況,真正的程式設計師會是不會認輸的,他們會接受挑戰認真分析,哪怕重寫也在所不惜。最終那個模組會被他們重構,就像以前和大家介紹過的那些令人銷魂的程式設計方式中的屠宰式程式設計一樣。

  下面是重構程式碼的幾個階段,文章譯自《The 7 stages of refactoring》這篇文章。內容如下:

  第一階段——絕望

  在你開始去檢視你想要重構的模組的,你會覺得好像很簡單,這裡需要改一個類,那裡需要改兩到三個函式,重寫幾個函式,看上去沒什麼大不了的,一兩天就搞定了。於是你著手開始重構,然後當你調整重構了一些程式碼,比如改了一些命名,修理了一些邏輯,漸漸地,你會發現這個怪物原來體型這麼大,你會看到與程式碼不符甚至含糊不清的註釋,完全摸不著頭腦的資料結構,還有一些看似不需要方法被調了幾次,你還會發現無法搞清一個函式呼叫鏈上的邏輯。你感到這個事可能一週都搞不定,你開始絕望了。

  第二階段——找最簡單的做

  你承認你要重構的這個模組就是一個可怕的怪物,不是一兩下就可以搞定的,於是你開始著幹一些簡單的事,比如重新命名一下幾個函式,移除一些程式碼的阻礙,產生幾個常量來消除magic number,等等,你知道這樣做至少不會讓程式碼變得更糟糕。

  第三階段——再次絕望

  但是接下來的事會讓你再次撞牆。你會發現那些程式碼的瑕疵是些不痛不癢的事,改正這些事完全於事無補,你應該要做的事就是重寫所有的東西。但是你卻沒有時間這麼幹,而這些程式碼剪不亂理還亂,耦合得太多,讓你再一次絕望。所以,你只能部分重寫那些不會花太多時間的部分,這樣至少可以讓這些老的程式碼能被更多的重用。雖然不完美,但是至少可以試試。

  第四階段——開始樂觀

  在你重構這個模組幾天之後,不斷的重構了幾次,雖然你發現改善程式碼的進度太慢了,但此時,你已知道程式碼應該要被改成什麼樣,你在痛苦之後也鎖定了那些那修改的類。是的,雖然你的時間預算已經超支,雖然要乾的事比較多,但你還是充滿希望,覺得那是值得的。

  第五階段——快速了結

  這個時候,你知道你花了太多的時間,你感到你所面對的情況越來越讓你越到不安,你明白你自己已經陷入了困境。你原本以為只需要一次簡單的重構,然而現在你要面對的是重寫所有的東西。你開始意識到原因是因為你是一個完美主義者,你想讓程式碼變得完美。於是你開始在怠慢你文件,併到到一個捷徑來重寫老的程式碼,你開始採用一些簡單而粗暴,快速而有點骯髒的方法。雖然不是很完美,但你就是這樣去做了。然後,你開始執行測試做UT,發現UT報告上全是紅色,幾乎全都失敗了,你恐慌了,於是快速地fix程式碼,然後讓UT 能工作。此時,你拍拍自己胸口,說到,沒問題 ,於是就反程式碼提交了。

  第六階段——修改大量的Bug

  你的重寫並不完美,雖然其過了測試,但是那些測試對於你的新的程式碼有點不太合適,雖然他們都沒有報錯,但是他們測試得範圍太小了,沒有覆蓋到所有的情況和邊界。所以,在這以後,你還需要幾周的時間不得不來修改越來越多的bug,這使得你的設計在每一次quick-fix後就變得越來越難看。此時,程式碼已經不像你所期望的那樣完美了,但你依然覺得他還是比一開始要好一些。這個階段可能歷經幾個月。

  第七階段——覺悟

  經過了6個月,你重寫的模組又出了一個比較嚴重的bug。這讓你重構的那個模組變得更難堪。你發現出的這個問題是和當初的設計不一致,你還發現被你重構掉的那段老的程式碼並不是當初看上去的那麼壞,那段老的程式碼確實考慮到了一些你未曾考慮到的事情。這個時候,你團隊裡有人站出來說這個模組應該被重構或是重寫,而你卻不動聲色地一言不發,並希望那個站出來的人能在幾個月後能覺悟起來。

  不知道這是不是你的經歷,我經歷過很多次這樣的事。對於很多維護性質的專案,我幾乎不敢動,那怕看到程式碼很不合口味。那些從來沒有寫過程式碼的敏捷諮詢師一定會說用TDD或是UT可以讓你的重構更有效也更容易,但我想告訴你,這種脫離實際的說法很不負責任,這就好比說—— 我在殺豬的時候遇到了一些麻煩,因為我對豬的生理結構不清楚,或是這本來就是一頭畸形的豬,導致我殺的豬很難看,而偉大的敏捷諮詢師卻告訴我,要用一把更快更漂亮的刀。軟體開發永遠不是那麼簡單的事,殺豬也一樣。

  相關文件:你需要的不是重構,而是理清業務邏輯

相關文章