UML 类 表示

UML Classes representation

我正在学习 UML,想创建一个小型餐厅应用程序,它有一个菜单、菜单中包含的菜肴以及菜肴中使用的产品。菜单分为不同的类型,只能包含适当的类型。 我想 class 菜单和菜肴应该是抽象的。 那是我的 UML 图。

如何最好地展示抽象classes的关系?

第一次尝试

如果我们看需求,即 Order 大约是 DishDishProduct 组成,Menus就像是某种Dishes的目录,我们会得出这样的图:

我们只会显示摘要 Dish 和摘要 Menu 之间的“关系”。专业菜肴和菜单继承了这种关联。只是你必须在协会的评论中表达使用与菜单兼容的菜肴的约束。

进一步反思

问题是我们是否真的需要 Menu 专业化。如果他们有非常不同的行为,这将是合理的。

此外,在您的示例中,您假设菜单专业化严格分离。但是,如果在稍后阶段您会有重叠的菜单,例如包含素食、纯素和肉类菜肴的主菜单,以及仅包含纯素菜肴但适用于所有菜肴的纯素菜单。

如果所有菜单专业化的行为都相同,并且如果这只是一种任意分类(而且,如果在实践中每个 class 您只有一个实例),那么它最好使 Menu 具体并将其与 Category class 相关联。顺便说一句,您还可以将抽象 Dish 关联到一个或多个 Category,这样可以更轻松地表达您想要的约束。

最后,值得探索 association class 的概念并重新思考 OrderDish 之间以及 Dish 和 [=13= 之间的内容].

我是在@Christophe之后才回答的,因为在他的提案(第一版)中有一些特别的问题。

一个订单至少包含一道菜。但是点菜不是组合的菜品,所以没有组合,对我来说更不是聚合。

一道菜由至少一种产品制成,使用一定数量的产品。根据产品的不同,数量是体积(例如液体)、重量(例如黄油)或数字(例如鸡蛋)等。为此,您可以使用 class-关系。该关系不能是组合,因为给定产品可用于多种菜肴。

一个菜单至少包含一道菜,但是一个给定的菜可以在多个菜单中使用,所以不能使用组合。在我的图表中,我使用了聚合,但这也许不是一个好主意。

假设您总是需要为MenuDish[=42]设置专门的classes =] 你可以拥有:

但我不确定你是否总是需要这些专业化,所以 DishMenu 不是抽象的,即使它们可以有专业化,并且你可以拥有:

(我想一道菜总是至少一个菜单的一部分,这是一个选择,所以 'preparation' 由厨师制作但不属于菜单的一部分不是一道菜)

正如@Christophe 在评论中所说,客户可以要求一些特定的说明(中等与血肉等),可以由 class-关系支持: