设计中应对变化的方法

来源:互联网 发布:西门子840d编程代码 编辑:程序博客网 时间:2024/05/03 06:53

sicp习题2.76:一个带有通用型操作的大型系统可能不断演化,在演化中常需要加入新的数据对象类型或者新的操作。

对于上面提出的三种策略--带有显式分派的通用型操作,数据导向的风格,以及消息传递的风格--请描述在加入一个新类型

或者新操作时,系统所必须做的修改。哪种组织方式最适合那些经常需要加入新类型的系统?哪种组织方式最适合那些经常

需要加入新操作的系统?

我们可以看看OO是哪一种。

OO出现以前,我们是这样写函数的。

fun

{

if (isCat)

miaomiao

else if (isDog)

wangwang

else if (isCow)

miemie

}

这就是典型的“带有显式分派的通用型操作“,这里把“操作”看成“变化”,把“类型”看成“不变”, 适合加入“新操作”,

不适合加入“新类型”。

 

为了解决加入新类型的问题,很容易就想到把“操作”看成“不变”,把“类型”看成“变化”。这就是”消息传递“的风格。

也就是现在所谓的OO风格。C++里面的虚表就是按照这种逻辑设计的,只用告诉对象要调用哪个函数,即表的第几行,就行了。

当然这个表由编译器负责填写。

 

但是OO加“操作”是不方便的,即通常意义上的改接口。

但OO流行的原因在于,我们通常可以先确定接口,但无法确定今后会有哪些扩展的对象。

 

最灵活的就是“数据导向的风格”,类型和操作都可以不确定,完全由运行时数据驱动。