首页 > 解决方案 > 如何正确显示uml案例图连接

问题描述

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

该系统支持 3 种不同的疫苗,但每个公民只能接种一种,并且系统必须区分 65 岁以上的公民,阿斯利康疫苗不能给予超过该年龄的人。

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

类图

标签: umlclass-diagram

解决方案


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

您需要考虑的第一个改进:

  • 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类的方法
  • 人们可能想知道是否真的需要对疫苗进行细分。


推荐阅读