EBI、DDD及其演變架構史

2022-11-11 21:01:50

一、引子

聊架構總離不開「領域驅動架構」,大多能聊到DDD(Domain-Driven Design),實際上早期思想EBI架構 1992年就誕生了。核心價值點在於:關注核心業務領域(高內聚),分離實現層(低耦合)。後續一些演變架構有:埠和介面卡架構、洋蔥架構、整潔架構、事件驅動架構。這一系列的架構演變,每個架構的核心思想了解下就好,不用糾結實現細節

二、架構演變

2.1 EBI 架構(1992)

EBI 架構(Entity-Boundary-Interactor,實體-邊界-互動器)是Ivar Jacobson 在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出的。附上2012年來北京講座的照片,混個臉熟。

最早,Jacobson 把它叫做實體-介面-控制(Entity-Interface-Control),但是後來改成了 EBI,避免「介面」和程式語言中的結構「介面」混淆,以及「控制」和 MVC 中的「控制器」混淆。如下圖所示:

這個圖是不是很熟悉?沒錯,就是UML!Ivar Jacobson就是UML的三大創始人之一。

核心

  • Entity實體:實體物件承載著相關業務領域的資料和操作。對應著MVC的Model層。
  • Boundary邊界:邊界物件是對系統介面的建模。所有依賴系統環境(工具和傳達機制)的功能都屬於邊界物件。對應著 MVC 中的 View 和 Controller 的整個展現層。
  • Interactor互動器:代表了展現層和實體之間的連線,也就是應用服務(編排用例)和領域服務(DDD概念)。

優點

  • 通過職責的封裝將系統的變化控制在區域性(最好是一個物件)。(單一職責原則

2.2 DDD領域驅動設計(2003)

Eric Evans 於 2003 年出版了《領域驅動設計:軟體核心複雜性應對之道》,在書中他創造了領域驅動設計方法。是「領域驅動「領域的指明燈。DDD把實現分為4個大層次,如下圖:
分層:
  • 1.User Interface使用者介面層:負責繪製和應用互動的螢幕介面並將輸入翻譯成應用的命令。它們和EBI架構中的Boundary邊界物件對應。
  • 2.Application應用服務層:協調領域物件完成用例。它不包含業務邏輯。應用層和EBI架構中的Interactor互動器相對應,只有一點不同,互動器是和介面或實體無關的任意物件,而這裡應用層只包含和用例相關的物件。
  • 3.Domain領域層:這個層次包含了所有的業務邏輯,如領域服務、實體、事件和其他包含業務邏輯的任意物件型別。它和 EBI 架構中的Entity實體物件型別對應。
  • 4.Infrastructure基礎設施層:支援上述三個層次的技術能力,例如,持久化或者訊息機制。

核心

  領域模型準確反映了業務語言,而傳統資料物件除了簡單setter/getter方法外,沒有任何業務方法,即失血模型,那麼DDD領域模型就是充血模型(業務方法定義在實體物件中)

優點

  • 首次清晰描述了領域驅動的分層實現並統一了業務語言。
  • 單一職責、低耦合、高內聚、業務核心沉澱。

2.3 埠和介面卡架構(2005)

2005年,Alistair Cockburn構思了埠和介面卡架構 (又稱六邊形架構)並記錄在他的部落格中。下面這句話就是他對該架構的目標的定義:

讓使用者、程式、自動化測試和批次處理指令碼可以平等地驅動應用,讓應用的開發和測試可以獨立於其最終執行的裝置和資料庫。——Alistair Cockburn 2005,埠和介面卡     如下圖所示:

核心

  1. 左側: 代表 UI 的介面卡被稱為主介面卡,它們發起了對應用的一些操作,埠(應用層API)和它的具體實現(controller實現)都在應用內部
  2. 右側: 表示和後端工具連結的介面卡,被稱為從介面卡,它們只會對主介面卡的操作作出響應,埠在應用內部(業務介面),具體實現(impl)在應用之外

優點

  1. 業務應用和實現(技術)隔離。(面向介面程式設計)

  2. 方便測試。(基於介面)

2.4 洋蔥架構(2008)

2008 年 Jeffrey Palermo 提出了洋蔥架構。在我看來,它在埠和介面卡架構的基礎上貫徹了將領域放在應用中心,將傳達機制(UI)和系統使用的基礎設施(ORM、搜尋引擎、第三方 API...)放在外圍的思路。

洋蔥架構在業務邏輯加入了一些在「領域驅動設計」中被識別出來的層次。如下圖:

 

核心

  • 圍繞獨立的物件模型構建應用。
  • 內層定義介面,外層實現介面。
  • 依賴的方向指向圓心。
  • 所有的應用程式碼可以獨立於基礎設施編譯和執行。

優點

  • 職責分離更徹底,高內聚低耦合。
  • 更好的可測試性和可維護性。

2.5 整潔架構(2012)

Robert C. Martin(Uncle Bob)於2012年發表了整潔架構。這套架構是站在巨人的肩膀上,把MVC、EBI、埠介面卡、洋蔥架構、DDD融會貫通,形成了一套落地實踐方案。

四層模型
  • Enterprise Business Rules  企業級業務規則層:核心業務內聚(對應DDD的領域服務+領域實體)。
  • Application Business Rules 應用級業務規則層:應用層業務編排。
  • Interface Adapters              介面適配層:資料轉化。
  • Frameworks & Drivers        框架和驅動層:底層實現和資料庫等驅動。

Robert C. Martin有一份落地細節圖,如下:

 

核心

  • 前端(左邊)就是MVPVM架構(MVC的一種最貼合現代的延伸架構)
  • 後端(右邊)是EBI架構(Entity-Boundary-Interactor)

優點

  • 它告訴我們如何把所有的概念、規則和模式整合起來,形成一種標準實現套路。

三、總結

 縱觀EBI架構、DDD領域驅動設計、埠介面卡架構、洋蔥架構、整潔架構。完全沒有衝突,就是領域設計的完美落地歷史。一張圖歸納之:

 

 

 

 

 

 

==========參考===============

https://www.jianshu.com/p/d3e8b9ac097b

2008 – Jeffrey Palermo – The Onion Architecture: part 1

2008 – Jeffrey Palermo – The Onion Architecture: part 2

2008 – Jeffrey Palermo – The Onion Architecture: part 3

2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years

https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html