uml - 如何正确显示uml案例图连接
问题描述
我正在尝试创建一个系统来管理针对 covid 的疫苗。
该系统支持 3 种不同的疫苗,但每个公民只能接种一种,并且系统必须区分 65 岁以上的公民,阿斯利康疫苗不能给予超过该年龄的人。
下面我尝试创建一个基本的 UML 类图。但是我很确定我错过了一些东西,因为疫苗也应该与阿斯利康类有关?
解决方案
该图令人困惑,因为它仅显示关联,但以意想不到的方式重新组合它们。它看起来更像是决策树,而不是真正的类图。
您需要考虑的第一个改进:
Pfizer BioNTech
,Moderna
并且AstraZeneca
每个都是一个Vaccine
:你应该通过从特定疫苗到一般疫苗的概括来展示这一点vaccine
。age 65+
似乎不是一个类的好候选者:在大多数 OO 语言中,一个类的对象在其整个生命周期中都会保留该类。但是公民在 65 岁时不会改变阶级。年龄是 的(派生的)属性Citizen
。“阿斯利康疫苗不能给 65 岁以上的人接种”的措辞也是一种约束的表达。最后,如果您管理疫苗,您还需要管理疫苗。当您写“公民只能获得一种”时,您可能是指“一种”:您提到的疫苗原则上需要打2针。而且在世界上大多数国家,两次注射必须是同一种疫苗,这是另一个限制。剩下的问题是 65+ 限制是否适用于第一枪或第二枪?
这将引导我们得到如下图:
额外的想法:
您可以通过将关联
Vaccination
设为关联类来管理镜头。关于开放/封闭原则有一个问题:如果您要添加新疫苗,则可能必须对某些疫苗添加不同的限制。备择方案:
- 制作
Vaccine
一个抽象类(或接口),其中包含更多需要由具体类实现的操作:getRequiredMinAge()
,getRecommendedMinAge()
,getRecommendedMaxAge()
,getrequiredMaxAge()
,而不是对约束进行硬编码。 - 使用
Vaccine::checkCompatibility(c: Citizen)
将约束验证转移到Vaccine
类的方法
- 制作
人们可能想知道是否真的需要对疫苗进行细分。
推荐阅读
- python - 如何将 LineString 拆分为段
- javascript - Javascript getElementById().value 在输入元素上返回未定义
- python - 我如何知道信封是否已送达收件人邮箱?
- julia - 错误:LoadError:找不到 deps.jl 文件。请尝试运行 Pkg.build("Arpack")
- spring-boot - 在采用 @queryParam(可选参数)的 SpringBoot @RestController 的 GET 操作中使用 Swagger(2.9.2)
- android - 如何在 Android 上更改 PopUpMenu 样式(背景颜色)
- flutter - Flutter:共享首选项单例未正确初始化
- sql - SQL查询获取传入当年参数的月份的第一天
- django - 是否有特定的方法来引用 django 中小部件的模板?
- bash - 如果远程位置存在相同的现有文件夹名称,则将文件夹中的所有文件移动到新位置