2024年02月08日

質問者さん

ドメインモデル貧血症について質問したいです。 バリデーション以外のビジネスロジックが無いマスタデータのようなものをエンティティ化するのはドメインモデル貧血症でしょうか。 例えば、他の集約からID参照される「部署」のようなエンティティを作りました。 プロパティはid, nameのみで、 ドメイン知識としては名前の文字数チェックと名前の変更があります。 上記のようなgetter、setterしか持たないエンティティはドメインモデル貧血症にあたるのでしょうか? また、このようなエンティティが存在するのは設計が悪いのでしょうか?

2024年02月15日

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

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

ドメインモデル貧血症は、「getter/setterしかない」ではなく、「そこに書くべきドメイン知識がクラス外にかかれている」と捉えましょう。 文字数がドメイン知識であればバリデーションもそこに書く必要があります。部署クラス、もしくは部署名クラスに実装しましょう。そうでなければ、ユースケースごとに文字数が異なる(たとえば、新規作成時とこうしんじで異なる)ようなことが発生する可能性が生まれてしまいます。 本当にそこに書くべきドメイン知識が他にないのか?という観点も考えて見るためには、具体的な値を記載してモデリングして見るといいでしょう。モデリングのやり方はこちらの動画、本を見てみてください! https://www.youtube.com/live/HgtCKlOzRiQ?si=2BTklVOQkOYgGPCY https://little-hands.booth.pm/items/3363104

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

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

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

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

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

最近答えた質問

11月04日

reconstruct運用時のFactoryメソッドの必要性について質問させてください。 エンティティの初期化は松岡さんの書籍と同様、reconstructで実装しています。 エンティティのプロパティがすべてnon-nullableの場合、基本的にはresonctructの引数もすべてnon-nullableになると思います。 しかしDB側ではnullableなデータとして扱っている場合、初期化前にnullガード(バリデーション)を行う必要があると思いますが、それをインフラ層で行うとドメインロジックが漏れることになってしまいます。 かといってreconstructの引数をnullableにして内部でバリデーションすると、本来nullableではないデータを受け取ってしまう実装になり不整合の原因になると思いますし、nullableを受け取って例外出すなら最初からnon-nullableにしておくほうがモデリング的にも適切だと考えています。 このような場合の解決策としてFactoryメソッドを使って内部でバリデーション+reconstructを行えば隠蔽できいいかなと思いましたが、初期化自体をreconstruct/factoryの両方から行えることになり、本来前者を使うべき場所で後者を使うなど運用面での問題が発生してしまうと思います。 (引数的にはfactoryがrepositoryを包含する関係になり、factoryが便利メソッド的に使われていく問題です) またバリデーションやCompositeパターンにおける出し分けのように、Factoryという言葉がもつ意味合いも分散してしまい、結果複雑化し管理・運用が難しくなる気もしています。 (後者は def dollarでMoney("USD"), def yenでMoney("JPY")を出し分けるFactoryのイメージ) 松岡さんでしたらどのように対応するでしょうか。 (なおDB側をnon-nullableにすればいいという意見が出そうですが、nullableで扱いたい文脈が存在するため変更しない、という前提でご教示いただきたいです)

10月16日

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

10月16日

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