UML硬核精细防疫指南的领域模型
潘加宇 [2020/3/17]
几天前发了一篇《UML硬核精细防疫指南》,带来了不少读者,刘京城同学提交的领域模型获得了本轮竞赛优胜。
下面先给出刘京城同学提交的防疫指南领域模型(类图和状态机图)。刘同学画得很不错,把文章里提到的概念、关系和逻辑比较准确地理出来了,我在此基础上再来说说怎样精益求精,然后给出我自己画的防疫指南领域模型,并针对模型解释一些要点。时间有限,考虑未必周到,仅供读者批评指正。
刘同学的类图和状态机图如图1-图5所示。
图1 防疫指南类图Part1(刘京城)
图2 防疫指南类图Part2(刘京城)
图3 防疫指南类图Part3(刘京城)
图4 防疫指南类图Part4(刘京城)
图5 防疫指南“生鲜”状态机图(刘京城)
我自己画的类图如图6所示。
图6 防疫指南类图(潘加宇),为简化问题,把接触定义为2方接触,3P或以上的接触忽略。
至于要画什么类,要看打算解决的问题。关于防疫,我们可能关心的问题可能有:
*我的手(脸、衣服……)干净吗?
*这个物品干净吗?
*电梯能进吗?
*这个人危险吗?
*我的口罩是不是该换了?
要能解答这些问题,需要记住哪些领域概念、领域概念之间的关系和领域逻辑?这些就是我们要建模的东西。
例如,要解决第一个问题“我的手(脸、衣服……)干净吗?”和第二个问题“这个物品干净吗?”,记住身体部位和物品,物品和物品,身体部位和身体部位的每一次接触是有帮助的。靠人脑未必记得住,事实上很多人无意识做了很多动作他自己根本不知道,那就电脑帮记呗!所以我们可能就会有这样的类:
图7 防疫指南类图片段
然后还需要记住类似这样的逻辑:
图8 接触体的状态机图
其他图如图9-图11。
图9 电梯的状态机图
图10 装备的状态机图
图11 人的状态机图
从以上我画的图中可以看到,类图做了进一步抽象,不再有手、口罩等类,而是抽象为“人体部位类型”、“装备类型”。这是把泛化转为关联来处理。冰箱也看作房屋的一个区域,没有单独的类。
还可以看到,防护的作用是使得“接触”的次数少了很多。
区分物品和装备是考虑到二者目的不同。装备被牺牲,牺牲装备来保护物品和人体部位——“为了取这个快递,我耗费了一个口罩”。
电梯调度是很复杂的问题,不管,只需要记住谁进了哪个电梯即可。