Martin Fowler講述重構的工作流程

infoq發表於2014-02-26

  《重構:改善既有程式碼的設計》一書的作者Martin Fowler最近在其個人網站上發表了一篇文章,探討了如何通過各種工作流程來將程式碼重構融入到我們日常的程式設計工作當中。

  在文章中他還介紹瞭如何使用各種不同的工作流程,並且建議“為了最有效地進行程式碼重構,我們需要結合使用所有的重構工作流程,這樣才能使不同的流程無縫地融入到開發工作當中”。

 

  Fowler將重構定義為“……一項用於對既有程式碼的主體結構進行調整的專門技術,可以在不影響其外部行為的情況下修改其內部結構”。

  Joshua Kerievsky在其著作《重構與模式》中建議:

通過持續地改善程式碼的設計,我們可以使程式碼變得越來越容易維護。這與通常所採用的做法形成了鮮明的對比。通常我們很少做程式碼重構,而是把大量的注意力放在如何方便快捷地新增新功能上面。如果我們養成了持續重構的良好習慣,就會發現程式碼變得越來越容易擴充套件和維護。

雖然在文中Fowler講到重構技術現在已經為人們所熟知,但他還是建議大多數的團隊仍然需要去更好地瞭解實施重構過程中可以使用的各種工作流程,以便在各種情況下都能夠選擇出最佳的流程加以應用 。

  基於Don Roberts提出的三次法則,網站SourceMaking描述了需要進行程式碼重構的下列幾種情形。

“第一次做某件事情時,可以只管去做。第二次做類似的事情時,雖不情願,但總之還是把同樣的事情重複又做了一遍。而第三次做類似的事情時,就要進行重構。”

  • 當新增新函式時
  • 當修復bug時
  • 當進行程式碼評審時

  Fowler使用了“兩頂帽子”的比喻,向我們解釋了有些時候我們是在新增新的功能(新增功能帽子),而另外一些時候我們是在改善既有程式碼的質量(重構帽子)。這樣的比喻還能夠作為我們日常程式設計工作中的提醒,使我們清楚地認識到自己究竟工作在哪種角色下。在文中他還講到“在程式設計過程中,我們可能需要在不同的帽子間頻繁地轉換,可能每隔幾分鐘就要轉換一次,但我們每一時刻只能帶一頂帽子”。

  藉著上面的比喻,Fowler描述了第一種工作流程,可能也是使用最為廣泛的一種流程,名字叫做“使用測試驅動開發進行重構”。這種流程基於以下迴圈:開始於綠色狀態,編寫測試用例(現階段會執行失敗),然後編寫程式使之能夠通過測試,最後再對程式碼的質量進行改進。來自planetgeek.ch 的Urs Enzler 詳細描述了測試驅動開發與重構之間的關係。

  “撿垃圾式的重構”是下一種工作流程。Fowler在文中提出,這種流程可以應用在程式碼中出現大面積混亂段落時的情景。這種流程的基本原理就是“每次都對我們用到的部分程式碼進行清理,這樣會簡化我們下次使用時所需要做的清理工作。這種方法甚至還可以使當前要做的修改也變得容易”。

  之後Fowler還詳細地解釋了“針對程式碼可理解性的重構”。這種重構旨在使程式碼變得簡單易懂,進而使程式變得易於使用和維護。文章中還引用了一段Ward Cunningham的話來補充這一觀點:

每當你不得不去搞明白一段程式碼究竟做了哪些事情的時候,在你的頭腦中就會形成對於這段程式碼功能的一些理解,而一旦形成了這些理解,你就應該把它們固化到程式碼中,這樣其他人就不必對這段程式碼再從頭理解一遍。

  文中還描述了其他三種工作流程,Fowler認為它們與前面所講的三種流程同樣重要:

  • “準備性的重構”——當我們開始開發一項新功能時可以採用這種方法。
  • “有計劃的重構”——當問題程式碼太多,必須專門花時間來進行重構時可以採用這種方法。
  • “長週期的重構”——當我們需要在幾輪迭代過程中替換掉一個較大的模組時可以採用這種方法。

  你們是否也一直在做程式碼重構?

  英文原文:Martin Fowler Presented Workflows of Refactoring

相關文章