📘

DDDを実践するためのリポジトリ層の設計(Go言語による例)

に公開
3

Discussion

jundayojundayo

素晴らしい記事をありがとうございます。
集約の設計に頭を悩ませていたので、とても参考になりました!!

一点質問させて下さい。
Repositoryに実装したGetByUserIDを利用して、UserIDに紐づいたショッピングカートの一覧情報をJSON形式で返すような実装を実現したいとします。クリーンアーキテクチャのようなアーキテクチャを採用していると、

  1. Usecase層でRepositoryを利用し対象となるドメインモデルの一覧を取得
  2. 1で取得したモデルをInterface層に渡す
  3. Response用に定義した構造体にマッピングしてJSONに変換する
  4. 3で生成したJSONを返す

みたいな流れになるかと思います。ドメインモデルをインターフェースで定義した際、上記ステップ3のようなインターフェースから構造体へのマッピング・変換はどのようにして実装するのが良いでしょうか?

ドメインモデルのインターフェースに

package domain

type ShoppingCart interface {
  ID() uuid.UUID
  GetUserID() uuid.UUID
  GetItems() []*CartItem
  AddItem(Product Product, Quantity int) error
}

といった所謂Getterメソッドを定義する方法を思いつきましたが、Getterメソッドを定義してしまうと、モデルの知識が外部に流出してしまい、インターフェースとして定義したうま味が無くなってしまう気がしています。

私では他に良いアイデアが思い浮かばなかったので、質問させて頂きました🙇‍♂️

YotaHamadaYotaHamada

jundayoさん
ご質問いただき、ありがとうございます。

ご質問の点は確かに悩みどころですね。
とくに正解はないかと思いますが、記事に追記させていただきました。

少しでもご参考になりましたら幸いです。

jundayojundayo

濱田さん
お忙しい所、ご回答して頂きありがとうございます。

なるほど。プロパティ用の構造体を別途定義して、それを介してモデルの属性の取得等を行えば、確かに各属性ごとにメソッドを定義する必要はなくなりますし、公開したくない属性に関しても隠蔽できていますね!

私1人では思いつかなかったので大変勉強になります。是非参考にさせて頂きます🙇‍♂️