2024年04月20日

質問者さん

ユーザとタグをエンティティとして実装している ユーザが集約ルート ユーザ作成時にタグを付与すると、タグが作成される テーブルはユーザテーブル、タグテーブル、ユーザとタグの関連管理テーブルの3つがある といった場合、ユーザ作成処理はユーザリポジトリに、タグ作成処理はタグリポジトリに書くのだと思いますが、ユーザとタグの関連を管理する処理はどこに記載すべきでしょうか

2024年04月23日

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイルさん

それは集約の設計に依存します。 画像のパターン①は、ユーザ付与タグというオブジェクトはユーザーエンティティの子オブジェクトとして保持し、ユーザーリポジトリにユーザーエンティティのインスタンスごと渡します。 ユーザー付与タグオブジェクトはタグIDを保持します。 https://gyazo.com/dcdb780629e3633105d4a29bb8b7830a パターン②の場合は、ユーザー付与タグエンティティはユーザーIDとタグIDを保持し、リポジトリもユーザーリポジトリとユーザー付与タグリポジトリに分かれます。 どのようにしてこのパターンどちらにするかを判断するかと言うと、集約の範囲によるメリットデメリットで判断します。 集約を大きくするメリット → 整合性を確保する実装とテストが簡単になる 集約を大きくするデメリット →処理するデータ量が増える →排他制御の範囲が大きくなる 集約を跨いだ場合の整合性を確保する実装はこちらをご覧ください。 https://little-hands.hatenablog.com/entry/2021/03/08/aggregation

松岡@ログラス/DDD,アジャイルさんに 質問してみましょう!

松岡@ログラス/DDD,アジャイル

松岡@ログラス/DDD,アジャイル

DDDや設計にお困りの方はDMにてご相談ください。講義、モブモデリングやコーディングなどご要望に合わせた進め方でサポートします(オンライン)。 YouTube: https://www.youtube.com/channel/UCbHtbIUxtfGjrDy1WcqxExw

松岡@ログラス/DDD,アジャイルさんが

最近答えた質問

10月16日

いつもお世話になっております。DDDを実践していて以下の点が気になりましたので質問させて頂きたいです。 例えば、あるエンティティが、自分が持っている属性ごとに異なる計算(ifやswitch)をしているメソッドがあるとします。(演劇エンティティの場合:タイプがコメディの場合の料金計算処理とタイプがシリアスの場合の料金計算が条件分岐分かれているメソッドを持っている場合など) 今後の改修で演劇タイプがどんどん増えてきた場合、メソッド内の条件分岐もどんどん増えていくことになります。この場合どのようにして保守性をあげれば良いでしょうか? ストラテジやサブクラスによる対応をした時にドメインモデルとの差が出てきてしまい、悩んでおります。ご回答いただけると幸いです

10月16日

ドメインモデルにてモデリングしたエンティティを抽象クラスかインターフェースにして、それを実装するクラスでドメインモデルに出てくる種類、区分を表現するのは良いでしょうか?

10月14日

ドメイン知識の実装について質問です。 ユーザー編集の可否判定に以下のルールがあります: - 編集権限を持ったユーザーのみ編集可能 - 対象ユーザーのステータスが無効の場合は編集不可 - システム設定で編集が許可されていない場合は編集不可 これをドメイン層に実装する際、以下のクラスを考えています: - Userクラス(氏名、ステータス等を保持) - Contextクラス(権限、システム設定等を保持) 実装案: 案A: ドメインサービス public class UserEditService { public boolean canEdit(User user, Context context) { return !user.getStatus().equals("invalid") && context.hasPermission("edit") && context.isEditAllowed(); } } 案B: 各クラスに責任を分散 public class User { public boolean isEditable() { return !this.status.equals("invalid"); } } public class Context { public boolean canPerformEdit() { return this.hasPermission("edit") && this.isEditAllowed(); } } // 使用時 if (user.isEditable() && context.canPerformEdit()) { // 編集処理 } 案C: 一方に他方を渡す public class User { public boolean canBeEditedBy(Context context) { return !this.status.equals("invalid") && context.hasPermission("edit") && context.isEditAllowed(); } } どのアプローチが適切でしょうか? それともいずれも間違いでしょうか