问题描述
我正在尝试创建一个系统来管理针对 Covid 的疫苗。
系统支持 3 种不同的疫苗,但每个公民只能接种一种,而且系统必须区分 65 岁以上的公民,阿斯利康疫苗不能提供给 65 岁以上的人。
下面我尝试创建一个基本的 UML 类图。但是我很确定我遗漏了一些东西,因为疫苗也应该与阿斯利康类相关联?
解决方法
该图令人困惑,因为它仅显示关联,但以意想不到的方式重新组合它们。它看起来更像是决策树而不是真正的类图。
首先需要考虑的改进:
-
Pfizer BioNTech
、Moderna
和AstraZeneca
都是Vaccine
:您应该用从特定疫苗到一般 {{1} }. -
vaccine
似乎不是一个很好的类的候选者:一个类的对象在它的整个生命周期中都保持着这个类。但是公民在 65 岁时不会改变阶级。年龄是age 65+
的(派生)属性。此外,“astrazeneca 疫苗不能给予 65 岁以上的人”这样的措辞也是一种限制的表达。 -
最后,如果您管理疫苗,您还需要管理注射。当您写“公民只能获得一个”时,您可能指的是“一种”:您提到的疫苗原则上需要注射 2 针。而在世界上大多数国家,两次注射必须是同一种疫苗,这是另一个限制。剩下的问题是 65+ 约束适用于第一个镜头还是第二个?
这将引导我们得到如下所示的图表:
其他想法:
-
您可以通过使关联
Citizen
成为关联类来管理镜头。 -
关于开放/封闭原则存在一个问题:如果您要添加新疫苗,您可能必须对某些疫苗添加不同的限制。替代方案:
- 使
Vaccination
成为抽象类(或接口),还有一些需要由具体类实现的操作:Vaccine
、getRequiredMinAge()
、getRecommendedMinAge()
、getRecommendedMaxAge()
,而不是对约束进行硬编码。 - 使用方法
getrequiredMaxAge()
将约束验证转移到Vaccine::checkCompatibility(c: Citizen)
类
- 使
-
人们可能想知道是否真的需要对疫苗进行子类化。