一般认为,四色原型(MI/ROLE/PPT/DESC)属于分析方法,DCI(DATA/Context/Interactive)为设计方法,但他们背后的想法可以说是相通的,甚至可以说一致的,不妨放在一块说。MI和Context表示具体业务的活动或场景,PPT和DATA表示参与该业务活动或场景的实体或数据模型,这些概念比较清晰,不必多语。
现在需要两个概念在它们之间搭建起桥梁:role和Interactive。先说说为什么需要它们?因为业务活动或场景,业务实体或模型,都具备多样性,如果不考虑多样性,这两个概念的引入就没有必要,同样,在单一的背景下,也不好觉察这些概念的价值。
如果我们将所有行为都放在业务活动中,这就是面向过程的做法;如果我们将所有行为放在业务实体中,这就是面向对象(类)的做法。之前,讨论过一些关于这两种做法的极端性,我认为前者是忽略共性,不做任何必要的抽象的做法,而后者则是过度抽象,忽略了个性。算得上是一种“过犹不及”的现象。
Interactive和Role分别从“因”和“果”两个角度描述“场景”与“实体”之间的桥梁。interactive描述实体在场景中的交互过程或动机,role实际上描述实体交互后的结果,即发挥了什么的作用,扮演了怎么样的角色。Role虽然翻译为角色,但角色的本意是“发挥作用”,表示实体在交互中发挥了怎么样的作用。
Role是在特定场景下,对诸多实体行为的一种抽象,是一种依赖场景的抽象,也就是说其具备了场景的个性与实体的共性。场景本身是对实体的抽象过程的一种约束,不像原来的class-oriented,没有考虑这种约束。可以说Role是有约束的class,试图让class与object和谐共处。
现在我尝试给出我的答案,仅作参考。
1)场景的属性和行为是自己的,既不属于角色也不属于领域对象。角色的行为是在“场景”的约束下对“领域对象”行为的一种抽象,即对“领域对象”依赖场景的共性行为的提取。场景的属性和行为是描述场景的业务规则,是对角色行为的控制或制约。
2)在场景中实体不仅可以发挥依赖场景的角色作用,也可以发挥不依赖具体场景的作用,这些不依赖于场景的作用就应该放在扮演者身上。
3)角色是一种有场景约束的行为抽象,但这也意味着其要具备稳定性,可以静态表达;但在我们无法很好的抽象,也就是对角色的定义并不稳定、明确时,使用动态表达更自然。想想生活和自然的情景,你会发现这个不难理解。
稍微总结一下:
场景的行为和属性 = 描述业务的规则和属性,制约交互行为的规则
角色的行为和属性 = 依赖场景的实体的抽象,实体的交互行为
模型的行为和属性 = 不依赖场景的实体的抽象,实体的个体行为
角色的行为和属性如果有明显的稳定的概念特征,用静态、显式的方式表达,如果没有,则用动态、隐式的方式表达。银行账号的例子,可以将“源帐号”和“目标帐号”以“角色”的概念显式地表达出来,但我觉得,这里用两个表达其意思的变量名来表示,在过程的参数中有所区别就可以了。
场景与实体的行为,比较容易区分。实体的角色行为与模型行为的区别,取决对场景的依赖。要区分也不难,只要这些行为基本属于“自娱自乐”的就是模型行为,也就是说这些行为使用的数据不是通过与别的实体交互得来,与外界相对独立,就划分为模型行为。如果行为使用的数据是通过与别的实体交互得来,则可划分为角色行为。
关于Role,我想再说一点,世上本没有Role,发挥相同作用的PPT多了,便有了Role,从此便有了扮演Role的这种说法了。
其实无论DCI、MVC、四色原型、DDD无非让代码更合理、更自然地表达现实的问题与解决方案,也就把代码井然有序地分开放在该放的地方,找起来方便,理解起来方便,改起来方便,有效地降低并控制复杂度,不会乱成一锅粥,此外,还有别的吗?