【发布时间】:2021-08-17 16:22:15
【问题描述】:
我正在尝试创建一个管理新冠病毒疫苗的系统。
系统支持 3 种不同的疫苗,但每个公民只能接种一种,并且系统必须区分 65 岁以上的公民,阿斯利康疫苗不能给予超过该年龄的人。
下面我尝试创建一个基本的 UML 类图。但是我很确定我错过了一些东西,因为疫苗也应该与阿斯利康类有关?
【问题讨论】:
标签: uml class-diagram
我正在尝试创建一个管理新冠病毒疫苗的系统。
系统支持 3 种不同的疫苗,但每个公民只能接种一种,并且系统必须区分 65 岁以上的公民,阿斯利康疫苗不能给予超过该年龄的人。
下面我尝试创建一个基本的 UML 类图。但是我很确定我错过了一些东西,因为疫苗也应该与阿斯利康类有关?
【问题讨论】:
标签: uml class-diagram
该图令人困惑,因为它只显示关联,但以一种意想不到的方式重新组合它们。它看起来更像是决策树,而不是真正的类图。
您需要考虑的第一个改进:
Pfizer BioNTech、Moderna 和 AstraZeneca 都是 Vaccine:您应该通过从特定疫苗到通用 vaccine 的概括来展示这一点。
age 65+ 似乎不是一个类的好候选者:在大多数 OO 语言中,一个类的对象在其整个生命周期中都会保留该类。但是公民在 65 岁时不会改变班级。年龄是Citizen 的(派生)属性。 “阿斯利康疫苗不能给 65 岁以上的人接种”这句话也是一种约束的表达。
最后,如果您管理疫苗,您还需要管理疫苗。当您写“citizen can only get one”时,您的意思可能是“一种”:您提到的疫苗原则上需要打 2 针。而且在世界上大多数国家,两次注射必须是同一种疫苗,这是另一个限制。剩下的问题是 65+ 的限制是否适用于第一枪或第二枪?
这将使我们得到如下图:
其他想法:
您可以通过将关联 Vaccination 设为关联类来管理镜头。
关于开放/封闭原则存在一个问题:如果您要添加新疫苗,您可能必须对某些添加不同的限制。替代品:
Vaccine成为一个抽象类(或接口),还有一些需要由具体类实现的操作:getRequiredMinAge()、getRecommendedMinAge()、getRecommendedMaxAge()、getrequiredMaxAge(),而不是hard-对约束进行编码。Vaccine::checkCompatibility(c: Citizen)方法将约束验证转移到Vaccine类人们可能想知道是否真的需要对疫苗进行子分类。
【讨论】: