sicp习题2.76:一个带有通用型操作的大型系统可能不断演化,在演化中常需要加入新的数据对象类型或者新的操作。
对于上面提出的三种策略--带有显式分派的通用型操作,数据导向的风格,以及消息传递的风格--请描述在加入一个新类型
或者新操作时,系统所必须做的修改。哪种组织方式最适合那些经常需要加入新类型的系统?哪种组织方式最适合那些经常
需要加入新操作的系统?
我们可以看看OO是哪一种。
OO出现以前,我们是这样写函数的。
fun
{
if (isCat)
miaomiao
else if (isDog)
wangwang
else if (isCow)
miemie
}
这就是典型的“带有显式分派的通用型操作“,这里把“操作”看成“变化”,把“类型”看成“不变”, 适合加入“新操作”,
不适合加入“新类型”。
为了解决加入新类型的问题,很容易就想到把“操作”看成“不变”,把“类型”看成“变化”。这就是”消息传递“的风格。
也就是现在所谓的OO风格。C++里面的虚表就是按照这种逻辑设计的,只用告诉对象要调用哪个函数,即表的第几行,就行了。
当然这个表由编译器负责填写。
但是OO加“操作”是不方便的,即通常意义上的改接口。
但OO流行的原因在于,我们通常可以先确定接口,但无法确定今后会有哪些扩展的对象。
最灵活的就是“数据导向的风格”,类型和操作都可以不确定,完全由运行时数据驱动。