UML状态机再说转腚、凤姐和武汉“最美红娘”
天赐 2023-8-5 16:00
我学习了您的视频(答疑者删去若干赞扬句子)……,面向舞台归类到1-4里面的哪一个?
******
补充背景:
07-凤姐学术妲己--抱歉!二十二年前我们没看懂《人月神话》,https://b23.tv/YU4kMjP
那道“未曾开言先转腚”建模竞赛题的解析,https://b23.tv/TtHBca6
******
UMLChina潘加宇
①-④只是把从几个行为变化而来的“形容词”列出来,和描述性形容词对比,看哪一个更适合作为状态的名称。
"面向舞台"应该不属于①-④中的任何一个,它相当于把“属性(包括关联)”变化为“状态”。
这样的命名,优先级排在①之后,但排在另外几种命名(已转腚、转腚中、待转腚)之前。
你想想,假设导师转腚之后,状态叫“已转腚”,那么,导师再转腚一次,转回去后,这个状态叫什么?“㕛转腚”,“已转回”?或者把“转腚”事件拆成两个?“由正转反”、“由反转正”,以达到一一对应的效果?
别说,某些领域驱动设计伪创新可能就会这么干,因为这样的做法符合领域驱动设计伪创新投资少、见效快、产量高、门槛低的特点。
针对以上说的“一一对应”问题,我已经在文章《DDD话语批评之一:评“状态和事件本质相同》中说过,此处不再重复。
沿着凤姐那张图上的“结婚”讨论下去,可以借用《DDD话语批评之一:评“状态和事件本质相同》中我画的一张状态机图,看看是否能帮助理解。
凤姐结婚,有什么状态变化?
如果和行为挂钩,可以是“未婚→已婚”,如果和属性挂钩,可以是“无配偶→有配偶”。
“无配偶、有配偶”比“未婚、已婚”更合适。
行为、属性、状态不是一一对应的。相对于状态绑定行为来说,状态绑定属性的危害更小,因为适用的行为规则是基于当前属性值(组合)来判断的。
(1)假设某国法律规定,允许一夫多妻或一妻多夫,此时绑定行为的“已婚”作为状态不合适,当然,“有配偶”作为状态也还不够,可以在“有配偶”里加子状态“配偶满”和“配偶未满”。
(此处可能有人会问:“配偶未满”和“无配偶”有啥区别,区别就是一个能“离婚”、“丧偶”,另一个不能。鲁迅曾说过:人类的悲欢并不相通,比丧偶还惨的是无偶可丧,今天你对我爱搭不理……)
(2)从“有配偶”变成“无配偶”,路线不止一条,可能是“离婚”,也可能是“丧偶”。
(3)看了罗翔老师的普法视频(张三泡上董事长女儿案),本来觉得还漏了一个,从“无配偶”到“有配偶”的路线也不止一条(事实婚姻),但又查了一下,1994年之前的事实才算,1994以后的都不算了。
我们再扩展开来看可能会有的另外几个问题:
(1)把事件“结婚”、“离婚”、“丧偶”改成“配偶++”、“配偶--”甚至改成“修改状态为**”,可以吗?
答:
不好。行为和属性不是一一对应的,这些事件除了带来配偶数量的变更之外,还有涉及到其他属性(例如财产)的各自不同的逻辑。
不过,这样即使不好,也比把状态直接和行为绑定要好,如下图,危害程度①<②<③
至于把事件改成“修改状态为***”,这倒是一个领域驱动设计伪创新可以发掘的创新点。
什么情况下该修改到什么状态,这个逻辑在哪里呢?简单,有个(上帝扔下来的)算法啊!
所以,我们留心领域驱动设计伪创新的文章(包括我批评过的),会发现它类图也没有,状态机图也没有,但是它会有一个或几个类叫“**er”、“**or”、“**器”、“**rule”、“**规则”、“**策略”、“**算法”,精华都在那里面藏着呢,上帝会帮他们搞定的。
(2)假设某国法律对离婚和丧偶另眼看待,认为离婚的人道德败坏,丧偶的人不祥,会多加一些限制,例如不允许当老师……,那么是不是应该可以把状态命名为“已离婚”、“已丧偶”?
答:
这只是说明,此时“法律”这个“系统”关注的属性多了几个,包括“离婚(史)”、“丧偶(史)”,适用的行为规则依然是基于当前属性值(组合)来判断的:
(注意:上半部的类图比较直观,但并非最合适的类图。“丧偶”、“离婚”只是衍生的知识,本质的知识是两个人的婚姻关系结束或某人死亡。例如,“张三丧偶”是从“李四死亡”以及“当前时间张三和李四存在婚姻关系”这两个事实衍生的,下半部是更本质的类图。)
因此,还是尽量用属性演变得来的名字,例如“有离婚史”、“有丧偶史”。其实上面已经给出了更好的描述“道德败坏”、“不祥”。
(3)把状态叫做“不可结婚”、“可结婚”可以吗?
答:
首先,如果某个状态接受“结婚”事件,自然就是可结婚,如果状态不接受“结婚”事件,那就是不可结婚,不需要在状态名称上再刷一遍(此处也可以作为领域驱动设计伪创新发掘的创新点)。
其次,你把“结婚”这个事件拎出来搞一个“可**”,那“离婚”、“丧偶”不也可以拎出来“可离婚”、“可丧偶”吗?凭什么只拎“结婚”,难道因为“结婚”比较喜庆,另外两个比较丧气?
那就是武汉这位最美红娘了: