ドメイン内の優先度/設定をモデル化するための最良の方法は何ですか?たとえば、私が人を代表する
クラスを持っていて、ピザ、スパゲッティ、オムレテなどの好みがあり、実際にはピザよりもスパゲッティを好むと仮定します。
これらはどのように最適にモデル化されていますか?
最初の考えは、挿入順序に従って優先順位を維持しながら(のメンバー変数として)それらを配置することです。たとえば、リストの最初が最も優先され、次にリストの2番目が2番目に優先されるなどですが、これは退屈すぎてしまう。たとえば、好みなどの検索や関連付けを行いたい場合。
おそらく、このような問題に対する標準的なアプローチはありますか? Person
PersonX
List
Person
4 に答える
Preference
全体としてはそれ自体が完全なエンティティですが、関連付けられていない限り意味はありませんが、Person
それ自体で生きることができます。
優先順位に関する限り、優先順位はありPreference
ません。オムレツ、ピザはすべて同じですが、人に関連付けられている場合は優先順位があります(たとえば、私はオムレツよりもピザが好きで、ピザやオムレツではなく私に依存しています)。
つまり、Preference
とPerson
オブジェクトがあります。
これで、プリファレンスは人によって異なるため、プリファレンスを人に関連付けます。
優先順位は人に大きく依存するため、達成するための複数のオプションがあります。
- PriorityQueueを使用-プリファレンスを追加するときに、優先度を割り当てます。このキューはPersonクラス自体に存在します
- カスタムコンパレータを使用する(@assyliasの提案による)
- ルールを設定に追加し(場所、性別などに基づく)、事前に設定されたルールがあり、特定の基準が与えられると、システムによって計算された設定が返されますが、これは手動でオーバーライドされます。この場合、を使用できます
PriorityQueue
。
あなたが提案したようにリストを使用し、Comparator<Preference>
その人の2つの設定を比較できる を返すメソッドを Person クラスに追加できます。
Person somebody.addPreference(pizzaPreference);
Person somebody.addPreference(omelettePreference);
....
Comparator<Preference> c = somebody.getPreferenceComparator();
boolean prefersPizzaOverOmelette = (c.compare(pizzaPreference, omelettePreference) > 0);
boolean hasNoPreferenceBetweenPizzaAndOmelette = (c.compare(pizzaPreference, omelettePreference) == 0);
そして、コンパレータは単にリスト内の設定のインデックスをチェックします(その設定などが含まれている場合)。
オブジェクトの優先度を表すために優先度キューを使用し、Comparator
説明されているルールを考慮してクラスに適切なキューを定義できます。キューは優先度ヒープを使用して、オブジェクトが挿入されるときに優先度で並べ替えられた状態を維持します。
このようなクラス構造を使用します...(ずさんなJavaを許してください...私はC#の男です)
public class PersonPreference
{
public Preference preference;
public int rank;
}
次に、ユーザーが自分の好み (したがってランク列) を並べ替え、必要に応じてそのプロパティ/列で注文できるようにします。
編集
これをもう一度見て、クラスを再定義したいと思います。好みは、別の好みと比較して、ユーザーの好みでなければなりません...
public class PersonLike
{
public string like;
public int rank;
}
この新しいクラスは、人が好きなものを定義し、ランク付けを可能にするため、このクラス (またはそのデータ表現) のインスタンスが多数ある場合、それらをランク付けできます。本質的には、他のものよりも何かを好むユーザーです。いいね自体は、他のものと比較されていないため、好みではありません。
このアプローチにより、n 個の関心を相互にランク付けして、多数の好みのコレクションを作成できます。