高级程序设计

9 - 类作为模块

2020-03-05 15:00 CST
2020-03-14 22:29 CST
CC BY-NC 4.0

什么是模块?

模块是指从物理上对程序中的实体定义进行分组,是可以单独编写和编译的程序单位。模块是组织和管理大型程序的一个重要手段。

一个模块包含接口和实现两部分。

  • 接口:在模块中定义的,可以被其他模块使用的一些程序实体的描述
  • 实现:在模块中定义的所有程序的具体实现描述。

在过程式程序中(如C语言):

  • 接口:声明(.h文件)
  • 实现:定义(.c文件)

如何划分模块

划分模块的基本准则:

  • 内聚性最大:模块内的各实体之间联系紧密,便于程序的设计和理解。
  • 耦合度最小:模块间的各实体之间关联较少,便于程序的维护。

过程式程序的模块划分:

  • 通常是基于子程序进行划分,把共同完成某个独立功能的,或使用相同数据的子程序及其相关实体划分在一个模块。
  • 缺点:模块边界模糊。

类作为模块

在面向对象程序中,类是一个自然的模块划分单位,模块边界比较清晰。

一个C++程序的模块由两部分构成:

  • 类的定义(.h文件)
  • 类的实现(主要是成员函数,.cpp文件)

良好的面向对象程序设计风格

  • 良好的程序设计风格应该能降低模块的耦合度
  • 结构化程序设计为过程式程序设计提供了一种良好的风格指南,要求程序单位具有“单入口、单出口”性质:
    • 不带goto的顺序、分支和循环控制流程
    • 子程序

模块间的耦合度反映在对象类之间的关联性上。要降低模块之间的耦合度,可以对类能够访问的对象或者对象类的集合作一定的限制,并尽量使该集合为最小。

Demeter法则

核心思想:仅与你的直接朋友交谈

要求一个类的成员函数:

  • 除了能访问自身类结构的直接子结构(数据成员)外,不能以任何方式依赖于任何其他类的结构
  • 只应向某个有限集合中的对象发送消息。

两种表达形式:

  • 类表达形式:一个类中的成员函数能够直接访问或引用的对象所属的类。(类的集合)
  • 对象表达形式:一个类中的成员函数能直接访问或引用的对象。(对象的集合)