数据Data 上下文Context 交互Interaction(DCI):面向对象范式的演进

这是一篇来自Ruby社区的文章,主要介绍DCI如何推动面向对象的发展,当然这也是Ruby的一个特点,而Scala则在并发异步以及函数编程上有其特点。RubySource | Data Context Interaction: The Evolution of the Object Oriented ParadigmRubySource

文章说:面向对象非常擅长显式表达状态,类 字段和属性这些都是用来定义状态的强大工具。(banq注:场景 事件和状态可以认为一个目标模板)。

对象的状态着重于两个方面,一个是编译时期,一个运行时期,在编译时期我们能看到对象的类定义;而在运行时刻我们可以调用对象实例的字段。

对象的行为是围绕本地状态的,不包括那些与外部协调等行为,这些本地行为只围绕对象自己内部状态进行。

但是OO弱点在于无法表达与外部协调交互collaborations 。

看如下两个案例用例(最后两张图),分别表达A B C D四个对象之间的相互调用。第一张图表示在传统OO中,我们可能将这些相互协调调用的方法专门当前类中,导致A B C D很多方法,这样带来问题看下篇:

[该贴被banq于2012-08-31 15:58修改过]




上面将很多交互方法也置于对象中的问题是:编译时刻的代码并不能反映其运行时刻发生的。源码告诉我们有四个分离的对象,分别带有许多方法(messageA0 messageB0....)。而运行时刻告诉我们:有四个对象彼此有许多交互谈话调用,其中只有很少部分和某个特定用例有关(和User Case1相关,或和User Case2相关),因为你将所有用例相关的方法都混淆在一个对象中。

这种不匹配导致程序非常难懂,源码告诉我们一个故事,而运行时效果告诉我们是完全不同的故事。

通过引入DCI,相当于引入角色,UserCase1和UserCase2不同用例功能可以看成是Domain Model领域模型在不同场景上下文扮演不同角色发生的行为,如下图表示:


使用DCI的好处:
本地化
传统OO要完成一个算法过程需要跨不同文件,使用DCI,对于一个特定用例只需要看一个文件即可。

聚焦
场景上下文只包含有对应用例需要的功能方法,你就不必在数百个方法中寻找工作。

“What the system is” and “What the system does”
系统是什么和系统做什么
系统是什么:系统是什么样的?意思指所有数据对象(领域模型)和他们本地方法,通常这是系统部分最稳定的。

系统做什么:是指不同场景快速改变的行为,将系统稳定部分和经常变化的部分进行分离。DCI提供这种分离。

* DCI的数据类(领域模型)是告诉我们有关系统是什么。
* DCI场景上下文Context告诉我们这些数据类外部相互关系是什么。
(banq注:内外分别)

Source Code == Runtime
源码==运行

Roles are explicit
角色变得显式。
DCI最伟大的贡献是带来了显式的角色概念,(角色类似服务或事件,是一种跨业务领域和技术架构的桥梁。)比如我出生在俄罗斯,我的名字是Victor;我体重 65kg. 这些属性会影响一些高层次职责吗?当我回到家我扮演丈夫角色,我在单位扮演经理角色,等等。

这表明,角色没有在传统OO中成为第一等公民是错误的。