4

In a lecture about Class diagrams the following slide appeared which describes the relationship in an Elevator system:

Elevator system

The lecture called the black headed arrows a "composite aggregation" relationship which means that the child cannot exist independently of the parent.

In this elevator system example, the Motor object is irrelevant outside of the Elevator object.

What I don't understand though is how the composite aggregation appears in the code itself. I'd expect there to be a "myMotor" property in the Elevator but there isn't.

Is it because by drawing this relationship we tell the programmer that he needs to implement it but the implementation details are his to choose?

As opposed to the father object's proprties which are stated explicitly (like the elevator's isActive boolean property)?

4

3 回答 3

1

UML 可以以多种方式用作非常概念化的设计工具,或更具体的编程设计工具。

因此,在表示复合聚合时,可以通过多种方式表示。

  • 有时,您可能希望显示一个类的所有成员。不好,当成员太多时。
    +----------------------------+
    | 电梯类 |
    +----------------------------+
    | [+] 布尔值:isActive |
    | [+] 布尔值:isInOrder |
    | [+] 楼层:位置 |
    | [+] 电机类:电机 |
    | [+] 门类:门 |
    +----------------------------+
    | [+] 开始操作() |
    | [+] 停止操作() |
    | [+] gooUp() |
    | [+] gooDown() |
    | [+] 打开门() |
    | [+] 关闭门() |
    +----------------------------+
  • 有时,您可能想要隐藏一个类的所有成员。很好,当你想专注于课堂而不是成员时。注意:这可能是您现在正在寻找的情况。
    +--------------------------+1 1+------------------ --------+
    | 电梯等级 |------<*>| 救援按钮类 |
    +--------------+ +---------- -----+
  • 有时,您可能希望显示某个类的某些成员,并隐藏另一个。
    +-------------------------+ 1 1 +-------- --------+
    | 电梯等级 |------<*>| 电机按钮类 |
    +--------------+ +---------- -----+
    | [+] 布尔值:isActive |
    | [+] 布尔值:isInOrder |
    | [+] 楼层:位置 |
    | [+] 电机类:电机 |
    | [+] 门类:门 |
    +----------------------------+

为了让事情变得有点复杂,电机以及其他元素不一定必须由电梯类中的引用成员引用。

示例(c 风格):

class ElevatorClass {
public:
  List<ComponentClass*> Components;

  ...

  void AddComponent(ComponentClass* ThisComponent);
} // class ElevatorClass

...

MyElevator.AddComponent(MyMotor);

在前面的代码示例中,没有直接引用该成员。

我个人同意你的看法,这很清楚:

class ElevatorClass {
public:
  MotorClass* Motor;
  MotorClass* Motor;
} // class ElevatorClass

干杯。

于 2013-10-31T18:39:39.467 回答
0

您的假设是正确的 -UML关系没有指定实现细节。在组合的情况下,要求是Motor对象生命周期与包含对象的生命周期绑定Elevator。这可以通过多种方式实现(也取决于您使用的语言)。它可以是 内部的一个属性Elevator,在这种情况下,它将与包含的 一起被自动销毁Elevator。另一方面,它可以是在包含对象的生命周期内手动实例化和释放的外部Elevator对象。实施取决于具体情况和其他设计考虑因素,例如简单性、灵活性、模块化等。

有许多细节可以添加到图表中。图表的创建者需要考虑包含什么和省略什么。例如,私有属性通常与实现细节相关,并且对类图不感兴趣,因此不会被提及。明确提到的属性暗示了包含对象和属性之间的组合关系。这样的概念通常用于原始属性,例如 boolean、int 等。对于更复杂的属性,通常使用显式 UML 关系来描述对象之间的关系(例如 betweenElevatorMotor)。

于 2013-10-31T19:13:51.743 回答
0

对于复合聚合(也称为组合),通常这表示父子关系。在您的示例中,代码中的 Elevator 对象将仅包含对一个 Motor 对象的引用。这是一篇博客文章的链接,可以更好地解释它。寻找作文部分:

http://aviadezra.blogspot.com/2009/05/uml-association-aggregation-composition.html

我认为这种表示对图中的所有对象都有意义,除了 StopRequest。就我个人而言,我不会把它想象成电梯对象的组合,但请记住,UML 不是一门精确的科学。

于 2013-10-31T17:11:48.510 回答