框架(Frameworks)非常流行。它們通常免費、強大,且由社群維護。
看起來使用它們是理所當然的選擇。但 Uncle Bob 給出了一個嚴厲的警告:「你可以使用框架,但不要與它結婚。」
一、不對等的婚姻 (The Asymmetrical Marriage)#
使用一個框架,就像是進入一段沒有對等承諾的婚姻。
- 你的承諾: 你為用這框架,大量引用它的基底類別、標記(Annotations)、遵循它的生命週期。
你對它做出了巨大承諾,將你的專案與它緊綁在一起 - 它的態度: 框架作者對你沒有任何承諾。他們是為了解決他們的問題而寫,不是為了解決你的問題
- 他們不會打電話問你:「我們要改這個 API,會影響你嗎?」
- 他們會為了自己的發展方向,毫不留情地更改功能,甚至讓你的程式碼無法運作
二、框架的風險#
當你讓框架滲透到架構核心(內圈)時,你會面臨以下風險:
- 架構不整潔: 框架通常要求你繼承它們的類別(例如
extends FrameworkController)。
這違反了依賴規則,導致你的業務規則與框架細節產生強烈耦合 - 需求衝突: 框架的發展可能與你的產品需求背道而馳。
你需要的功能被移除了,你不需要的功能卻讓系統變慢了。 - 喜新厭舊: 總會有更新、更酷的框架出現。
如果你與舊框架綁太死,想換框架時,你會發現自己動彈不得。
三、解決方案:保持距離#
我們不是不用框架(那太愚蠢了),而是要聰明地使用。
- 不要讓框架進入內圈:
- 業務實體(Entities)不應有
@Entity(Hibernate annotation) - 使用案例(Use Cases)不應有
@Autowired(Spring annotation)
- 業務實體(Entities)不應有
- 使用轉接器 (Adapters):
- 將框架視為一個細節(Detail)
- 讓框架留在架構最外圈(藍色圈)
- 建立一個轉接器(Proxy/Adapter) 整合框架,並將其作為插件(Plugin)插入核心程式碼
與框架保持一種 「單向約會」 的關係。
你可以利用它的功能,但要隨時保持「能甩掉它」的能力。
將框架擋在架構邊界外,不要讓它接管你的應用程式。