模块与接口规范共33页
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.强内聚性
内聚是一个模块内部各成分之间相关联程度的度量。根据内聚性的强弱,有 以下几种类型:
(1)随机内聚: 如果一个模块的各成分之间毫无关系,则称为随机内聚。 (2)逻辑内聚: 几个逻辑上相关的功能被放在同一模块中,则称为逻辑内聚。如一个模块读取各 种不同类型外设的输入。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的模块各成分在功能上 并无关系,即使局部功能的修改有时也会影响全局,因此这类模块的修改也比较困难。 (3)时间内聚: 如果一个模块完成的功能必须在同一时间内执行(如系统初始化),但这些功 能只是因为时间因素关联在一起,则称为时间内聚。 (4)过程内聚: 如果一个模块内部的处理成分是相关的,而且这些处理必须以特定的次序执行, 则称为过程内聚。 (5)通信内聚: 如果一个模块的所有成分都操作同一数据集或生成同一数据集,则称为通信内聚。 (6)顺序内聚: 如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另一 个成分的输入,则称为顺序内聚。 (7)功能内聚: 模块的所有成分对于完成单一的功能都是必须的,则称为功能内聚。
耦合按从强到弱的顺序可分为以下几种类型:
(1)内容耦合: 当一个模块直接修改或操作另一个模块的数据,或者直接转入另一个模块 时,就发生了内容耦合。此时,被修改的模块完全依赖于修改它的模块。
模块与接口规范
模块及模块接口设计原则
一.何为模块
模块由接口和实现两部分组成。
--接口指明模块的功能,即模块能做什么。它声明了使用该模块代码的标 识符,类型和函数原型等;
--实现指模块是如何完成起接口声明的功能。一个具体的功能模块接口是 唯一固定的,但是它的实现可能会有很多种。每个实现可能使用不同的算法 和数据结构,但是都必须符合接口给出的使用声明。
这样不同的功能模块,可以根 据自己的需要调用不同的初始 化模块。
int init_graphics(); int init_language(); int init_connect();
。 函数的功能要单一,不要设计“多功能”函数
函数的功能应该是单一而明确的。不要把不同的功能放入同一个 函数,特别是尽量不要用控制开关来让数据处理函数实现不同的功能。
return (a – b); } }
4.弱耦合性
耦合(Coupling)
是模块之间依赖程度的度量。内聚和耦合是密切相关的,与其它模 块存在强耦合的模块通常意味着弱内聚,而强内聚的模块通常意味着与其它 模块之间存在弱耦合。模块设计追求强内聚,弱耦合。
耦合的强度依赖于以下几个因素: (1)一个模块对另一个模块的调用; (2)一个模块向另一个模块传递的数据量; (3)一个模块施加到另一个模块的控制的多少; (4)模块之间接口的复杂程度。
二. 模块划分基本准则
模块的划分以功能为标准,相对独立的功能划分为不同的模块,各模块之间 根据需要可以进行数据通信,但是必须保持功能上的相对独立性。
“功能独立”的模块可以降低开发、测试、维护等阶段的代价。但是“功能 独立”并不意味着模块之间保持绝对的孤立。一个系统要完成某项任务,需 要各个模块相互配合才能实现,此时模块之间就要进行信息交流。
例如:如下是不好的函数设计,函数功能不单一,且实现的功能无必 然联系。
#define TYPE_ADD 0 #define TYPE_SUB 1 int add_or_sub(int a, int b, int flag) {
if (TYPE_ADD == flag) {
return (a + b); } else {
从功能上划分模块,保持“功 能独立”是模块化设计的基本 原则。
三. 模块与接口设计准则
1.封装与隐藏
接口是对模块功能的声明,只需要指明客户调用程序可能使用的标识符(包 括数据类型,函数原型等)即可,应尽可能隐藏内部细节和算法。
application
Mn
interface1 M2
M1
•t
2.模块的独立性 声明与实现分离
例如:
很多软件系统在启动的时候都需要初始化一些参数,因此不少系统会把初始化 模块做成一个或多个函数。但是要防止把毫不相关的参数初始化放入同一个函数。
int init_env() {
init_graphics...; init_language...; init_connect...; .... }
//初始化图形设置 //初始化语言设置 //初始化网络连接
假如模块A需要使用a语言,无网络 连接,而模块B需要使用b语言,有网络 连接。则init_env函数无论怎么改动都无 法同时满足两个模块要求。此时函数 init_env就是随机内聚函数,正确的修改 方法应该是根据初始化的模块不同,分 解成相对独立的函数。 修改init_env()为三个独立的函数:
好的模块设计要有尽可能高的内聚性,尽量避免随机内聚,禁止将毫无 关系的成分放入同一模块。随机内聚会使模块的功能不明确,破坏模块的功能独 立性。也给模块的维护、测试及升级等造成不便。
来自百度文库
Interface n
m1
m4
m3
Mn
m5
m6
m2
3.1. 设计高内聚性模块
防止把没有关联的功能放到一个模块中。
防止函数或模块内出现随机内聚。在编程时,经常遇到在不同函数中使用相 同的代码,许多开发人员都会把这些代码提出来,并构成一个新函数。若这些代 码关联较大并且是完成一个功能的,那么这种构造是合理的,否则这种构造将产 生随机内聚的函数。
为了保证模块的独立封装性,就必须将声明与实现分离开来。C语言对此 只提供最基本的支持。在标准C语言中,接口在头文件中声明,头文件的扩展 名为.h。
规定:调用程序可使用的宏定义,数据结构类型,变量以及函数原型等 必须在头文件中声明。调用程序使用预处理指令#include导入接口声明。
禁止将函数的实现和变量的定义放在头文件。
由于标准C语言没有提供命名空间机制,较大规模软件中,不同模块的全局变 量和函数也很可能重名,导致重复定义错误。同时被多个模块使用的全局变 量,是增大模块间耦合性的重要因素之一,为减少模块间耦合性,应尽量少 用或不用多个模块共用的全局变量。
规定:只在本模块内部使用的函数和全局变量,必须用static关键字修饰, 以限制只能在本模块内使用。