5

假设我必须为餐馆的饭菜建模。

一顿饭可以由几个“组成部分”组成:

  1. (薯条或米饭或楔子)
  2. 和(六种不同的饮料之一)
  3. 和(七种不同的酱汁中的一种或两种,或者根本没有)

另一餐可以包括:

  1. (沙拉或米饭)
  2. 和(大蒜或没有大蒜)

进一步的膳食可以包括:

  1. 只是薯条

  2. 只是一种饮料

  3. 只是 ...

我该如何建模?(UML,实体关系,代码,......任何你能解释得最好的东西)

如果您知道我想要执行的一些任务,也许它会有所帮助,所以:

  • 允许客户先选择一餐并显示所有剩余的“附加组件”。
  • 从组件列表中检测一顿饭。例如,如果客户点了薯条、酱汁和饮料,则应该可以从第一个示例中检测到餐点。

我曾考虑将所有组件划分为文章,然后添加某种角色映射以将“薯条”标记为“芝士汉堡”、“炸肉排”、“......”的补充,但后来我想知道,我如何建模多个添加-ons,可选的附加组件,n-out-of-m 附加组件...

我希望你能帮助我...

4

5 回答 5

1
  1. 似乎一个订单可以包含餐点、组件或两者的混合,所以我会说,有一个包含s 和sOrder列表的类。 应该是子类,或者它们应该实现相同的接口。ComponentMealMealComponent
  2. AMeal由几个“槽”组成,这些槽可以由一组Components 填充。 Meals 应该知道他们有多少个插槽以及什么Component可以填充它们。
  3. Meal从 s 列表中检测 a Component”问题很棘手。在我的脑海中,我能想到的最好方法是给每个Meal方法一个方法,该方法接受一个Components 列表并返回 true,如果Meal可以由它们(或者可能是Component组成它的 s的子集Meal)。 Order将遍历Meal它所知道的 s 列表,看看是否可以从Componentcurrent 中的 s 中生成它们中的任何一个Order。不过,可能有更好的方法来做到这一点。

希望这可以帮助!

于 2009-02-28T16:35:33.327 回答
1

为所有可能的组件类型创建组件类和子类(或对象)。

创建一个抽象的Meal类,以及所有可能的 Meals 类型的子类。Meal 可以检查某个组件列表是否与它匹配(用于从组件列表中检测一餐)。一顿饭可以向顾客展示这顿饭的所有成分选择。

我同意阿曼达的观点,即膳食应该由“插槽”构建。每个插槽代表膳食的一种成分选择,例如薯条或米饭或楔子。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;
};

具体餐食之一:(沙拉或米饭)和(大蒜或无大蒜)

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 。

于 2009-02-28T17:33:29.957 回答
1

如果这是家庭作业,那可能没关系......但是 - 如果这将在现实世界的应用程序中使用,我强烈建议不要为每个食物项目使用具体类,即。可乐课、沙拉课、米饭课等如上推荐。这是使您的应用程序不灵活的可靠方法。

拥有一个具有名称属性或类似属性的食品类和饮料类会好得多。

想象一下,仅仅因为现在有一个新的特殊或食品项目而不得不重建你的整个应用程序......不酷;)。

我认为其他答案中缺少的是团体的想法。每个食物项目可以与其他项目一起属于一个组,或者单独属于一个组。

假设薯条、米饭和楔子属于 A 组。饮料属于 B 组。然后您可以将组合建模为组列表 - 即。1 组 A 项目和 1 组 B 项目,或 2 组 A 项目和 1 组 B 项目。

您还可以使食物项目能够同时属于多个组...以使选项更加灵活。

db 模型定义所有关系可能会变得复杂,但我认为这是必要的。

也许是这样的:

group(id, name, desc) - 一组类似的项目 - 主菜、开胃菜、饮料……或任何东西

foodItem(id, name, desc)- 代表单个项目 - 薯条、米饭等。

foodItem_group(foodIgem_Id, group_Id)- 将食物映射到他们的组 - 多对多

combo(id, name, desc)- 描述一个组合

combo_group(combo_Id, group_Id)- 将组映射到组合 - 多对多

我认为这可以表示基本所需的模型 - 您可能需要额外的表来存储客户实际订购的内容。当然,检测客户订单是否与组合匹配取决于您的业务逻辑。

于 2009-02-28T17:55:20.123 回答
0

我认为这最终会存储在数据库中。我建议创建两个表:

  1. 将存储组件(薯条,沙拉,大蒜等)
  2. 会有:id1,id2,关系。关系是:
    • 属于
    • 搭配

根据“属于”关系,您可以找到所有组件是否属于某餐。也许然后去选择属于该餐的所有成分,如果选择的成分占该餐的 50% 或更多,则建议该餐。

基于“搭配”关系,您可以建议添加到膳食或所选组件中。

于 2009-02-28T16:31:54.427 回答
0

似乎你的饭菜几乎可以是任何食物的集合,所以从一个食物的抽象基类(或接口)开始。制作许多具体的子类,每种食物一个:可乐、茶、牛排、鸡肉、土豆、米饭、意大利面、汤、沙拉等。

让你的组件接口:开胃菜、晚餐、蛋白质、淀粉、甜点、饮料等。

在您编写代码和测试时,将您的具体类重构为它们似乎想要进入的任何层次结构。

散布在有意义的组件接口中。

于 2009-02-28T17:44:00.790 回答