UML硬核精细防疫指南的领域模型

潘加宇 [2020/3/17]

几天前发了一篇《UML硬核精细防疫指南》,带来了不少读者,刘京城同学提交的领域模型获得了本轮竞赛优胜。

下面先给出刘京城同学提交的防疫指南领域模型(类图和状态机图)。刘同学画得很不错,把文章里提到的概念、关系和逻辑比较准确地理出来了,我在此基础上再来说说怎样精益求精,然后给出我自己画的防疫指南领域模型,并针对模型解释一些要点。时间有限,考虑未必周到,仅供读者批评指正。

刘同学的类图和状态机图如图1-图5所示。

fangyiljc01.png

图1 防疫指南类图Part1(刘京城)

fangyiljc02.png

图2 防疫指南类图Part2(刘京城)

fangyiljc03.png

图3 防疫指南类图Part3(刘京城)

fangyiljc04.png

图4 防疫指南类图Part4(刘京城)

fangyiljc05.png

图5 防疫指南“生鲜”状态机图(刘京城)

我自己画的类图如图6所示。

fangyipjy01.png

图6 防疫指南类图(潘加宇),为简化问题,把接触定义为2方接触,3P或以上的接触忽略。

至于要画什么类,要看打算解决的问题。关于防疫,我们可能关心的问题可能有:

*我的手(脸、衣服……)干净吗?

*这个物品干净吗?

*电梯能进吗?

*这个人危险吗?

*我的口罩是不是该换了?

要能解答这些问题,需要记住哪些领域概念、领域概念之间的关系和领域逻辑?这些就是我们要建模的东西。

例如,要解决第一个问题“我的手(脸、衣服……)干净吗?”和第二个问题“这个物品干净吗?”,记住身体部位和物品,物品和物品,身体部位和身体部位的每一次接触是有帮助的。靠人脑未必记得住,事实上很多人无意识做了很多动作他自己根本不知道,那就电脑帮记呗!所以我们可能就会有这样的类:

fangyipjy02.png

图7 防疫指南类图片段

然后还需要记住类似这样的逻辑:

fangyipjy03.png

图8 接触体的状态机图

其他图如图9-图11。

fangyipjy04.png

图9 电梯的状态机图

fangyipjy05.png

图10 装备的状态机图

fangyipjy06.png

图11 人的状态机图

从以上我画的图中可以看到,类图做了进一步抽象,不再有手、口罩等类,而是抽象为“人体部位类型”、“装备类型”。这是把泛化转为关联来处理。冰箱也看作房屋的一个区域,没有单独的类。

还可以看到,防护的作用是使得“接触”的次数少了很多。

区分物品和装备是考虑到二者目的不同。装备被牺牲,牺牲装备来保护物品和人体部位——“为了取这个快递,我耗费了一个口罩”。

电梯调度是很复杂的问题,不管,只需要记住谁进了哪个电梯即可。

附上《UML硬核精细防疫指南》

weixinpanjiayu2.jpg