March 15 18:56~19:12;21:01~21:40
一個架構各自表述?
今天在北科上軟體架構講到Port and Adapter Architecture(接口與轉接器架構),這個架構又稱為Hexagonal Architecture(六角形架構),是Clean Architecture的核心。關於該架構的介紹可以參考Alistair Cockburn寫的〈Hexagonal architecture〉。
上課前一周請同學先閱讀〈Hexagonal Architecture Is Powerful〉這篇文章,有同學發問:「為什麼有些網路上的文章把Port畫在六角形外面,有些則是把Adapter畫在外面?」(請參考下圖)
▼圖1:Port and Adapter的兩種不同畫法。
這難道是一個架構各自表述?
***
畫圖的角度不同
參考圖2,不同的文章從不同的角度來畫Port & Adapter,畫出來的圖自然不同。如果是從客戶端的角度來看整個系統架構,客戶端先接觸到Port,然後Adapter再把客戶端傳來的資料轉成函數呼叫,執行Use Case所提供的功能。
▼圖2:從不同角度來看Port and Adapter
如果是從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)之間。
鄉民們可以參考看看各種不同的畫法,以後看資料的時候也許比較不會搞混。
***
結論
嚴格來講,在《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
***
友藏內心獨白:轉接器越來越多,越來越貴。
作者已經移除這則留言。
回覆刪除Mysql connector這種jdbc driver,比較算是adapter還是port呢?
回覆刪除本來想說Mysql connector是Adapter,而裡面提供的APIs是port
但又覺得不對,好像要先有存取mysql的某種管道才有可能呼叫那些API吼,持續混淆中
如果以RESTful web api來說,web api本身有辦法類比成adpater或port嗎?
還是說這場景根本不是何這樣比喻呢?
我覺得 jdbc driver與RESTful API進入點比較像是 port,因為有它們的的存在才可以存取(連線)資料庫/service。至於 adapter則是負責「轉換介面/資料」的物件,例如把從ReSTful API所收到的JSON物件轉成 use case Input所定義的物件,然後把它傳給 (呼叫)use case。
刪除但是苹果的思想是很明确的就是简单化问题。因为大部分使用场景不需要插那么多乱七八糟的东西 port是主动设计,adapter是被动救急。 对非专业人员用port 对于有点专业的用adapter
回覆刪除