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定義瀑布法敏捷
- 幽默:請不要用“型別1 2 3 ..”來區分事物 - Martin Fowler型別
- 華為雲專家講述知識圖譜構建流程及方法
- 除錯Kubernetes工作負載的最簡單方法 - Martin除錯負載
- 重構Vue專案的通用處理流程Vue
- 講述分散式架構雲平臺解決方案分散式架構
- Flutter的繪製流程簡述Flutter
- 程式設計師講述一線城市年輕人的生活工作實錄程式設計師
- 阿里架構師,講述基於微服務的軟體架構模式(附資料)阿里架構微服務模式
- transformers的近期工作成果綜述ORM
- incident如何使用Golang構建工作流程引擎?IDEGolang
- win10 講述人是什麼_win10如何設定講述人Win10
- MapLibre/Martin | 使用Martin釋出MBTiles地圖切片包地圖
- 阿里架構師Peter老師講述Java程式設計師→架構師所需要掌握的技能阿里架構Java程式設計師
- Spring Boot啟動流程簡述Spring Boot
- 每日一問:簡述 View 的繪製流程View
- Window的工作流程梳理
- http,https的工作流程HTTP
- 阿里雲解決方案架構師,講述分散式架構雲平臺解決方案阿里架構分散式
- 簡述Linux開機啟動流程Linux
- 領域故事講述:協作構建領域驅動軟體 - Stefan Hofer
- 告別重複工作-RPA機器人流程自動化來了機器人
- Cocos Creator 的工作流程 2.4
- openStack核心元件的工作流程元件
- Gitflow 工作流程Git
- Spark工作流程Spark
- Git工作流程Git
- HTTPS工作流程HTTP
- springMVC工作流程SpringMVC
- 我們的20年 | 講述雲安全背後的故事
- 網路框架重構之路plain2.0(c++23 without module) 綜述框架AIC++
- 阿里架構師講述:網際網路的大流量專案中的負載均衡設計阿里架構負載
- 面對面講述JavaScript之繼承的實現JavaScript繼承
- 角色設計:如何講述一個人