【问题标题】:Class Diagram: Aggregation or Composition类图:聚合或组合
【发布时间】:2015-10-31 17:36:21
【问题描述】:

我正在对类图进行分配,下面显示了类OrderMenu Item 之间的关联。链接应该是聚合(弱)还是组合(强)?

我很困惑,因为我看到了显示聚合的示例。我觉得它应该是组合,因为Order 必须至少添加 1 个Menu Item。我错了吗?

【问题讨论】:

  • 你的导师的里程可能会有所不同,但我的一位教授曾经说过:“聚合和组合之间的区别非常微妙,定义不明确,完全取决于个人解释。当你画一个UML 类图, 决定使用聚合或组合, 但不要浪费任何进一步的想法. 每当你遇到一个包含两者的图时, 不要假设作者想通过区别来表达任何具体的东西, 而是,作者在不同的时间不小心点击了不同的按钮。” 也许这会有所帮助;)

标签: uml aggregation composition class-diagram


【解决方案1】:

链接应该是聚合(弱)还是组合(强)?

两者都可以。主要区别在于:

如果是合成:

  • MenuItem 对象在 Order 对象的实例化时实例化。
  • 一旦 Order 对象被破坏,MenuItem 对象就会被破坏。

  • C++ 示例:

    class Order {
        MenuItem menus[NUMBER_OF_MENUS];
    };
    

如果是聚合:

  • MenuItem 对象的生命周期独立于 Order 对象的生命周期。

  • C++ 示例:

    class Order {
        MenuItem* menus[NUMBER_OF_MENUS];
    };
    

所以这是一个设计决定。并且可能还取决于实现语言。例如在Java中,两者没有区别,所有的对象变量都是引用。

【讨论】:

    【解决方案2】:

    很大程度上取决于上下文。让我们使用一个示例来为您阐明差异。

    假设您正在汽车工厂组装一个 Car 对象。 Car 对象有两个 Axle 对象、四个 Wheel 对象、一个 Motor 对象,等等。所有这些对象只在整个汽车的上下文中才有意义(一旦你把它们放进去,它们就会留在那里)。那是组成。

    现在,假设您在垃圾场中有一个 Car 对象。 Car 对象具有相同的东西,但您可以将车轮或车轴或电机从其中拉出并单独出售。在这种情况下,每个部件的使用寿命都与汽车的使用寿命不同。这就是聚合。

    【讨论】:

    • 然后回答 OP 的问题(没有汽车,但订单和菜单项)会是?
    • 哇。问题的答案是“很大程度上取决于上下文”。如果您想详细说明 OP 的不同上下文,请继续。我更愿意给出一个类似的上下文,其中区别很明显。如果您发现这在教学上不合理,请更详细地解释原因。现在,我已经竭尽全力适应你过去多刺和粗暴的个性,我现在要求你至少在未来尽量避免讽刺、自大和/或不尊重的行为。恐怕我快受够了。提前致谢。
    • 冒犯。 OP 的问题不仅是关于抽象术语聚合与组合的问题,已经回答了很多次,而且是关于 OrderMenu Item 的具体示例。你的答案比@sergej 的答案更完整更好吗?
    • 为什么必须这样?这不是故意的,只是看待同一件事的另一种方式。有时,当人们用一种以上的方式解释时,他们会更容易理解。
    • 当然。 OP 显示了一个图表,解释该图表显示了两个类之间的关联,即 Order 和 Menu Item。她提到它将它们显示为构图。她提到她也看到了她使用聚合的示例,并询问哪个是正确的。那么,哪个是正确的,组合还是聚合?她猜测它可能是组合,因为订单总是需要一个菜单​​项。那么,有谁回答过是使用聚合还是组合的问题呢?我已经给出了一些提示。我要告诉她吗?我宁愿她想出来......
    猜你喜欢
    • 2021-12-16
    • 2011-05-03
    • 2012-09-21
    • 2011-12-26
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    相关资源
    最近更新 更多