l

2018年3月15日 星期四

Clean Architecture(2):Port and Adapter Architecture

March 15 18:56~19:12;21:01~21:40

螢幕截圖 2018-03-15 18.58.07


一個架構各自表述?

今天在北科上軟體架構講到Port and Adapter Architecture(接口與轉接器架構),這個架構又稱為Hexagonal Architecture(六角形架構),是Clean Architecture的核心。關於該架構的介紹可以參考Alistair Cockburn寫的〈Hexagonal architecture〉。

上課前一周請同學先閱讀〈Hexagonal Architecture Is Powerful〉這篇文章,有同學發問:「為什麼有些網路上的文章把Port畫在六角形外面,有些則是把Adapter畫在外面?」(請參考下圖)

▼圖1:Port and Adapter的兩種不同畫法。

螢幕截圖 2018-03-15 17.39.22

這難道是一個架構各自表述?

***

畫圖的角度不同

參考圖2,不同的文章從不同的角度來畫Port & Adapter,畫出來的圖自然不同。如果是從客戶端的角度來看整個系統架構,客戶端先接觸到Port,然後Adapter再把客戶端傳來的資料轉成函數呼叫,執行Use Case所提供的功能。

▼圖2:從不同角度來看Port and Adapter

螢幕截圖 2018-03-15 17.41.18


如果是從Use Case的角度來看架構,則Use Case透過Port與外界溝通,當傳輸資料時,先把資料傳到Output Port (定義在Use Case中的Interface),然後Adapter實作這個Interface,再把資料轉給客戶端。接收資料時,客戶端透過Adapter把資料轉成Port所能接受的格式,然後傳給Use Case。

附帶說明,Adapter與通常Use Case執行於同一個記憶空間(屬於同一個Process、同一個Runtime Environment或同一個虛擬機器),轉接客戶端與Use Case之間的互動。

***

摻在一起做成撒尿牛丸啊

也有人把架構畫成圖3的樣子,感覺起來有點圖1左、右兩圖的合體,但清楚標示Port與Adapter的相對位置,應該是有比較清楚一些。

▼圖3:Port在最外層,Adapter介於Port與Use Case(圖中的Mediation)之間。

螢幕截圖 2018-03-15 17.41.54

鄉民們可以參考看看各種不同的畫法,以後看資料的時候也許比較不會搞混。

***

結論

嚴格來講,在《Clean Architecture》裡面,每跨一個階層邊界 (boundary)就會產生一組Input Port與Output Port,也就是說整個系統中,不同的邊界都有個別的Port and Adapter。這也是Port and Adapter的特色:「體架構可以透過好多組Port and Adapter 一直不斷地串接下去」。

類似下圖的概念。MacBook Pro的Thunderbolt 3的Port,配上HyperDrive這款Adapter,提供了好幾種不同的Port。而這些Port,又可以透過其他Adapter,繼續轉接下去。例如,HDMI轉VGA或USB Type-A轉乙太網路。


▼畫面節錄自https://goo.gl/xBU3zN

螢幕截圖 2018-03-15 18.09.17

***

友藏內心獨白:轉接器越來越多,越來越貴。

4 則留言:

  1. 作者已經移除這則留言。

    回覆刪除
  2. Mysql connector這種jdbc driver,比較算是adapter還是port呢?
    本來想說Mysql connector是Adapter,而裡面提供的APIs是port
    但又覺得不對,好像要先有存取mysql的某種管道才有可能呼叫那些API吼,持續混淆中

    如果以RESTful web api來說,web api本身有辦法類比成adpater或port嗎?
    還是說這場景根本不是何這樣比喻呢?

    回覆刪除
    回覆
    1. 我覺得 jdbc driver與RESTful API進入點比較像是 port,因為有它們的的存在才可以存取(連線)資料庫/service。至於 adapter則是負責「轉換介面/資料」的物件,例如把從ReSTful API所收到的JSON物件轉成 use case Input所定義的物件,然後把它傳給 (呼叫)use case。

      刪除
  3. 但是苹果的思想是很明确的就是简单化问题。因为大部分使用场景不需要插那么多乱七八糟的东西 port是主动设计,adapter是被动救急。 对非专业人员用port 对于有点专业的用adapter

    回覆刪除