繁体   English   中英

composite with association 是否仍然遵循 OOP 的规则?

[英]Does combining composition with association still follow the rules of OOP?

对于class图,一个基数object组成的两个对象之间是否存在关联或聚合?

示例:Class Car与 class Engine和 class Fueltank具有组成关系。 所以Car有一个Engine和一个Fueltank ,而Engine和一个Fueltank依赖于Car 但是Engine还需要来自Fueltank的信息,而无需Car的干预(例如根据顺序图)。 这意味着EngineFueltank也有关系,尽管它们都是Car的组合。 见下图:

在此处输入图像描述

那么,问题是,在 class 图中是否会出现这样的“循环”或更好的冗余关联? 或者这是否破坏了 OOP 的规则?

这是合法的UML ...

这种组合和关联的组合在 UML 中是完全合法的,不会破坏 OOP。UML 在这方面只有几个约束:

  • 复合聚合是一种强聚合形式,它要求一次最多将一个部分 object 包含在一个复合 object 中。

  • 组合可以在具有传递删除特性的有向无环图中链接;

  • 如果关联是二进制的并且另一端未标记为共享或复合聚合,则关联的端属性只能标记为共享或复合聚合。

前两个限制在 object 级别,不一定在 class。最后一个限制是针对 class 图:它说同一个关联不能在两端有复合或共享聚合。 这些限制都与您的图表无关。

...但可能无法表达您的想法

问题是这张图没有表达你的想法。 它说一辆Car c由一个Engine e和一个Fueltank f组成; 它还说e与 Fueltank 聚合在一起,这可能是巧合的 f,但也可能是另一个Fueltank ,甚至是另CarFueltank model 并不能很好地表示类之间的三角关系。 这里有一些提示:

  • 您可以通过添加一些限制条件来防止不一致,例如发动机油箱与汽车油箱相同。
  • 您可以使发动机/油箱关系成为派生关联(即发动机的油箱将以某种方式从汽车的油箱派生。
  • 您可以使 car/fueltank 关系成为派生关联(即汽车的油箱派生自其发动机)。
  • 您忽略了 engine/fueltank 之间的关系,而是将汽车用作其组件之间的中介。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM