EBI、DDD及其演變架構史

一、引子

聊架構總離不開「領域驅動架構」,大多能聊到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領域驅動設計、端口適配器架構、洋蔥架構、整潔架構。完全沒有衝突,就是領域設計的完美落地歷史。一張圖歸納之:

 

 

 

 

 

 

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

//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

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

 

Tags: