如何正确显示uml案例图连通性

问题描述

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

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

下面我尝试创建一个基本的 UML 类图。但是我很确定我遗漏了一些东西,因为疫苗也应该与阿斯利康类相关联?

class diagram

解决方法

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

首先需要考虑的改进:

  • Pfizer BioNTechModernaAstraZeneca 都是 Vaccine:您应该用从特定疫苗到一般 {{1} }.

  • vaccine 似乎不是一个很好的类的候选者:一个类的对象在它的整个生命周期中都保持着这个类。但是公民在 65 岁时不会改变阶级。年龄是 age 65+ 的(派生)属性。此外,“astrazeneca 疫苗不能给予 65 岁以上的人”这样的措辞也是一种限制的表达。

  • 最后,如果您管理疫苗,您还需要管理注射。当您写“公民只能获得一个”时,您可能指的是“一种”:您提到的疫苗原则上需要注射 2 针。而在世界上大多数国家,两次注射必须是同一种疫苗,这是另一个限制。剩下的问题是 65+ 约束适用于第一个镜头还是第二个?

这将引导我们得到如下所示的图表:

enter image description here

其他想法:

  • 您可以通过使关联 Citizen 成为关联类来管理镜头。

  • 关于开放/封闭原则存在一个问题:如果您要添加新疫苗,您可能必须对某些疫苗添加不同的限制。替代方案:

    • 使Vaccination成为抽象类(或接口),还有一些需要由具体类实现的操作:VaccinegetRequiredMinAge()getRecommendedMinAge()getRecommendedMaxAge(),而不是对约束进行硬编码。
    • 使用方法 getrequiredMaxAge() 将约束验证转移到 Vaccine::checkCompatibility(c: Citizen)
  • 人们可能想知道是否真的需要对疫苗进行子类化。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...