啪啪、贤者模式和状态机

大鱼 2024-9-17 14:35

我在项目中试着使用状态图,这两天有一个疑惑想请教老师。由于我的项目稍为敏感,我用您书上的这个图说事。如果一个男人的▲▲被割了,导致不能做某个事情,那么画图的时候状态优先叫“没有▲▲”,还是叫“不能做某事”。

UMLChina潘加宇

(首先说明,书中的▲▲、○○更大概率是喉结、卵巢,不是你想的意思。)

你问的问题实质上就是:状态是按属性命名更好还是按行为命名更好。注意:是按**命名,不是说属性名或行为名就是状态名。

关于状态的命名,我在下面的文章有讲:

美女放电还是整形-从《人月神话》误译谈状态机图

不过该文没有完全覆盖你问的问题,所以还要再答一下。

就像该文中所说的,最好的是不绑定属性和行为的原生形容词。

如果找不到,按照你说的二者选其一的话,应该是按行为命名的优先,例如“不能啪啪”,因为既然特别提了有这个后果,说明系统可能关注的是这方面的行为规则。

即使按属性命名“没有▲▲”,它的来源还是“不能啪啪”。否则为什么“没有阑尾”不能作为一个状态画在状态机中呢——因为系统就关心啪啪,有没有阑尾不影响。

*****以下是扩展*****

(1)“没有▲▲”可能只是“不能啪啪”的原因之一,“有▲▲但其他属性值太低”,也有可能“不能啪啪”。这两者不是一一对应的。

(2)如果只考虑对某个事件的响应,状态叫“不能啪啪”是可以的,但如果考虑再多一点,“没有▲▲”或“有▲▲但其他属性值太低”导致的是“长期的不能啪啪”,而更常见的另一种“不能啪啪”是短期的(俗称“贤者模式”或“不应期”),这两种情况下,虽然对某事件的响应是一样的,但其他方面的行为规则就有差别。例如,后者状态下可以回血,前者状态下无法回血。

大致如下:

(从上图可以看到,“不能啪”里面的两个子状态之间不存在迁移,也无法判断哪一个是缺省子状态,所以可以把父状态“不能啪”去掉。)

类似这些,就是系统的复杂性所在。


weixinpanjiayu2