知识卡片

主程序/子程序风格与面向对象风格对比

普通读书笔记卡

内容

主程序/子程序风格是结构化设计的典型风格,从功能观点出发通过逐步分解、逐步细化把大系统拆成若干模块,主程序调用这些子程序实现完整功能——组件是主程序和子程序,连接件是调用-返回机制,拓扑结构是层次化结构,主程序的正确性依赖它所调用子程序的正确性。面向对象风格则把系统看作对象的集合,数据表示与相关操作被封装进抽象数据类型或对象中,连接件是函数/过程调用形成的消息传递,两个重要特点是对象负责维护自身表示的完整性、对象的表示对其他对象隐蔽。书中用KWIC(Key Word in Context)检索系统同一个案例分别用两种风格实现,暴露出核心差异:主程序/子程序方案让所有子程序通过共享存储区(核心存储区)交换数据,优点是数据访问效率高,缺点是数据存储格式一旦变化会影响几乎所有模块,处理流程改变也难以适应,因为各模块依赖控制模块内部固定的调用次序,复用性差;面向对象方案把数据封装进LineStorage、Input、CircularShifter、Alphabetizer、Output等各自独立的对象,模块间不再共享数据,取而代之的是通过接口调用访问,算法和数据表示的改变不会影响其他模块,复用支持更好——但代价是对象与其他对象交互时必须知道对方的标识,一旦标识变化就要修改所有显式调用它的对象,而管道-过滤器风格恰恰相反,过滤器之间交互完全不需要知道系统中其他过滤器的存在。这组对比揭示了架构风格选择的一个通用规律:解决”数据共享效率”问题的方案,往往会牺牲”变更隔离”能力,反之亦然。

参考来源

- 位置:《软件架构理论与实践》第4章《软件架构的风格与模式》"4.3.2 主程序/子程序风格"及"4.3.3 面向对象风格"节(源文件:_epub-src/OEBPS/text00033.html) - 结论依据:原文分别用KWIC检索系统展示两种风格的解决方案,并逐一说明各自优缺点("对数据存储格式的变化将会影响几乎所有的模块"vs"在一个独立的模块中,算法和数据表示的改变不会影响其他模块"),直接支撑本卡片对两者核心差异的归纳。 - 原始内容:基于具有数据共享的主程序/子程序架构风格来设计KWIC检索系统的解决方案……该方案在处理变更的能力上有许多严重的缺陷:①对数据存储格式的变化将会影响几乎所有的模块……在这种情况下(面向对象方案)数据不再直接地被计算组件共享,取而代之的是,每个模块提供一个接口。