如何正确显示 uml 案例图连接

How to display uml case diagram connectivity correctly

我正在尝试创建一个系统来管理针对 covid 的疫苗。

系统支持3种不同的疫苗,但每个公民只能接种一种,系统必须区分65岁以上的公民,65岁以上的人不能接种阿斯利康疫苗。

下面我尝试创建一个基本的 UML class 图。但是我很确定我遗漏了一些东西,因为疫苗也应该连接到 AstraZeneca class?

该图令人困惑,因为它只显示关联,但以意想不到的方式重新组合它们。它看起来更像是一棵决策树,而不是真正的 class 图。

您首先需要考虑的改进:

  • Pfizer BioNTechModernaAstraZeneca 都是 Vaccine:你应该用从特定疫苗到一般疫苗的概括来证明这一点vaccine.

  • age 65+ 似乎不是 class 的好候选者:在大多数 OO 语言中,class 的对象在其运行期间保留 class一生。但是公民不会在 65 岁时更改 class。年龄是 Citizen 的(派生的)属性。 “阿斯利康疫苗不能给65岁以上的人”这句话更是一种约束的表达。

  • 最后,如果你管理疫苗,你也需要管理注射。当您写“citizen can only get one”时,您的意思可能是“一种”:您提到的疫苗原则上需要注射 2 针。而且在世界上大多数国家,两次注射必须是同一种疫苗,这是另一个限制。剩下的问题是 65+ 限制是否适用于第一枪或第二枪?

这将引导我们得出如下图:

其他想法:

  • 您可以通过将关联 Vaccination 设为关联 class.

    来管理镜头
  • 关于 open/closed 原则存在一个问题:如果您要添加新疫苗,您可能必须对某些疫苗添加不同的限制。备选方案:

    • 使Vaccine成为一个抽象的class(或接口),更多的操作需要由具体的classes来实现:getRequiredMinAge()getRecommendedMinAge()getRecommendedMaxAge()getrequiredMaxAge(),而不是对约束进行硬编码。
    • 使用方法Vaccine::checkCompatibility(c: Citizen)将约束验证转移到Vaccineclass
  • 有人可能想知道是否真的需要 class 接种疫苗。