生日/死亡日期类应该是单个类的组合还是聚合?

Posted

技术标签:

【中文标题】生日/死亡日期类应该是单个类的组合还是聚合?【英文标题】:Does a birthdate/deathdate class should be a composition or an aggregation to an individual class? 【发布时间】:2019-09-28 10:58:12 【问题描述】:

实体是一个人。 所以该实体有一个生日,可能已经有一个死亡日期。 但是这个日期可以或不能被告知(取决于实体和信息的可用性);所以实体可能没有这些。

但我觉得在基数和关系类型上有些混乱。

我应该如何表示?

我创建了一个抽象类个人。它导致 2 个最终类:Person(已识别人员)或 Pseudonym(匿名人员)。 它链接到一个类 Birthdate 和一个类 Deathdate(两者都被概括为一个类 Date)。

[生日]----[个人]关系是: 一(可选)-to-many (0..1 - 1..*) 0..1 : 因为生日可以省略,个人只能有一个出生日期。 1..* : 因为生日必须至少与一个人有关,但可以与多个人有关。

[死亡日期]----[个人]关系是: 一(可选)-to-many (0..1 - 1..*) 0..1 :因为个人还没有死,只能死一次。 1..*:因为死亡日期必须至少与一个人有关,但可以与多个人有关。

但是,从理论上讲,每个人都有一个出生日期(并且会有一个死亡日期),所以我被作曲所吸引。但有些人可能更喜欢对这些日期保密,我想知道作文是否允许这样做。 此外,一个日期可以对应于几个人,在这里我也猜想组合是不可能的,否则是我在个人类及其实例(个人)之间造成了混淆,然后组合是可能的,但不是与前面提到的基数。

目前我选择了:

Aggregation :
___________                 _______________
|Birthdate|0..1-----1..*< >|               |
___________                | <<Individual>>|
|Deathdate|0..1-----1..*< >|_______________|

但我对这个犹豫不决

Composition :
___________              _______________
|Birthdate|0..1-----1<#>|               |
___________             | <<Individual>>|
|Deathdate|0..1-----1<#>|_______________|

正确答案是什么?感谢您的关注。

【问题讨论】:

为什么要开设这样的课程??为什么不使用简单的Date 类型属性呢? Date 类是对它们应用不同的日期格式化方法(英语 MM/DD/YYYY 和法语 DD/MM/YYYY 之间的差异)。Birthdate 和 Deathdate 类只是因为我没有希望将它们与其他日期(如出版日期等)混合,特别是封装可以与数据库交互的方法,因为这两个日期比标记更多的数据。 格式应用于表示层,不应与日期本身一起存储。在实践中,DateType 通常是通过某种数字和如何将该数字重新计算为实际日期的逻辑来实现的。检查 Excel/LibreOffice 计算更改格式如何更改日期显示方式。基础值保持不变 - 您可以使用函数轻松检查它以显示代表日期的数字(它是嵌入的)。 【参考方案1】:

这种方法存在许多问题。

首先 - 使用类作为日期只是一种矫枉过正。生日和死亡日期都是特定人的属性,可以很容易地建模为 Individual 类的内联属性。除非有重要的理由使用旧的 Date DataType 以外的东西,否则请保持标准方法。

对于可见性问题,正如面向对象的原则所说,无论如何您都不应该直接公开属性。而不是你应该有一个操作来负责检索出生日期和死亡日期,这将控制日期是否可以读取。您可以添加支持这一点的布尔属性,但如果查看日期的能力取决于个人的某些状态或其他事物(例如“谁”询问),则没有必要。在前一种情况下,您可能还希望将这些布尔属性明确显示为派生属性。

如果你坚持使用一个类作为日期(例如,你想要一个***风格的“Born on date”/“Deceased on date”集合),你应该只创建一个类 Date 并建立与这个类的关联与您在第二种方法中所做的方式非常相似。在这种情况下,多重性不是“数据库风格”,而是关联本身的属性。特别是你有一个生日/死亡日期和一个个人。默认情况下,您将有两个 1-0..1 关联,每个关联一个,但根据方法,您可能还有更复杂的方法。

为了更清楚,我稍后会添加图表。

最后一句话。

不要使用&lt;&lt; &gt;&gt; 作为类名。这些保留用于指示刻板印象。 如果您想表明 Individual 是抽象的,请以斜体显示或(如果您的工具不允许)使用 &lt;&lt;abstract&gt;&gt;stereotype。

【讨论】:

日期不是 UML 中预定义的数据类型。 感谢伊斯特的解释。我想我倾向于把简单的事情复杂化。

以上是关于生日/死亡日期类应该是单个类的组合还是聚合?的主要内容,如果未能解决你的问题,请参考以下文章

桥接模式

Java实验项目三——面向对象定义职工类和日期类

场景应用:Java 写一个根据生日日期计算距离生日还有多少天的工具类?

对Java8新的日期时间类的学习

JAVA 日期工具类的总结

JAVA8新特性随笔