Martin Fowler講述重構的工作流程
《重構:改善既有程式碼的設計》一書的作者Martin Fowler最近在其個人網站上發表了一篇文章,探討了如何通過各種工作流程來將程式碼重構融入到我們日常的程式設計工作當中。
在文章中他還介紹瞭如何使用各種不同的工作流程,並且建議“為了最有效地進行程式碼重構,我們需要結合使用所有的重構工作流程,這樣才能使不同的流程無縫地融入到開發工作當中”。
Fowler將重構定義為“……一項用於對既有程式碼的主體結構進行調整的專門技術,可以在不影響其外部行為的情況下修改其內部結構”。
Joshua Kerievsky在其著作《重構與模式》中建議:
通過持續地改善程式碼的設計,我們可以使程式碼變得越來越容易維護。這與通常所採用的做法形成了鮮明的對比。通常我們很少做程式碼重構,而是把大量的注意力放在如何方便快捷地新增新功能上面。如果我們養成了持續重構的良好習慣,就會發現程式碼變得越來越容易擴充套件和維護。
雖然在文中Fowler講到重構技術現在已經為人們所熟知,但他還是建議大多數的團隊仍然需要去更好地瞭解實施重構過程中可以使用的各種工作流程,以便在各種情況下都能夠選擇出最佳的流程加以應用 。
基於Don Roberts提出的三次法則,網站SourceMaking描述了需要進行程式碼重構的下列幾種情形。
“第一次做某件事情時,可以只管去做。第二次做類似的事情時,雖不情願,但總之還是把同樣的事情重複又做了一遍。而第三次做類似的事情時,就要進行重構。”
- 當新增新函式時
- 當修復bug時
- 當進行程式碼評審時
Fowler使用了“兩頂帽子”的比喻,向我們解釋了有些時候我們是在新增新的功能(新增功能帽子),而另外一些時候我們是在改善既有程式碼的質量(重構帽子)。這樣的比喻還能夠作為我們日常程式設計工作中的提醒,使我們清楚地認識到自己究竟工作在哪種角色下。在文中他還講到“在程式設計過程中,我們可能需要在不同的帽子間頻繁地轉換,可能每隔幾分鐘就要轉換一次,但我們每一時刻只能帶一頂帽子”。
藉著上面的比喻,Fowler描述了第一種工作流程,可能也是使用最為廣泛的一種流程,名字叫做“使用測試驅動開發進行重構”。這種流程基於以下迴圈:開始於綠色狀態,編寫測試用例(現階段會執行失敗),然後編寫程式使之能夠通過測試,最後再對程式碼的質量進行改進。來自planetgeek.ch 的Urs Enzler 詳細描述了測試驅動開發與重構之間的關係。
“撿垃圾式的重構”是下一種工作流程。Fowler在文中提出,這種流程可以應用在程式碼中出現大面積混亂段落時的情景。這種流程的基本原理就是“每次都對我們用到的部分程式碼進行清理,這樣會簡化我們下次使用時所需要做的清理工作。這種方法甚至還可以使當前要做的修改也變得容易”。
之後Fowler還詳細地解釋了“針對程式碼可理解性的重構”。這種重構旨在使程式碼變得簡單易懂,進而使程式變得易於使用和維護。文章中還引用了一段Ward Cunningham的話來補充這一觀點:
每當你不得不去搞明白一段程式碼究竟做了哪些事情的時候,在你的頭腦中就會形成對於這段程式碼功能的一些理解,而一旦形成了這些理解,你就應該把它們固化到程式碼中,這樣其他人就不必對這段程式碼再從頭理解一遍。
文中還描述了其他三種工作流程,Fowler認為它們與前面所講的三種流程同樣重要:
- “準備性的重構”——當我們開始開發一項新功能時可以採用這種方法。
- “有計劃的重構”——當問題程式碼太多,必須專門花時間來進行重構時可以採用這種方法。
- “長週期的重構”——當我們需要在幾輪迭代過程中替換掉一個較大的模組時可以採用這種方法。
你們是否也一直在做程式碼重構?
相關文章
- Martin Fowler大神 - 微服務、貧血模型、重構、敏捷開發方法論微服務模型敏捷
- [翻譯]-領域事件-Martin Fowler事件
- 貧血模型-Martin Fowler 翻譯模型
- Martin Fowler:英國口音的軟體工程 (轉)軟體工程
- Martin Fowler:繼承是被誤用了繼承
- Martin Fowler 談“編輯”“釋出”相分離
- 敏捷史話(八):敏捷的破局之道——Martin Fowler敏捷
- Martin Fowler三萬字解讀原始碼分支管理模式原始碼模式
- Martin Fowler談Scrum認證、敏捷現狀與未來Scrum敏捷
- 高質量的軟體是否能賺回成本? - Martin Fowler
- Martin Fowler:仍無法衡量軟體開發的生產效率
- Martin Fowler談CMS系統中編輯-釋出模組的分離
- 華為雲專家講述知識圖譜構建流程及方法
- 瀑布和迭代可混合:敏捷定義者Martin Fowler定義瀑布法敏捷
- 幽默:請不要用“型別1 2 3 ..”來區分事物 - Martin Fowler型別
- [視訊]Martin Fowler:我希望可以創造永恆的價值(圖靈訪談)圖靈
- 程式設計師講述一線城市年輕人的生活工作實錄程式設計師
- 軟體架構指南 - martinfowler架構
- 重構Vue專案的通用處理流程Vue
- 講述分散式架構雲平臺解決方案分散式架構
- Flutter的繪製流程簡述Flutter
- Fowler的分析模式模式
- 採購流程簡述
- 測試專家講述通往測試架構師之路架構
- 阿里架構師,講述基於微服務的軟體架構模式(附資料)阿里架構微服務模式
- 【VB.Net機房重構】--簡述配置檔案
- 工作流管理--業務流程自助構建
- 除錯Kubernetes工作負載的最簡單方法 - Martin除錯負載
- AP Management 付款流程簡述
- win10 講述人是什麼_win10如何設定講述人Win10
- 記某次專案的中期重構工作 - 實戰篇
- 阿里架構師Peter老師講述Java程式設計師→架構師所需要掌握的技能阿里架構Java程式設計師
- Win10系統講述人怎麼關閉 win10關閉講述人功能的方法Win10
- incident如何使用Golang構建工作流程引擎?IDEGolang
- 工作流程
- 每日一問:簡述 View 的繪製流程View
- transformers的近期工作成果綜述ORM
- Window的工作流程梳理