Feb. 20 13:45~14:36
售後服務
今天上午有一位剛上過【領域驅動設計與簡潔架構入門實作班】的學員B問Teddy一個關於如何切割使用案例(Use Case)的問題。為了不洩漏學員B的工作內容,以下的文章中Teddy將學員B的應用領域轉成開發看板系統,將他提出的問題改寫,再跟鄉民們介紹。
***
問題敘述
使用者想要列印看板系統中的卡片(Card),使用者可以選擇列印全部的卡片,或是只列印挑選過的若干卡片。開發團隊想到兩種可能的實作方式:
- 方法一:實作一個PrintCardsUseCase使用案例,它接受兩個參數—boardId和filters。如果filters是空的,就列印該看板的全部的卡片;如果filters有資料,則先依據filters條件過濾不需要的卡片,再列印符合條件的卡片
- 方法二:方法一需要在使用案例中加上一個if判斷,感覺不太好。因此衍生另一種想法,把使用案例拆成兩個—PrintAllCardsUseCase和PrintCardsByFilterUseCase,前者只需要boardId這個參數,後者則需要boardId與filters這兩個參數。
寶傑,你怎麼看?!
***
用領域事件思考
學員B遇到的問題很常見,Teddy年輕的時候學習物件導向分析與設計(OOAD)也遇過同樣的問題。學了領域驅動設計和Event Storming之後,這個問題的解決方式就變得很簡單。回到事件風暴(Event Storming)來思考:
- 先寫出領域事件(Domain Event)
- 幫每個領域事件加上Command
- 幫Command寫上Input
分析到這裡就很清楚了(先不用管Aggregate與Policy),使用者的確需要兩個使用案例,但不是原本方法二的PrintAllCardsUseCase和PrintCardsByFilterUseCase這種切割方式,而是:
- FilterCardUseCase
- PrintCardUseCase
使用Event Storming,依據時間軸來思考領域事件,再寫出相對應的Command,系統的行為就會慢慢浮現出來。
***
友藏內心獨白:距離上市集資也就跨進一大步了。
沒有留言:
張貼留言