l

2017年11月13日 星期一

[還少一本書] Clean Architecture

November 10 21:40~23:03

螢幕截圖 2017-11-13 22.41.56

Clean Architecture: A Craftsman’s Guide to Software Structure and Design》是著名作家Robert C. Martin最新著作,顧名思義這本書的主題就是軟體架構。本書總共分成六個部分,Part I簡短說明軟體架構的定義與價值,作者針對軟體架構的目標給了以下定義:

The goal of software architecture is to minimize the human resources required to build and maintain the required system. (軟體架構的目標是最小化建構與維護所需系統的人力資源)

接著作者提到軟體架構的兩個價值:

  • 行為(Behavior):軟體架構需要支持將使用著的需求轉成可執行的軟體系統。
  • 結構(Structure):好的軟體架構要讓「軟體變軟」,也就是要具備可修改性、可維護性。

以上兩個價值哪一個比較重要?很多人,尤其是老闆、主管、專案經理或Product Owner,大多會認為前者比較重要。畢竟軟體一定「看起來可以用啊」,否則軟體架構設計得再好,功能不符合使用者所需也是白搭。但作者提出另一種看法,他覺得結構的價值大於行為的價值。舉一個最極端的例子,你有一個行為符合使用者需要但卻完全無法修改的系統,只要使用者需求改變,這個系統就完蛋了。另外一種情況是你有一個行為完全不符合使用者所需,但卻非常容易修改與維護的系統。你可以很容易的逐步修改這個系統,讓他符合使用者的需求。

有些鄉民可能會認為這根本是作者的詭辯,信不信由你,反正 Teddy是信了XD。不過不要誤會,作者不是說功能不重要,功能當然很重要。作者在書中還有更進一步闡述這個觀點,請鄉民們自行參閱。

***

Part II則是介紹三種目前主流使用的編程典範,並提出他認為的重點:

  • 結構化:規範直接流程控制(不要使用 go to)。
  • 物件導向:規範間接流程控制(透過多型)。
  • 函數編程:規範指定指令(assignment)。

***

Part III與Part IV分別介紹SOLID(Single Responsibility、Open-Closed、Liskov Substitution、Interface Segregation、Dependency Inversion)元件設計原則,這兩部分的內容與作者自己寫的另一本書《Agile Software Development: Principles, Patterns, and Practices》重疊。有經驗的鄉民可以直接從Part V開始讀起。

***

以上內容可以算是本書的鋪陳,補充一些軟體設計的觀念。從Part V開始才是本書的重點,作者從Use CasesOperationDevelopmentDeployment這幾個角度來探討軟體架構。這些觀點和〈Architectural Blueprints—The “4+1” View Model of Software Architecture〉這篇經典的論文有許多類似的見解。接著作者討論解耦(Decoupling)的幾種技巧,在此作者提出一個Teddy覺得很有趣的看法:有時候為了解耦必須付出重複性(Duplication)作為代價。例如,如果不希望商業邏輯層與資料庫層產生耦合,商業邏輯層就不能直接使用資料庫的物件,像是Record Set或是Result Set等資料庫提供的物件要被轉成DAO傳給商業邏輯層。雖然兩者之間的資料可能存在大量的重複性,但這種重複性並不是真正的重複性,只是此時看起來很像。維持這種重複性有助於隔離不同階層之間的相依性。

作者繼續討論如何劃定邊界(Boundary)的與區分Level(軟體架構的層次)方法,在此作者套用相依倒轉原則(Dependency Inversion Principle)來區分元件的邊界,Level的定義則是與I/O的距離,軟體架構中距離I/O越遠的元件/模組/階層擁有越高的Level。

然後作者提到Policy,也就是一般常說的Business Rule。這部分需要用Entity與Use Case來實作,而且最好完全隔離I/O。

綜合以上的討論,作者最終提出他的Clean Architecture,如下圖所示:

CleanArchitecture

▲Clean Architecture,圖片來源在此

嚴格講起來這個架構也不是作者所發明的,它和Hexagonal Architecture(又稱為Ports and Adapters)很像。

***

作者把資料庫、Web、框架(Framework)視為與架構核心無關的細節,放在最後Part VI介紹。看到這裡可能有許多鄉民不同意,Web本身就是一種架構,為什麼會被作者歸類為與架構核心無關的細節勒?不服氣的鄉民可以把這本書找來看,嘗試一下能不能打臉作者XD。

***

與傳統軟體架構的書籍不同,這本書從一些很基礎的設計原則開始討論,運用少數原則來展示作者所認為的軟體架構設計重點。傳統的軟體架構書籍像是《Software Architecture in Practice, 3rd》,偏向過於理論性的探討與軟體架構評量的方法介紹。另一類像是《Pattern-Oriented Software Architecture》系列,書中介紹大量的架構模式,非常具體但有時候可能會有見樹不見林的感覺,或是有一種「背了很多英文單字(架構模式)但卻無法開口講英文(無法應用這些架構模式)」的困擾。《Clean Architecture》剛好介於這兩者之間,讀完這本書,用書中介紹的方法再回頭去看原本已知的軟體架構,應該會有不同的感覺與見解。

***

友藏內心獨白:書不能只看一本。

1 則留言: