【问题标题】:Aggregation in class diagram and class properties类图中的聚合和类属性
【发布时间】:2013-10-31 17:03:43
【问题描述】:

在关于类图的讲座中,出现了以下幻灯片,描述了电梯系统中的关系:

讲座将黑色箭头称为“复合聚合”关系,这意味着子级不能独立于父级而存在。

在这个电梯系统示例中,Motor 对象在 Elevator 对象之外是不相关的。

但我不明白复合聚合如何出现在代码本身中。我希望电梯中有一个“myMotor”属性,但没有。

是不是因为通过绘制这种关系,我们告诉程序员他需要实现它,但实现细节是他自己选择的?

与明确声明的父对象的属性相反(如电梯的 isActive 布尔属性)?

【问题讨论】:

    标签: oop uml class-design class-diagram


    【解决方案1】:

    U.M.L.可以通过多种方式用作非常概念化的设计工具,或更具体的编程设计工具。

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

    • 有时,您可能希望显示一个类的所有成员。不好,当成员太多时。
    +----------------------------+ |电梯类 | +----------------------------+ | [+] 布尔值: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
    

    干杯。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-08-21
          • 2011-12-26
          • 1970-01-01
          • 2013-11-05
          • 2012-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-31
          相关资源
          最近更新 更多