Too young, too simple. Sometimes, naive & stupid

模块化程序设计

模块化程序设计(Modular Programming)

将一个大规模程序自顶向下划分为一些较小的相对独立又相互关联的模块

  • 程序设计中最重要的思想之一
  • 几乎所有的商用程序都采用了模块化程序设计的理念
  • 面向对象编程在某种程度上也是对模块化程序思想的一种延伸

模块分解的目标

  • 使模块内部的实现细节对外不可见,实现信息隐藏(Information Hiding)
  • 限制模块的复杂性和规模
  • 保证模块的相对独立性(Module Independence)和正确性

    信息隐藏

信息隐藏

  • 除了必要的信息之外,使得暴露在外面的信息尽量减小到最小限度
  • 模块内部的数据和过程,对无需了解它的外部模块隐藏起来, 外部只知道What to do, 而不知道How to do
  • 只要模块接口不变,修改模块内部的具体实现细节不影响对模块的使用

程序设计中需要处理的两类要素

  • 过程,数据

如何实现信息隐藏

  • 过程抽象, 数据抽象

模块分解的本质

  • 实现不同层次的过程抽象和数据抽象

过程抽象

过程抽象

  • 将一个确定的完成子任务的操作序列看成一个黑箱
  • 过程抽象的结果是函数————功能抽象
  • 使程序员可以在不同的抽象层面上分析问题
  • 面向过程语言实现模块化程序设计的基本手段,
  • 通过将过程抽象为函数,实现信息隐藏和模块的可重用性

数据抽象

数据抽象

  • 面向对象语言实现模块化程序设计的基本手段
  • 数据抽象的结果是数据类型

让数据类型的表示细节对外不可见

  • 抽象数据类型(Abstract Data Type ADT)
    • 可以实现更好的信息隐藏效果

抽象数据类型

根据施加于数据智商的操作定义类型, 限定只能由这些操作来修改和观察数据值,强调把数据和操作封装起来,结合为一个不可分割的独立整体,不再单纯是一组数据的集合,二十数据及作用在骑上的操作的集合

==C++语言中的类(class) 通过封装数据和操作数据的方法并限制外部程序的访问来实现信息隐藏==

模块分解

模块分解的基本思想

  • 将一个复杂的任务划分为若干个较为简单的子任务
  • 若子任务仍然比较复杂,则继续将子任务分解
  • 直到分解成为一些足够简单,易于解决的子任务为止
  • 分治思想的一种具体实现

为什么要分解

  • 管理学的观点认为工作必须分工,各司其职。
  • 分解是人们处理复杂问题的一种常见方法

模块的独立性

内聚度(Cohesion)

也称聚合度,模块内成员之间联系的紧密程度(聚合能力)的一种度量,模块内各成员之间的联系越紧密,那模块独立性就越强。

耦合度(Coupling)

也称关联度,模块之间关联程度(即依赖关系,接口复杂性)的一种度量,模块间的联系越多,则模块的相对独立性越差。

模块划分的准则

  • 按执行顺序划分
    • 使得每个模块对应一个处理步骤
  • 按问题模型划分
    • 让程序的模块化结构,正好与所要解决的问题的结构想对应
  • 按耦合-内聚类型划分
    • 尽量增大模块内成分的内聚度,减少模块间的耦合度
  • 按信息隐藏原则划分
    • 将模块内数据结构及其操作的实现细节隐藏起来,封装到一个模块里

从抽象的角度来看, 模块划分主要有一下两种方法

  • 基于过程抽象的划分方法
    • 按功能划分模块
    • 面向过程的语言主要采用这种方法
  • 基于数据抽象的划分方法
    • 以数据为中心,将相关操作封装在模块里,就是基于信息隐藏的划分方法
    • 面向对象的语言采用的主要方法
  • 基本原则
    • 实现高内聚、低耦合

模块化设计的有点

  • 提高程序的可读性,使程序结构更清晰

    • 在分析抽象层次较高的模块时,对较低层次的各个模块只需了解其做什么
  • 提高程序可维护性和可靠性

    • 程序的局部修改不会影响全局,使错误局部化,防止错误在模块间扩散
  • 缩短软件开发的周期,提高程序的开发效率

    • 模块分解后,开发人员可以各司其职,实现并发开发
  • 提高程序的测试效率和可验证性

    • 每个模块可以独立进行测试或验证