l

2020年2月20日 星期四

領域事件幫你切割使用案例

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,系統的行為就會慢慢浮現出來。

***

友藏內心獨白:距離上市集資也就跨進一大步了。

沒有留言:

張貼留言