簡略化された要件は次のとおりです。
ユーザーが
Question
複数Answer
のでを作成します。Question
少なくとも1つ必要Answer
です。明確化:考える
Question
とAnswer
同様の試験:1つの質問がありますが、いくつかの答えは、どこ少数の正しいかもしれません。ユーザーはこのテストを準備している俳優なので、質問と回答を作成します。
この単純な例をモデル化して、1)実際のモデルと一致させ、2)コードで表現力を高め、誤用やエラーの可能性を最小限に抑え、開発者にモデルの使用方法のヒントを与えるようにしています。
質問はエンティティですが、回答は値オブジェクトです。質問は答えを保持します。これまでのところ、私はこれらの可能な解決策を持っています。
【A】工場内Question
Answer
手動で作成する代わりに、以下を呼び出すことができます。
Answer answer = question.createAnswer()
answer.setText("");
...
これで回答が作成され、質問に追加されます。次に、プロパティを設定して回答を操作できます。このようにして、質問のみが回答を作成できます。また、迷わず回答させていただくこともございます。ただし、回答はでハードコーディングされているため、回答の作成を制御することはできませんQuestion
。
上記のコードの「言語」には1つの問題もあります。ユーザーは質問ではなく回答を作成する人です。個人的には、値オブジェクトを作成するのが好きではありません。開発者に依存して値を入力します-どのように追加する必要があるかをどのように確認できますか?
[B]質問の中のファクトリー、#2を取る
この種のメソッドはQuestion
次のようにすべきだと言う人もいます:
question.addAnswer(String answer, boolean correct, int level....);
上記のソリューションと同様に、このメソッドは回答の必須データを取得し、質問にも追加されるデータを作成します。
ここでの問題は、正当な理由なくのコンストラクタを複製するAnswer
ことです。また、質問は本当に答えを作成しますか?
[C]コンストラクターの依存関係
両方のオブジェクトを自分で自由に作成してみましょう。依存関係の権利をコンストラクタで表現しましょう:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
質問がないと回答を作成できないため、これは開発者にヒントを与えます。ただし、質問に回答が「追加」されるという「言語」は見当たりません。一方、本当に見る必要がありますか?
[D]コンストラクターの依存関係、2番を取る
反対のことができます:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
これは上記の逆の状況です。ここでは、回答は質問なしで存在できます(意味がありません)が、質問は回答なしで存在できません(意味があります)。また、ここでの「言語」は、質問が答えを持っていることについてより明確です。
[E]一般的な方法
これは私が一般的な方法と呼んでいるもので、pplが通常最初に行うことです。
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
これは、上記の2つの回答の「ルーズ」バージョンです。回答と質問の両方が互いに存在しなくてもよいためです。あなたがいることを特別なヒントはありません持って、それらを一緒にバインドするためには。
[F]結合
または、C、D、Eを組み合わせて、関係を構築する方法をすべてカバーし、開発者が最適なものを使用できるようにする必要があります。
質問
私は人々が「直感」に基づいて上記の答えの1つを選択するかもしれないことを知っています。しかし、上記のバリアントのいずれかが他のバリアントより優れているかどうかは、そのための正当な理由があります。また、上記の質問については考えないでください。ここでは、ほとんどの場合に適用できるいくつかのベストプラクティスを絞り込みます。同意すると、一部のエンティティの作成のほとんどのユースケースは似ています。また、ここではテクノロジーにとらわれません。ORMを使用するかどうかは考えたくありません。ちょうど良い、表現力豊かなモードが欲しい。
これに関する知恵はありますか?
編集
Question
およびの他のプロパティは無視してくださいAnswer
。これらは質問には関係ありません。上記のテキストを編集し、ほとんどのコンストラクター(必要な場合)を変更しました。これで、必要なプロパティ値を受け入れるようになりました。それは単なる質問文字列、またはさまざまな言語、ステータスなどの文字列のマップである可能性があります-渡されるプロパティはすべて、このための焦点ではありません;)したがって、異なることが述べられていない限り、必要なパラメータを渡すことを上回っていると仮定します。ありがとう!