l

2024年9月5日 星期四

重構既有系統,邁向整潔架構 (1):為什麼透過重構改善軟體架構很困難

September 5 21:02~22:06

▲Ada:我不會逆轉重構但我可以逆轉自己!

 

前言

今年四月Teddy開了一門新課程:【重構既有系統:邁向整潔架構實作班】。以往的開課流程Teddy總是先寫部落格文章,再設計課程,但這門課Teddy卻是直接設計課程而沒寫部落格文章。這系列文章算是「補寫」原本應該出現的文章,第一集先談為什麼軟體架構層級的重構很困難?

***

重構是一種設計

大部分鄉民應該都知道重構是在不改變程式碼外在行為的前提之下,藉由改變它的結構達到增進設計品質的一種方法。既然重構可以「改善設計」,因此可以將重構視為一種設計方法

Teddy將設計方法區分為兩種:

  • 由上而下:先決定設計目標,然後由上而下展開子目標,最後展開到一個可以施工的工作單元。例如,傳統的物件導向分析與設計就是一種由上而下的方法。先確定專案願景,然後展開需求、設計領域模型、軟體架構。
  • 由下而上:不確定最終目標是什麼,先從手邊可接觸到的「東西」著手設計,再慢慢將這些「東西」兜成更大的「東西」,透過這種方法完成設計工作。重構本質上就屬於這種設計方法。

***

 

設計應該是由上而下的過程

根據建築師Christopher Alexander的看法,設計是一種由上而下個過程。這就好比敏捷社群常說「以終為始」是一樣的道理,你希望達到什麼目標,就以這個目標當作設計的出發點。這樣講鄉民們可能還是覺得有點抽象,Teddy舉領域驅動設計中的戰術設計模式語言為例,請參考圖1,Model-Driven Design模式是這個模式語言的「起點」,也是這整個設計最「頂」的模式,也等於這個模式語言的「目標」。

翻成白話文就是:領域驅動設計的戰術設計就是Model-Driven Design。如果看到這模式鄉民們就懂了,就開悟了,底下的其他模式也就無需再看。

 

▲圖1:領域驅動設計的戰術設計模式語言

 

***

再舉一個日常生活的日子,假設你晚上要請朋友吃飯,你要先決定「去那裡吃飯」?例如吃路邊攤、快炒、日式料理、韓式料理或是西餐等。如果是吃快炒,接下來才是決定要點什麼菜、什麼湯和飲料。這就是由上而下的設計思維。

***

由上而下那又怎樣?

重構作為一種由下而上的設計方法,用來達成區域改善是很有效的方法。例如,用Rename重構幫變數、method、class、package取個可以代表它們意圖的好名子。有沒有改善設計,當然有。改善後的設計對軟體架構的影響是什麼?不知道(不明顯)!

同理,用Extract Method把Long Method變短同時又用有意義的method name來代表程式碼的意圖。有沒有改善設計,當然有。改善後的設計對軟體架構的影響是什麼?不知道(不明顯)!

這就是透過重構要達到改善軟體架構很困難的原因。要採用由下而上的方式改善軟體架構並非不可行,但這類似演化的作法,需要一段很長、很長、很長的時間,以至於在一般專案中變得不切實際。因為鄉民們沒有那麼長的時間可以透過演化的方式「長出」一個好架構出來。

***

怎麼辦?

答案就在前文中。其實很簡單,就是要想辦法將重構改成由上而下的設計方法。只要做到這點,透過重構改善軟體架構就變得不再那麼遙不可及。

今天先聊到這個,下一集Teddy再來談如何「逆轉重構」,把它改成由上而下的設計方法。

***

工商服務

【重構既有系統:邁向整潔架構實作班】課程介紹與報名網址:https://teddysoft.tw/courses/refactor-to-ca/,有興趣的鄉民歡迎參考。

***

友藏內心獨白:好久沒出來亮相了。

沒有留言:

張貼留言