ドメインモデルの設計
-
07-07-2019 - |
質問
この簡単な例のドメインモデルはどのように作成しますか? レシピには多くの成分を含めることができ、成分は多くのレシピで使用できます。 各レシピで使用される各材料の量も保存されます。 このデータと関係を保存するために、次の3つのデータベーステーブルを設計しました。
現在、これを表すドメインモデルを作成しようとしています。 2つのクラスの基本的な例があります。 その後、新しい成分の作成について考えたときに、このモデルで問題が発生しました。 quantityプロパティのないクラスが必要になります。 これはどのようにモデル化する必要がありますか?
データベーステーブル
代替テキストhttp://img190.imageshack.us/img190/340/databasex .png
ドメインモデル
解決
ドメイン駆動型の設計をしようとしている場合、テーブルから始めないでください。まず、基礎となるドメインを反映した概念モデルを作成します。私はndpに同意します。RecipeIngredientは、DDDの観点からすると、少し厄介な名前/概念です。
モデルには、Recipe、Ingredient、Measure、RecipePreparationの概念が必要だと思います。
レシピは、成分の集合体です。レシピに属する各成分には、準備の仕様として、それに関連付けられたメジャーが必要です。また、レシピの特定の準備中に使用される各成分の実際の量を関連付けるために、RecipePreparationをモデル化する必要があります。
測定は、単位と量で構成されます(例:2カップ、0.5オンス、250 gr、大さじ2 ...)。
ここでは、分析中に混在する可能性のある2つの異なるものを参照します。何かを調理するための仕様としてのRecipe / Ingredient / Measure(レシピごとに1つのインスタンス)とRecipePreparation / Ingredient / Measureとしてコンクリート特定の人が特定の瞬間に行う1つのレシピの準備であり、異なる手段を使用している可能性があります(レシピの仕様は2枚のプレートであり、4人のゲストがいるため、すべての材料を2倍にします)。
さらに深くなって、交換可能な材料のセット(ヤギのチーズを使用していない場合はモッツァレラチーズを使用していない場合)、同じカテゴリのレシピのセットを収集する料理の本、調理時間などの材料のモデリングを開始できますレシピなどのために
他のヒント
ドメインモデルで、特定の成分と数量への参照を含むRecipeIngredientクラスを作成します。
次に、Recipe.Ingredientsリストを変更してRecipeIngredientオブジェクトを含めます。最後に、IngredientクラスからQuantityを削除します。
ちょっとしたヒント:ほとんどの純粋なドメインモデル作成者は、最初にドメインモデルを作成し、後ほどデータベースに関心を持つ必要はないと言うでしょう。
結合テーブル(数量)にデータがあるため、答えはそれを表すクラスが必要だということです。 (他にも選択肢がありますが、検討する価値はありません。)
モデルが成長するにつれて、ここにデータを追加する必要があることは間違いありません。たとえば、レシピの材料の順序をどのように設定しますか?
RecipeIngredientは、ドメインドリブンデザインの観点からは、少し厄介な名前(および概念)です。あなたは気分が良い別の名前を思い付くことができるかもしれません。しかし、一般的に、これは必要な実装の詳細です。申し訳ありませんが、参照を提供するのに便利なEvanのDDD本はありません。
皆さんがすべて失われたと思います。元のポスターには正しい衝動がありましたが、間違った経路をとっていました。実際、彼が示したマッピングテーブルは、古いRiehlヒューリスティック(lおよびr関係の名前を組み合わせたもの)を使用して、多対多マッピングであるという事実に対処しているようです。しかし、実際に行われているのは、ここで role クラスが必要なことです(Coadのドメインモデリングアプローチはこれらを多く使用しました)。しかし、ここにそれがあります:それは、Ingredientがすでに持っているものです!ここで欠落している抽象化は、ワームの缶を開きます:それは追加されているものです。それが基本クラスになると主張することができます。食べ物(文字通り、レシピに食べられないものを追加することはできないので)が、すべての食べ物の責任を負うか、単に名前を付けることができます。
だから、私が思う正しいモデルには、特定の食物をある程度含む成分が含まれています。