【问题标题】:Conversion of Association,Aggregation and composition into code in java?将关联、聚合和组合转换为java中的代码?
【发布时间】:2011-11-03 22:34:38
【问题描述】:

我知道java中的关联转换、聚合和组合有不同的表示方式。但是当我们将它们转换为代码(java 类)时,它们都以相同的方式表示。就像由教师教授的学生一样,它是关联的,将用具有班级教师实例变量的学生班级来表示。

部门有教授,这是聚合也将表示为部门类具有类教授的实例变量(数组)。

大学有组成的部门也将用大学类表示,该类具有类部门的实例变量(数组)。

因此,就代码而言,所有人都以相同的方式表示。那么Association、Aggregation和Composition给开发者带来哪些好处呢?

【问题讨论】:

    标签: java uml


    【解决方案1】:

    您在 Composition 中遗漏了部分故事。它需要几个额外的属性:

    • 父母的不变性(即孩子不能切换父母)
    • 孩子的生命周期责任在于父母。即父母负责创建和删除子实例。父母去世后孩子无法生存。

    您说得对,该关联将分别表现为子级和父级中的引用/引用集合。但如果要确保执行组合语义,代码还必须执行上述规则。

    至于聚合:我不使用它。语义过于松散,与直接关联没有优势。

    第一次。

    【讨论】:

    • 对不起,我错过了这两点。 Point1:-如果我们考虑原始帖子中的组合示例,您是说大学类应该具有类部门的实例变量(数组)作为最终变量。如果不是,我们将如何在代码中表示它。 Point2:- 是的,我同意你的观点,但是当我们将 uml 图转换为编码时并没有什么不同,因为它仍然是一个简单的实例变量。
    • 第 1 点:是的。第2点:这不仅仅是参考。 UML 复合语义要求“如果一个复合被删除,它的所有部分通常都会随之删除”(UML 上层结构 2.3,第 40 页)。在 C++ 等非 GC 语言中,这意味着析构函数代码必须确保在删除父级之前删除所有子级。对于 GC 环境,这不太明显。然而,也有一些习惯用法——例如由域驱动设计推广的“聚合根”方法——其中创建(或删除)子节点的唯一方法是通过父节点本身的方法......(ctd)。
    • ...所以在典型的 Order / OrderLine 场景中,从 Order 添加 OrderLine 的唯一方法是调用 Order.AddOrderLine()(与删除类似)。总结一下:代码中没有直接的、声明性的类比来表示复合。相反,您必须按程序构建行为。因此,识别代码中的复合物需要大量的“模式识别”。如果引用是最终的,并且创建/删除子项的唯一方法是通过父项的接口,则该关系可能是复合关系。 hth.
    • 感谢 sfinnie 的精彩解释。想再补充一点。正如您所说,父母去世后孩子无法生存并解释了GC条款。好点。但是我们也可以说,如果我们想先从数据库中删除大学,我们已经从数据库中删除了部门。在某种程度上,它有助于开发人员理解不同实体之间的行为。
    • @Mohit:基本上,是的。关系数据库确实有一个声明性习惯用法:在 DDL 中,添加一个“ON CASCADE DELETE”约束。它说如果删除父级,则也必须删除子级。但是,如果您无法直接控制 DDL,那么代码必须确保在删除父级时删除所有子级是正确的。 hth - 感谢您的友好评论。
    猜你喜欢
    • 2013-12-16
    • 2016-06-27
    • 2012-09-18
    • 2012-07-01
    • 2013-01-28
    • 2012-11-14
    • 2014-11-04
    • 2019-08-20
    • 2013-05-14
    相关资源
    最近更新 更多