UML 类 表示
UML Classes representation
我正在学习 UML,想创建一个小型餐厅应用程序,它有一个菜单、菜单中包含的菜肴以及菜肴中使用的产品。菜单分为不同的类型,只能包含适当的类型。
我想 class 菜单和菜肴应该是抽象的。
那是我的 UML 图。
如何最好地展示抽象classes的关系?
第一次尝试
如果我们看需求,即 Order
大约是 Dish
,Dish
由 Product
组成,Menu
s就像是某种Dish
es的目录,我们会得出这样的图:
我们只会显示摘要 Dish
和摘要 Menu
之间的“关系”。专业菜肴和菜单继承了这种关联。只是你必须在协会的评论中表达使用与菜单兼容的菜肴的约束。
进一步反思
问题是我们是否真的需要 Menu
专业化。如果他们有非常不同的行为,这将是合理的。
此外,在您的示例中,您假设菜单专业化严格分离。但是,如果在稍后阶段您会有重叠的菜单,例如包含素食、纯素和肉类菜肴的主菜单,以及仅包含纯素菜肴但适用于所有菜肴的纯素菜单。
如果所有菜单专业化的行为都相同,并且如果这只是一种任意分类(而且,如果在实践中每个 class 您只有一个实例),那么它最好使 Menu
具体并将其与 Category
class 相关联。顺便说一句,您还可以将抽象 Dish
关联到一个或多个 Category
,这样可以更轻松地表达您想要的约束。
最后,值得探索 association class 的概念并重新思考 Order
和 Dish
之间以及 Dish
和 [=13= 之间的内容].
我是在@Christophe之后才回答的,因为在他的提案(第一版)中有一些特别的问题。
一个订单至少包含一道菜。但是点菜不是组合的菜品,所以没有组合,对我来说更不是聚合。
一道菜由至少一种产品制成,使用一定数量的产品。根据产品的不同,数量是体积(例如液体)、重量(例如黄油)或数字(例如鸡蛋)等。为此,您可以使用 class-关系。该关系不能是组合,因为给定产品可用于多种菜肴。
一个菜单至少包含一道菜,但是一个给定的菜可以在多个菜单中使用,所以不能使用组合。在我的图表中,我使用了聚合,但这也许不是一个好主意。
假设您总是需要为Menu和Dish[=42]设置专门的classes =] 你可以拥有:
但我不确定你是否总是需要这些专业化,所以 Dish 和 Menu 不是抽象的,即使它们可以有专业化,并且你可以拥有:
(我想一道菜总是至少一个菜单的一部分,这是一个选择,所以 'preparation' 由厨师制作但不属于菜单的一部分不是一道菜)
正如@Christophe 在评论中所说,客户可以要求一些特定的说明(中等与血肉等),可以由 class-关系支持:
我正在学习 UML,想创建一个小型餐厅应用程序,它有一个菜单、菜单中包含的菜肴以及菜肴中使用的产品。菜单分为不同的类型,只能包含适当的类型。 我想 class 菜单和菜肴应该是抽象的。 那是我的 UML 图。
如何最好地展示抽象classes的关系?
第一次尝试
如果我们看需求,即 Order
大约是 Dish
,Dish
由 Product
组成,Menu
s就像是某种Dish
es的目录,我们会得出这样的图:
我们只会显示摘要 Dish
和摘要 Menu
之间的“关系”。专业菜肴和菜单继承了这种关联。只是你必须在协会的评论中表达使用与菜单兼容的菜肴的约束。
进一步反思
问题是我们是否真的需要 Menu
专业化。如果他们有非常不同的行为,这将是合理的。
此外,在您的示例中,您假设菜单专业化严格分离。但是,如果在稍后阶段您会有重叠的菜单,例如包含素食、纯素和肉类菜肴的主菜单,以及仅包含纯素菜肴但适用于所有菜肴的纯素菜单。
如果所有菜单专业化的行为都相同,并且如果这只是一种任意分类(而且,如果在实践中每个 class 您只有一个实例),那么它最好使 Menu
具体并将其与 Category
class 相关联。顺便说一句,您还可以将抽象 Dish
关联到一个或多个 Category
,这样可以更轻松地表达您想要的约束。
最后,值得探索 association class 的概念并重新思考 Order
和 Dish
之间以及 Dish
和 [=13= 之间的内容].
我是在@Christophe之后才回答的,因为在他的提案(第一版)中有一些特别的问题。
一个订单至少包含一道菜。但是点菜不是组合的菜品,所以没有组合,对我来说更不是聚合。
一道菜由至少一种产品制成,使用一定数量的产品。根据产品的不同,数量是体积(例如液体)、重量(例如黄油)或数字(例如鸡蛋)等。为此,您可以使用 class-关系。该关系不能是组合,因为给定产品可用于多种菜肴。
一个菜单至少包含一道菜,但是一个给定的菜可以在多个菜单中使用,所以不能使用组合。在我的图表中,我使用了聚合,但这也许不是一个好主意。
假设您总是需要为Menu和Dish[=42]设置专门的classes =] 你可以拥有:
但我不确定你是否总是需要这些专业化,所以 Dish 和 Menu 不是抽象的,即使它们可以有专业化,并且你可以拥有:
(我想一道菜总是至少一个菜单的一部分,这是一个选择,所以 'preparation' 由厨师制作但不属于菜单的一部分不是一道菜)
正如@Christophe 在评论中所说,客户可以要求一些特定的说明(中等与血肉等),可以由 class-关系支持: