當系統規模擴大,模組之間的相互依賴會快速演變成難以維護的「義大利麵條式連結」。Layering(分層)透過將系統切割為有序的層次,強制規範依賴方向,從根本上抑制複雜度的擴散。
什麼是 Layering?
Layering 將系統組織成垂直堆疊的層次結構,每一層只能與直接相鄰的層互動,並且依賴關係嚴格維持單一方向(通常由上至下)。上層使用下層提供的服務,下層對上層的存在毫不知情。這種結構讓每一層的職責邊界清晰可辨,修改某一層的內部實作時,不會波及其他層。最典型的例子是 OSI 七層網路模型,以及 Web 應用中常見的 Presentation → Business Logic → Data Access 三層架構。
單向依賴如何消除複雜度?
複雜度的根源往往是雙向或跨層依賴:A 依賴 B、B 又反依賴 A,形成循環耦合,任何修改都可能引發連鎖崩潰。Layering 的核心價值在於切斷回路——上層依賴下層的抽象介面,下層永遠不引用上層符號。這個原則同樣適用於資安縱深防禦(Defense in Depth):每一安全層(防火牆 → IDS → 應用層驗證)各自獨立,攻擊者突破單層後,仍需面對下一層的獨立阻礙,大幅提高攻擊成本。
# 正確:單向依賴(Controller → Service → Repository)
class OrderService:
def __init__(self, repo: OrderRepository): # 依賴下層抽象
self.repo = repo
# 錯誤:下層反向依賴上層(禁止)
class OrderRepository:
def __init__(self, service: OrderService): # ❌ 循環依賴
...
💡 重點整理
- 單向依賴是 Layering 的核心約束,下層永遠不得引用上層。
- 層間介面(Interface)是隔離變化的關鍵,依賴抽象而非具體實作。
- 跨層呼叫(如 Presentation 直接存取 DB)是破壞分層的最常見反模式。
- 資安縱深防禦本質上是 Layering 在安全領域的直接應用。
Layering 不是銀彈,過度分層會增加無謂的間接層。掌握「每層職責單一、依賴方向唯一」兩個核心原則,才能讓分層架構真正發揮抑制複雜度的效果。
📚 參考文獻
- Fowler, M. — Patterns of Enterprise Application Architecture,Chapter 1: Layering(Addison-Wesley,2002)
- ISO/IEC 7498-1 — OSI Reference Model,官方分層網路模型規範
- NIST SP 800-53 — Defense in Depth 安全控制框架,csrc.nist.gov
⚠️ 本文內容基於撰寫時的最新資訊,實際應用時請參考官方文件的最新版本。
留言
張貼留言