設計Domain層
在先前的規劃中,可以發現,我們主體都是圍繞在Anki的上打轉 因此,這次的domain中,會有三個domain,分別是
Anki
Ankier
- 用牌組名稱抓取卡片
- 用id來抓取卡片
- 抓取代處理的卡片
- 將卡片進行更新
另外,關於回傳的卡片,我也可以想像他有以下功能
Note
- 檢查指定欄位是否產生了聲音
- 檢查指定欄位是否有值了
- 取得指定欄位的輸出(把一些不相干的內容移除,例如[[Japanese Pitch Accent]]的讀音標記)
GPT
MakeSentencer
- 放入單字跟依賴的字典,輸出需要的造句,以及相關的片假名及中文
TextToSpeech
Sounder
- 將傳入的文字轉換成語音,並回傳檔案位置
目前規劃可以想像到的應該就屬這些部分了
在Domain層的規劃,主要的邏輯會是一個domain做一件事,另外,如果他有回傳的物件,那這個物件上面掛的method不能有依賴別人的內容,如果有需要依賴的話就要與原domain層的interface進行互動
例如:
ankier := &Anki{}
note := &AnkierNote{}
err := note.Save() // 👎
err := ankier.Save(note) // 👍
會這麼設計,主要是因為在domain原本的struct中,會注入各式各樣的infrastructure,但透過這些domain層所產出的struct內基本上都是純粹的資料格式,所以不會希望也把一些對外互動的infrastructure也放到這個struct中,這樣會讓整體規劃上變的更加的複雜