3.0 Modularity Object and State - CloneableX/SICP-learning GitHub Wiki

之前的章节介绍了一些编程中需要的基础元素,主要是基础程式和基础数据以及相应的复合程式和复合数据,并在其中学习了抽象,抽象在编程中极为有用,它能够帮助我们处理大型系统的复杂性。但这些知识还不足以帮助我们设计程序,在编程这种综合性问题面前,需要组织性的思想指导我们对程序进行整体设计。特别是构建大型系统时更需要相关的思想指导,以提高系统的模块化水平,也就是将整块工作自然地分解成可单独开发维护的模块。

其中一种极有效的设计策略与物理系统建模的程序构建十分接近,它能够基于系统结构中的程序结构建模。对于每一个系统行为,可以在运算模型中定义一个对应的符号操作。使用这种策略的意义在于,可以在不改变策略的情况下扩展模型,使其接收新对象或新行为,只是需要添加对象或行为的相应符号即可。如果已经完成系统的组织工作,只能基于系统的本地部分添加新功能或调试旧功能。

对于大型系统的扩展,组织大型程序的方式往往由对于建模系统的感知决定。在本章,我们将研究从关于系统构建的世界观演变而来的组织策略。第一种策略关注对象,它将大型系统视为一组对象的集合,并且这些对象的行为会随着时间变化。另一种策略关注流,主要指系统的中的信息流,就像电子工程师看待信号过程系统时一样。

无论是基于对象的方式,还是基于流的方式都会展示程序中的重大语言问题。对于对象,必须关注它发生变化的基础以及如何维护它的唯一性。它导致我们必须放弃通过替换模型对运算过程进行分析,转而使用更机械但理论上更难以处理的 环境模型(environment model)。处理对象、变化和唯一性标识的困难在于需要通过计算模型处理时间这一基础性问题。如果允许并发执行程序,这个问题将导致更大的难题。当我们将计算机运算时模型中的模拟时间与事件发生的顺序解耦时,可以充分利用基于流的方式,我们将用 延迟计算(delayed evaluation) 的技术实现。