2009-02-28 39 views
5

比方說,我必須模擬一個餐館的飯菜。如何建立複雜的角色關係,只有某些實體組可以參與角色?

一頓飯可以由若干個「部件」:

  1. (薯條或米飯或挖起杆)
  2. AND(其中六個不同的飲料)
  3. AND(一個或兩個出七種不同醬料或者根本沒有)

另一頓飯可以包括:

  1. (沙拉或大米)
  2. AND(大蒜或無蒜)

而且餐點包括:

  1. 只是薯條

  2. 只是一個飲料

  3. 只是...

我該如何建模? (UML,實體關係,代碼...無論你能解釋最好)

也許幫助,如果你知道一些我的任務要執行,所以:

  • 允許客戶選擇一餐首先顯示所有剩餘的「加載項」。
  • 從組件列表中檢測膳食。例如,如果顧客點了薯條,醬汁和飲料,應該可以從第一個例子中檢測出膳食。

我曾想過將所有組件分成文章,然後添加一些角色映射來標記「薯條」作爲「芝士漢堡」,「炸肉排」,「......」的補充,但後來我想知道,我怎麼可以模擬多個加載項,可選插件,正出的米插件...

我希望你能幫助我......

回答

1

如果這是作業,它可能並不重要...... 但是,如果這將用於現實世界的應用程序,我強烈建議不要使用具體類爲每個食品項目,即。如上面推薦的可樂類,沙拉類,米類等。 這是確保您的應用程序不靈活的一種方法。

這將是更好的有食品類和飲料類的名稱屬性或一些這樣的..

想象一下,不必重新建立整個應用程序,只是因爲現在有一個新的特殊或食物...不酷;)。

我認爲其他答案中缺少的是組的想法。每個食物都可以與其他物品一起屬於一個羣組,或者單獨屬於一個羣組。

說炸薯條,米飯和楔子屬於A組。飲料屬於B組。 然後,您可以將組合列表建模爲組的列表 - 即。 1組A項和1組B項,或者兩組A組項和1組B項。

您還可以讓食物同時屬於多個羣體......以使選項更加靈活。

數據庫模型可能會變得複雜定義所有的關係,但我認爲這是必要的。

也許是這樣的:

group(id, name, desc) - 主菜,開胃菜,飲料......或任何

foodItem(id, name, desc) - - 樣的項目組代表一個單一的項目 - 薯條,大米等

foodItem_group(foodIgem_Id, group_Id) - 食品映射到他們的小組 - 多對多

combo(id, name, desc) - 描述了一個組合

combo_group(combo_Id, group_Id) - 地圖羣體連擊 - 多對多

我認爲這會爲代表的基本要求做模型 - 你可能要額外的表來存儲什麼顧客實際訂購..當然檢測,如果客戶訂單匹配組合是由您的業務邏輯決定的。

0

我認爲這將最終獲取存儲在數據庫中。我建議創建兩個表:

  1. 將存儲組件(薯條,沙拉,大蒜等)
  2. 本來:ID1,ID2,關係。關係的存在:基於「屬於」關係,你會發現,如果所有組件都屬於某個餐

  • 屬於
  • 去。也許,然後選擇屬於該餐的所有組分,並且如果選擇的組分佔該餐的50%或更多,則建議該餐。

    基於「與之伴隨」的關係,您可以建議用餐的附加組件或選定的組件。

+0

例如,如何定義至少三個組件中的一個必須與該餐一起使用? – 2009-02-28 17:32:32

1
  1. 這似乎是一個訂單可以由任何飯菜,組件,或兩者的混合,所以我會說,有一個Order類,它具有的Component S和Meal的List。 Meal應該子類Component,或者他們應該實現相同的接口。
  2. A Meal由幾個「插槽」組成,可以由幾組「Component」填充。 Meal s應該知道他們有多少個插槽以及哪些可以填充它們。
  3. 「從Component列表中檢測Meal」的問題很棘手。把我的頭,我能想到的是給每個Meal,它利用Component秒的列表,如果該Meal可以從中進行返回true的方法的最佳方式的頂部(或可能的Component S中的子集,將彌補那Meal)。 Order會通過它所知道的Meal的列表,並查看它們中的任何一個是否可以由當前的Order中的Component製成。不過,可能有更好的方法來做到這一點。

希望這會有所幫助!

+0

謝謝你的回答,但據我瞭解(2)你似乎只是改寫我原來的要求:)也許你可以詳細說明。 – 2009-02-28 17:08:44

+0

有沒有你感到困惑的特定部分,我可以更好地解釋? – 2009-02-28 17:59:12

+0

我認爲阿曼達是在正確的軌道上。 要考慮的其他事項:使用iMeal界面,然後使用具體的「類型」膳食,例如,午餐實現iMeal,但只允許兩面,晚餐實現iMeal並允許三面。 – 2009-02-28 18:39:14

1

創建組件類和所有可能類型組件的子字幕(或對象)。

創建摘要膳食類和所有可能類型的膳食的子類。膳食可以檢查某個組件列表是否與它匹配(用於從組件列表中檢測膳食)。而一頓飯可以向顧客展示這頓飯的所有組成部分。

我同意阿曼達的意見,應該建造「插槽」。每個時隙表示膳食的組分選擇之一,例如,薯條或大米或楔子。 Slot也可以模擬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(大蒜或無蒜)

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

創建訂單類將包含一頓飯名稱和組件列表。如果一餐是有序的,叫Meal.PresentChoices()。如果給出的組件列表,去了所有的餐點和呼叫Meal.DoesItMatch。

0

好像你一頓可以是食品幾乎任何集合,所以用一個抽象基類(或接口)的食物開始。每個食物都有一個混合物:焦炭,茶,牛排,雞肉,馬鈴薯,米飯,意大利麪,湯,沙拉等。

使您的組件界面:開胃菜,晚餐,蛋白質,澱粉,喝酒等

將您的具體類重構爲您在編寫代碼和測試時似乎想要進入的任何層次結構。

灑在他們有意義的組件接口。

相關問題