l

2024年9月18日 星期三

重構既有系統,邁向整潔架構 (6):第三回合,在使用案例層讀寫分離

September 18 17:52~18:52

▲這一集換Eiffel上場

 

工商服務

想了解本系列文章完整內容,請參考重構既有系統:邁向整潔架構實作班。課程介紹與報名網址在此:https://teddysoft.tw/courses/refactor-to-ca/

***

前言

上一集<重構既有系統,邁向整潔架構 (5):第二回合,套用DDD戰術模式>在基本領域模型中套用領域驅動設計(DDD)的戰術模式(Tactical Design Pattern),找出聚合(Aggregate),達到封裝與決定交易邊界的目的。這一集要處理程式碼最多的TaskList。

***

分而治之

TaskList程式碼如圖1、圖2所示,這時候可以將execute mehtod所呼叫的哪幾個private method升等成Class,以簡化TaskList的長度,並且可以觀察原本這些private method與TaskList之間的耦合關係。

 

▲圖1:TaskList程式碼,1/2

 

▲圖2:TaskList程式碼,2/2

***

Use Cases Layer新住戶

Teddy將這些被升等成類別的private method放到usecase package,如圖3所示。現在Clean Architecture已經慢慢成形,最重要的兩層(entity與usecase)已經都有「住戶」了。

 

▲圖3:將TaskList的private method升等成類別

***

 

區分Command與Query

為了讓use cases layer的成員責任更佳明確,Teddy進一步套用CQRS設計模式。同時,利用use case來「吶喊」系統功能;請參考圖4。

 

▲圖4:在 use cases layer吶喊系統功能,並將讀寫分離。

***

接下來看一個Command的程式範例,圖5為AddTaskUseCase介面,這是一個in port,讓第三層的Rest Controller呼叫。

 

▲圖5:AddTaskUseCase介面

 

Teddy把實作Use Case介面的物件稱為Service,圖6為AddTaskService程式碼。

 

▲圖6:實作AddTaskUseCase的AddTaskService

 

Query程式與Command類似,差別在於兩者實作的介面不同,請參考圖7與圖8。

 

▲圖7:ShowUseCase介面

 

▲圖8:實作ShowUseCase的ShowService

***

剩下的execute

重構至此還沒討論圖1中的execute method,它的用途是用來呼叫use cases layer的那些Command與Query。Teddy一樣幫它座艙升等為類別,請參考圖9。但是這個升等之後的Execute class不像use case,比較像分派工作給不同use case的dispatcher。在架構上現在還妾身不明,Teddy先把它直接丟在use cases layer最外層。

 

請考圖9,Use case layer重構至此已經差不多了。其中有一些細節,像是Repository、Mapper、DTO、Presenter這些設計模式,全部寫出來內容太多。請容許Teddy偷懶一下,在此省略。有興趣又有錢的鄉民,歡迎報名參加重構既有系統:邁向整潔架構實作班,課程中會有詳細說明。

 

▲圖9:重構後的完整usecase package目錄結構

***

下集預告

重構至此Clean Architecture的四層已經完成了兩層,下一集要處理interface adapters layer。

***

友藏內心獨白:人口越來越多,物件村快變成物件「市」了。

沒有留言:

張貼留言