立轩 2019-4-8 16:50
我有个问题,有个类书,一个类人,现在人想翻书,那么翻这个方法是放在书的类上,还是人的类上
UMLChina潘加宇
一、区分业务建模和分析工作流中的类
首先,我们要区分业务建模和分析工作流中的类。
如果是业务建模工作流,建模的内容是组织流程中各个系统之间的协作,摄像机会拍到一个人肉系统做出翻书的行为,用业务序列图表达如图1。这个图只能如实描述所拍到的现实,无法"设计"。
图1 摄像机拍到的人翻书的序列图(注意,书不作为一个智能系统出现,只是作为人的"翻书"操作的参数。)
这里假设谈论的"书"指的是实体书,而不是电子阅读器系统(平时说的"我买了个电纸书",实际上买的是阅读器系统)。人用电子阅读器系统看书的业务序列图,留个读者自己画。
如果是分析工作流,建模的内容是软件系统内部的结构和行为。如果软件开发人员的大脑容量、运算速度以及身体健壮程度是现在的一万倍,像图2那样做也是可以的,毕竟最早的时候,编程序就是用纸带穿孔嘛。
图2 关于"高手"的传说
只不过现在的软件系统里需要封装的东西太多太复杂了,人脑直接二进制编码无法短时间搞定(也不是搞不定,就是时间长而已),所以,用面向对象的思维帮助人脑应对这种复杂性,是一种开发软件的方法。
如果决定用面向对象的思维来思考软件系统内部的机制,我们就假设软件系统由一些类来定义,这些类模拟了现实中的一些事物和概念,然后把软件系统需要承担的各种责任分解并分配到这些类中。
和图1所示场景相关的软件系统,如果用面向对象的思维,里面有什么类呢?
(1)如果这个软件系统不需要记住书和人的信息,系统里面的类没有"人"和"书"。例如图书馆装了一个视频监控系统。
(2)如果这个软件系统需要记住书的信息,不需要记住人的信息,那么系统里面的类有"书"但没有"人"。
(3)如果这个软件系统需要记住人的信息,不需要记住书的信息,那么系统里面的类有"人"但没有"书"。
(4)如果这个软件系统需要记住书的信息,也需要记住人的信息,那么系统里面的类有"书"也有"人"。
(5)如果这个软件系统需要记住书的信息,也需要记住人的信息,而且还需要记住"翻书"这个行为给人或书带来的影响,这应该就是问题所要问的。
注意:软件系统里面的"人"不等于外面真实的人肉系统。外面这个人肉系统是父母用DNA编码,老师升级了十几年得到的,目前宇宙间已知的最发达智能系统,里面那个"人"只是为了方便人脑把握问题复杂性而构思的一个模拟。到底模拟0.00001%还是99.99%,看软件系统需要封装的信息的复杂度了。
之所以啰嗦这么多才说到正题,是想要说明,轻飘飘的一句话背后并没有那么简单。
二、"翻书"是谁的责任
针对上一节的第(5)种情况,如果把"翻书是谁的操作"这个问题抛出后,只给3秒钟时间思考——
有的人会直接对应现实,现实中人翻书,翻书当然是人的责任;
有的人可能会迅速判断书的状态最值得关注,翻书是书的责任。如果这两个选一个招人,肯定选后者了。
不过,更严谨的思考应该是这样:
(1)如果"翻书"会引起"人"的状态变化,"人"有"翻书"的操作;
可能有人会想,"翻书"怎么会引起"人"的状态变化呢?这种先入为主的思想不可取。想想秦始皇焚书坑儒就知道了,也可以用状态机表示如图3。
图3 人的状态机
"看书相当于吸毒"的时代离我们并不遥远,如图4。
图4 几十年前的报纸(来自孔夫子旧书网)
(2)如果"翻书"会引起"书"的状态变化,"书"有"(被人)翻"的操作;
图5 书的状态机
(3)如果"翻书"会引起"人"和"书"的状态变化,"人"有"翻书"的操作,"书"也有"(被人)翻"的操作;
(4)如果"翻书"不会引起"人"的状态变化,也不会引起"书"的状态变化,比如说,系统只要求像录像机一样记住某日某时某某人翻了某某书,没有其他逻辑。用来"记住某日某时某某人翻了某某书"的"翻书"操作放在哪里都无所谓。