[Note] Go Clean Architecture
概念
Clean Architecture 有一個很重要的概念是讓系統中的商業邏輯是獨立的:
- 獨立於框架之外(independent of frameworks):把框架當成是工具,而非把系統塞到框架中
- 可測試(testable):在沒有 UI、資料庫、網頁伺服器的情況下可以單純測試商業邏輯
- 獨立於 UI 之外(independent of UI):可以在不改變 系統架構的情況下改變 UI,甚至可以直接用 console 視窗來操作這些商業邏輯
- 獨立於資料庫之外(independent of database):商業邏輯是獨立於資料庫本身,因此即使抽換了資料庫也不會影響系統商業邏輯的運作
- 獨立於任何其他代理(independent of agency):商業邏輯可以獨立於其他任何第三方服務
Layers
- Entities:類似 Model 層,又稱 Domain,會定義該 model 的 struct、以及透過 interface 來定義將被實作的方法。這些定義好的 entities 會在其他不同層中被使用。
- Repository:類似 database 層,負責處理 database 資料的操作,只會對資料庫進行 CRUD 而不會有任何商業邏輯在內,因為在 Domain 層有定義 interface,所以切換 database 也沒關係。這一層會相依於其他資料庫或 micro service(用來交換資料)的服務。
- Usecase:類似 API 或 controller 層,是主要用來處理商業邏輯的(資料處理或運算)。在這層中會決定要使用哪一個 repository,並將資料交給 delivery 或 repository,負責使用 Repository 提供的方法來實際對 database 進行操作,因為 Domain 層有定義 interface,所以可以套用在不同的服務上(例如,gRPC)
- Delivery:類似 router 層,最主要用來決定資料要透過哪種媒介呈現,可以是 Restful API, gRPC 或 HTML 檔案。這層會接受使用者傳遞的資料,並消毒過濾(sanitize)後再往後傳給 usecase 層。