到了 2.4.3 节,我们将 real-part,imag-part,magnitude,angle 中判断参数类型的部分给彻底去掉了,取而代之的,是先提取这个打了标签的数据中的标签,然后使用这个标签去查表得到对应的过程。
每个写自己模块的人都需要负责把数据结构与对应过程给写到表中(使用 put 来完成“A 结构->X 过程”的映射),之后需要的时候,直接对应表去查找 A 结构应该使用哪个过程。
而之前的系统(2.4.2章中提到的系统)没有整理数据结构与对应过程的映射,每个数据的处理是在 real-part 等过程中,通过写 if 判断来完成这个映射的。
实际的编程工作一点都没有减少。这两个设计都需要:
- 写构造函数来表示数据,比如 make-from-mag-ang
- 写处理这个结构的过程,比如 real-part
- 写对于这种数据的表示应该映射到哪一个过程上
真正的区别即在第 3 点上:
- 对于之前的系统,使用 cond 在 real-part 等过程中映射
- 对于现在的系统,使用指定的过程来映射,提高模块的能力
所以,data-directed programming 不如叫做 type-directed programming 算了。