在前一篇文章里面,我們分析了代碼重構原則包括重構定義、重構時機以及中間層的擴展等內容,不過其中重構時機的解讀,更多是側重于宏觀層面。在實際工作中,我們往往還需要更精確的衡量標準或者參考依據。
這里提到的衡量標準,Martin Fowler用了一個特殊的詞來形容,就是“代碼的壞味道”。
換個角度來看,代碼的壞味道,也是代碼需要重構的某種跡象、表現形式。這些“壞味道”,有的涉及具體的代碼段,例如“重復代碼”;有的涉及函數的組織形式,例如“過長函數”、“過長參數列”;也有涉及具體的類的設計,例如“過大的類”、“發散式變化”、“霰彈式修改”等。
其中每種壞味道,都會對應一個或者多個重構手法,并且在很多情況下,我們還需要結合具體情況,對問題進行細分,以找出更準確、更合適的解決方案。
結合個人理解與編程實踐,這里挑選了部分可能更為常見的“代碼的壞味道”與重構手法之間的對應關系加以匯總整理,具體可參考下面表格。
如果我們再換個角度,就會發現這些重構列表,要么是提升代碼可讀性、要么是改善代碼的可維護性或者可擴展性;有的重構手法成本較低,花費的時間精力較少,有的則剛好相反,甚至于還有一些不在本列表中的大型重構。
——當項目處于前期,而整體時間預算并不怎么寬裕時,代碼有重構的必要性,但也存在一定風險(時間風險加上改動波及影響),這時候應該如何處理?
這里提供一個參考思路:使用分支管理結合階段性測試,同步進行。也即在原先的項目代碼基礎上,拉出單獨分支用于代碼重構,并且結合模塊代碼評審情況與重構列表,確定重構計劃以及測試計劃。更具體地,相關測試包括但不限于單元測試、集成測試。最終,我們可以根據時間進度與測試情況,評估當前重構成果在項目上的應用計劃。
對于“代碼的壞味道”及其重構手法,如果你有一些不同的看法或者心得體會,歡迎留言討論。
延伸閱讀: