Clean Architecture:SOLID 原則與依賴邊界

★★★★★Draft

FromClean Architecture

📚 From the Books

Clean Architecture:SOLID 原則與依賴邊界軟體架構

架構與設計沒有本質區別,兩者都是「軟體整體計畫」的一部分,差別只在決策的層次。而所有架構工作服務的是同一個目標:讓系統易於改變。一套好架構能讓你在需求變動時,用最小的代價、最少的重工去回應——這比讓系統「現在正確運作」更難、也更持久地重要。

🧠 Core Ideas

TIP

「整潔架構」不是又一個原創發明,而是把 Hexagonal Architecture、Onion Architecture、DCI 等前人智慧統合到同一張同心圓圖上。它們雖細節各異,卻都指向同一條規則:依賴指向內、細節指向策略。抓住這條規則,圖畫成幾層都不是重點。

⚖️ 為什麼「架構價值」比「行為價值」更難也更重要

急著上線的團隊幾乎總是犧牲架構、保住行為——因為老闆看得見功能,看不見結構。但這個取捨的帳,會在往後每一次變更時被追討。

行為 vs 架構:艾森豪矩陣的陷阱
  • 緊急 vs 重要的錯位。行為(功能)通常緊急但不總是重要;架構重要但很少緊急。團隊若總是先做「緊急」的,就會系統性地犧牲「重要」的架構,把系統推向愈來愈硬、愈來愈改不動的角落。

  • 軟體的本意是「soft」。軟體之所以叫「軟」體,就是因為它應該易於改變。一個為了趕行為價值而放棄架構價值的系統,等於背叛了自己存在的理由——它變成了昂貴的硬體。

  • 架構師的責任是「留住選項」。好架構的標誌,是把「不重要的決策」(用哪個資料庫、哪個框架、走 Web 還是桌面)盡量延後並隔離在外圈,讓系統的核心商業規則不被這些細節綁架。延後決策本身就是一種競爭優勢。

🖼️ 依賴規則怎麼在真實系統裡運作

想像一個典型的請求流:Web 送進來一筆資料,經過 Controller,呼叫 Use Case(應用商業規則),Use Case 操作 Entity(企業商業規則),再把結果透過 Presenter 送回 Web。控制流從外向內、再從內向外;但「原始碼依賴」——也就是誰 import 誰、誰認識誰——必須始終指向內。Use Case 不知道 Controller 存在,Entity 不知道資料庫存在。

要讓控制流與依賴方向「相反」,靠的正是 DIP:在邊界上放一個由內層定義的介面,外層去實作它。於是 Use Case 呼叫的是它自己擁有的 Gateway 介面,真正的 SQL 實作住在外圈,實作方向內依賴。這帶來三個具體好處:其一,商業規則可以在沒有資料庫、沒有 UI、沒有框架的情況下被單元測試;其二,你可以把 Oracle 換成 Postgres、把 Web 換成桌面,而不動核心;其三,團隊可以沿邊界並行開發。書末的案例研究把這套規則落到影片販售、真實專案的目錄結構上,示範「按元件的變更軸切分」而非「按技術分層堆疊」,讓每個元件能獨立內聚、獨立部署。

IMPORTANT

邊界要畫在「變化軸」上:把「因不同理由、以不同速率改變」的東西分開。商業規則變得慢、UI 與資料庫變得快,就在它們之間畫一條由 DIP 守護的線。畫錯邊界(或該畫時不畫)是架構腐化最常見的起點——邊界的紀律,本質上就是 SRP 在系統層級的展開。

🔑 Takeaways

✍️ My Notes

No notes yet — jot your takeaways or Q&A here.

📖 Further Reading