2010年11月18日 23:33 "redorange"的内容
如果要用软件描述世界,就一定要分清楚内外属性的异同。 ...
在思考语言范式时,我曾这样想过,面向对象,行为与属性绑得太紧,面向过程,行为与属性放得的太松。但这里不是仅仅选择“分”或“合”那么简单,“贫血模型”与“充血模型”实际上与“面向过程”与“面向类(对象)”的矛盾是相似的。
“贫血对象”是将“行为”与“属性”完全放开的一种表达,而“充血对象”则又矫枉过正,把“行为与属性”绑得太紧。
类是表达共性的概念,而对象则是充满个性,而且这些个性是依赖场景的,离开场景将失去意义。所以,在“充血模型”中,用类表达对象时,实际是将“个性”统统视为“共性”,在任何具体的场景中,对象的角色或职责都已经定义好了,这显然是不合适,因为一个对象可以多种角色参与不同的活动或场景(可能使得类继承体系非常庞大和复杂),而且在参与新的活动或者场景时,以“类”及“继承”的方式定义对象则更是力不从心。
而在“贫血模型”中,则将“共性”统统视为“个性”,这是抹掉“共性”的做法,与“充血模型”抹掉“个性”的做法刚好相反。前者是“白马非马”,后者则是“白马即马”。都没有协调好“共性”与“个性”的关系。
因此真正自然的“领域模型”应该是这样的,如果对象的某些行为在任何场景都是通用的,那么就放在领域中去,将其绑定,这是尊重“共性”的约束;如果对象的某些依赖于具体的场景,那么则在具体的场景中注入相应的行为,赋予对象相应的角色,这是尊重“个性”的自由。
那么“贫血模型”与“充血模型”,就没有用了吗?也许是。但这两个概念还有意义的:“贫血模型”与“充血模型”实际表达的是两个极端的情景。如果一个对象,没有任何共性的行为,其行为完全依赖于场景,则可用“贫血模型”表达;如果一对象,在所有的场景,都是以同样的角色身份参与,那么可用“充血模型”表达。
“贫血模型”与“充血模型”都可以实现领域建模,与“面向过程”与“面向对象”都可以描述一切画面一样。只是针对的问题不同时,有合适与不合适的差别。
所以,对象的行为该不该放入“领域模型”,我们要先分析一下这些行为是对象所固有的,还是依赖于场景的,如果是固有的,即是共性的,就放入领域模型(domain),如果不是则延迟在具体的场景(service)中注入,赋予其角色的个性(DCI)。
那么设计模式将如何运用呢?
设计模式可以在领域模型中使用(domain),也可以在具体业务场景(service)中使用。设计模式是在局部、微观层面的一种支持变化的机制,在具体业务场景中使用再合适不过了。将来可能会出现的现象是,在领域层(domain)各个模型中用的更多是“结构型”模式,而在业务层或服务层(service)的各个场景中用得更多的是“行为型”模式,两者都可以使用“创建型”模式。
此外,我认为DCI与MVC是互补(对称)而不取代的关系,这点与banq不同。有时间,我将描述自己如何从不同的思路得出这个结论,尽量浅显易懂,让更多的人理解,Jdon有时的讨论,让人不知所云,也许有话题较深入的原因,但也不能不自我反省。此外,我上面的分析,没有道出领域建模的真正意义和OO最初的构想(梦想),以后有时间一块补上。