2009-02-28 6 views
5

私は食堂の食事をモデル化しなければならないとしましょう。特定のエンティティのグループのみがロールに参加できる複雑なロールの関係をどのようにモデル化できますか?

  1. (フライドポテトまたは米ORウェッジ)
  2. AND(6つの異なる飲料の一つ)
  3. AND(異なる7のうち一つまたは2:

    の食事には、いくつかの "コンポーネント" で構成することができます

      :ソースまたはまったくなし)

    は別の食事はで構成することができます

  4. (サラダやライス)
  5. AND(ガーリックORなしガーリック)

さらに食事で構成することができます:

  1. ジャストフライ

  2. ただ、飲料

  3. ちょうど...

これはどのようにモデル化できますか? (UML、エンティティ関係、コード、...あなたが最良の説明できるものは何でも)

あなたは、私が実行するいくつかのタスクを知っていれば、おそらくそれはそう、助け:

  • は顧客が食事を選択することができ残りの「アドオン」をすべて表示します。
  • コンポーネントのリストから食事を検出します。例えば、顧客がフライ、ソース、および飲料を注文した場合、最初の例から食事を検出することが可能でなければならない。

私はすべてのコンポーネントを記事に分けて、 "チーズバーガー"、 "シュニッツェル"、 "..."の補足として "フライドポテト"をマークするための何らかのロールマッピングを追加することを考えましたが、どのように私は、私が想定し...私はあなたが私を助けることを願って

...

答えて

1

宿題の場合は、問題ではないかもしれません... これは実際のアプリケーションで使用される場合は、具体的なクラスを使用することを強くお勧めします。コーク・クラス、サラダ・クラス、ライス・クラスなど、上で推奨されています。 これはアプリケーションを柔軟性のないものにする確実な方法です。

が新しい特別や食べ物アイテムが今そこにあるという理由だけで、あなたのアプリケーション全体を再構築する必要が想像.. nameプロパティまたはそのようないくつかで食品クラスとドリンクのクラスを持っている多くの方が良いだろう... クールではありません ;)。

他の回答から欠けているものは、グループのアイデアだと思います。 各食品アイテムは、他のアイテムと一緒に、または単独で、グループに属することができます。

揚げ物、米、およびくさびはグループAに属します。飲み物はグループBに属します。 次に、グループのリストとしてコンボをモデル化できます。 1つのグループAアイテムと1つのグループBアイテム、または2つのグループAアイテムと1つのグループBアイテム。

複数のグループに同時に所属できるようにすることもできます。オプションを柔軟にすることができます。

dbモデルは、すべての関係を定義するのが複雑になる可能性がありますが、それは必要だと思います。

おそらく、このような何か:

group(id, name, desc) - アイテムのようなグループ - 前菜、前菜、飲み物...か何か

foodItem(id, name, desc) - 1アイテムを表し - などフライドポテト、米、

foodItem_group(foodIgem_Id, group_Id) - そのグループに食料品をマップ -

combo(id, name, desc)多くの多くの - コンボ

を説明

combo_group(combo_Id, group_Id) - 私はこれが基本的に必要なモデルを表すためにと思う多くの

に多くの - - コンボにマップグループは、追加のテーブルは、顧客が実際に注文したもの保存することもできます...そして、もちろん、顧客かどうかを検出注文と一致するコンボはビジネスロジックに任せられます。

+0

私は同意する傾向があります。(それは宿題ではありません:)) –

+0

もう少し追加しました。 – markt

0

を複数のアドオン、オプションのアドオン、nはアウト・オブ・メートルアドオンをモデル化することができ、これは最終的になりますデータベースに格納されます。私は2つのテーブルを作成することをお勧め:ID1、ID2、関係:

  1. コンポーネント
  2. が持っているでしょう(フライドポテト、サラダ、ガーリックなど)を格納します。関係ビーイング:
    • すべてのコンポーネントは、特定の食事に属している場合、あなたは見つけることができるの関係、「所属」に基づき

に行くに属します。多分、その食事に属するすべての成分を選択し、選択された成分が食事の50%以上を占めるならば食事を提案するかもしれません。

「関係がある」という関係に基づいて、食事や選択したコンポーネントにアドオンを提案することができます。

+0

たとえば、少なくとも3つのコンポーネントのうちの少なくとも1つを食事と一緒に使用する必要があると定義するにはどうすればよいですか? –

1
  1. 順番はどちらかの食事、コンポーネント、またはその両方の組み合わせで構成することができますので、私が言う、Component sおよびMealのリストを持っているOrderクラスを持っているように思えます。 MealはサブクラスComponentのいずれかである必要があります。そうでないと、同じインターフェイスを実装する必要があります。
  2. Mealはいくつかの「スロット」で構成され、Componentのいくつかのセットで塗りつぶすことができます。 Mealはスロット数とスロット数を記入する必要があります。
  3. MealComponentのリストから検出する」という質問は難解です。頭の上から外して、私が考えることができる最善の方法は、それぞれMealComponentのリストを取り、それがMealである場合はtrueを返すメソッドを与えることです(またはComponentのサブセットそのMeal)。 Orderは、現在知られているMealのリストを調べ、そのうちのどれかが現時点のOrderComponentから作成できるかどうかを確認します。しかし、これを行うためのより良い方法があるかもしれません。

希望します。

+0

あなたの答えをありがとうが、(2)の下で私が理解する限り、あなたは私の元の要件を言い換えているようだ:)おそらくあなたは精緻化することができます。 –

+0

混乱している部分がありますか? –

+0

私はアマンダが正しい道にあると思う。 その他の考慮すべき点:iMealインターフェイスを使用してから具体的な食事の種類を指定する。ランチはiMealを実装していますが、2つの側面のみを許可します。ディナーはiMealを実装し、3つの側面を考慮します。 –

1

作成コンポーネントクラスと可能なすべてのタイプのコンポーネントのサブクラス(またはオブジェクト)。

抽象的なを作成してください。クラス、および可能なすべてのタイプの食事のサブクラスです。ミールは、特定のコンポーネントのリストがそれに一致するかどうか(コンポーネントのリストから食事を検出するために)をチェックすることができます。そして、食事は、この食事のための成分のすべての選択肢を顧客に提示することができる。

私は食事を "スロット"にする必要があるとAmandaに同意します。各スロットは食事のコンポーネントの選択肢の1つを表す。フライドポテトまたはライスまたはウェッジ。スロットは、m-outof-nオプションをモデル化することもできる。

食事のクラス:コンクリート食事の

class Meal 
{ 
    class MealSlot 
    { 
     Add(Component); 
     bool DoesItMatch(vector<Component> ComponentsVector) 
     { 
      //Check if this Slot is filled by some element(s) 
      // of ComponentsVector 
     } 
     PrintSlotOptions(); 
     vector<Component> Options; 

     // for m-of-n option, if multiple items can be chosen in this slot 
     int HowManyNeededToFillIt; 
    }; 

    bool DoesItMatch(vector<Component> ComponentsVector) 
    { 
     //Check if all Slots are filled by ComponentsVector elements, 
     //using Slot::DoesItMatch function 
    } 
    void PresentChoices() 
    { 
     for(i=0; i < Slots.size(); i++) 
      Slots[i].PrintSlotOptions; 
    } 
    vector<Slot> Slots; 
}; 

ワン:(サラダやライス)AND(ニンニクORなしガーリック)

class MealType2 : public Meal 
{ 
    MealType2() 
    { 
     Slots[0].Add(Salad); 
     Slots[0].Add(Rice); 
     Slots[1].Add(Garlic); 
     Slots[1].Add(NOTHING); 
    }  
}; 

食事が含まれています注文クラスを作成します。名前、およびコンポーネントのリストです。食事が注文された場合は、Meal.PresentChoices()を呼び出します。そして、コンポーネントのリストが与えられたら、すべての食事に行き、Meal.DoesItatchを呼び出します。

+0

「m-out-of-nコンポーネント」はどのようにモデル化できますか? –

+0

答えが更新されました –

0

あなたの食事は、食品のほぼすべてのコレクションになる可能性があるので、食品のための1つの抽象基本クラス(またはインターフェイス)から始めます。コカコーラ、紅茶、ステーキ、チキン、ジャガイモ、米、パスタ、スープ、サラダなど、各食品のための1つの具体的なサブクラスをたくさん作成してください。

前菜、夕食、飲み物など

あなたの具体的なクラスを、コードやテストを書くときにどのような階層にもリファクタリングすることができます。

コンポーネントインターフェイスにふさわしい場所に振りかける。

関連する問題