模块结构图 PPT
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标志2=确定留退模块() 如果标志2 != True 则
调用查补考安排模块 }
显示结果模块()
{ 调用显示成绩模块 如果标志1==True 则 调用不及格显示模块
}
显示不及格处理模块()
{ 如果标志2==True 则 调用留退通知模块
否则
调用补考通知模块
}
大家好
36
改写后的模块图
学生期末成绩查询
读入学号
X
Y
A
B
B1 B2
(b)
TOP
X
Y
B
A B1
(d)
B2
33
期末成绩查询
大家好
34
主模块
Main() {
stuNo = 读入学号模块 调用成绩查询模块 调用显示模块 }
大家好
35
子模块
成绩查询模块() {
调用查期末成绩模块 如果有不及格科目则
标志1=True 调用不及格处理模块 }
不及格处理模块() {
• 模块具有输入和输出、逻辑功能、运行程序、 内部数据四种属性。
计算年龄
int computeAge(date birthday)
模块的图形表示方法 模块的函数接口表示
大家好
3
7.2.2 模块结构图
• 结构图(Structured Chart)描述系统的模块结 构及模块间的联系
• 结构图中的主要成分有:
– 模块:用长方形表示
– 调用:从一个模块指向另一模块的箭头表示前一 个模块调用后一个模块。有循环调用和条件调用
– 数据:用带圆圈的小箭头表示从一个模块传递给 另一模块的数据(有实义)
– 控制信息:带涂黑圆圈的小箭头表示一个模块传 送给另一模块的控制信息
大家好
4
结构图的画法
主调模块
主调模块
被调模块
大家好
18
1、偶然内聚
当同一个子程序中的操作之间无任何联系时, 为偶然内聚性,也叫作“无内聚性”。
比如只是为了将程序中某几处凑巧相同的一些语 句组合起来形成的一个模块:
P
Q
R
S
T
大家好
B=A; read(Cardfile); D=C;
19
2、逻辑内聚
将几个逻辑上相似的功能放在一个模块中
准备
Y
取平均成绩?
的元素用于控制主循环,后者的元素负责主循环的整个
判定执行过程
大家好
24
5、通信内聚
当模块内的成分引用共同的数据,而不存在 其他联系时,称为通信内聚
购货单
修改库存
库存
开发货单
A、销售模块
期末不及格统计
学籍表 累计不及格统计
留退名单
B 、产生留退名单模块
大家好
25
6、顺序内聚
模块中某个成分的输出是另一成分的输入。
– 模块间的联系越少越好
– 为什么?
大家好
8
7.2.3 模块的耦合
double CalculateAvg()
{
int n;
double total, average, value;
scanf(“输入个数:\n”, &n);
total = sum(n);
average=total/n;
return(average);
显示成绩
查询成绩 显示成绩 不及格处理
确定留退 显示补考 显示留退
大家好
37
7.2.6 模块的扇入与扇出
• 模块的扇入是指有多少个上级模块调用它。 • 模块的扇出是指模块的直属下层模块的个数,
扇出系数不宜过大
A A的扇出为2
模块A的控制范围是: A、B、C、D
A
计算工资
假如判断x出现在模块A 中,并且仅在A中使用 了x,则该判断的作用 范围是:A, 而B、C、D不受影响
B
计算临时工工资
C 计算职工工资
大家好
D 计算总工资
31
判断的设计原则
• 一个设计原则:对于任何一个判断,其作用 范围应该是这个判断所在模块的控制范围的 一个子集
}
两个模块之间存在联系大家好
9
影响耦合度的因素
• 如果使用模块A需要了解模块B,那么A和B是 耦合的。影响模块间耦合程度有三方面的因 素:
– 联系方式--模块间通过什么方式联系 – 来往信息的作用--模块间来往信息作什么用 – 数量--模块间来往信息的多少。
作用
数量
0
少
多
混合 控制 数据
用过程 直接引用
生成报表
编辑数据 EOF
编辑数据
有效数据
打印报表
日期
行
行
获得编辑数据 核对数据
数据 EOF
编辑数据 数据
读入数据 编辑数据
显示无效 数据
大家好
打印表头
打印表尾
行
总
计
打印一行
6
简单的模块结构图
总账子系统
初始 设置
凭证 管理
出纳 管理
期末 处理
帐簿 输出
会计 报表
辅助 管理
系统 服务
其它
• 凭证管理模块的下层模块:
• 为此应:
– 用过程语句调用其它模块 – 模块间的参数作数据用 – 模块间的参数尽可能少
大家好
15
7.2.4 模块的内聚
double CalculateAvg()
{ int n; double total, average, value;
scanf(“input value:”, &value);
• 该原则的目的:消除控制耦合,降低耦合度
– 想象一下,假设某个控制标志在系统的很多部分 发挥作用,那么可能会产生这样一种情况:错误 发作的位置离产生错误的源头很远,这给程序调 试和维护带来极大困难。
大家好
32
作用范围和控制范围图示
TOP
X
Y
A
B
B1
B2
(a)
TOP
X
Y
A
B
B1 (c)
B2
大家好
TOP
– 凭证输入、凭证审核、凭证查询打印、凭证汇 总、记账
大家好
7
模块设计的度量标准
• 为了衡量模块的相对独立性,提出了模块间 的耦合(Coupling)与模块的内聚(Cohesion) 两个标准
– 耦合:模块和模块之间的联系程度
– 内聚:模块内部各元素之间的联系程度
• 设计目标:
– 模在紧密相关的关系:
– 模块内的高内聚往往意味着模块间的松耦合 – 反之,低内聚一般会带来紧耦合
大家好
30
7.2.5 作用范围与控制范围
• 一个判断的作用范围是所有这样的模块的集 合,这些模块内含有依赖于这个判断结果的
处理。或称影响范围。
• 一个模块的控制范围是指它本身及其所有下 属模块的集合。
while value<=0.0
{
n=n+1;
total=total+value;
scanf(“\ninput value:”, &value);
}
average=total/n;
return(average);
}
模块内部各元素(变量、语大家句好 )之间存在联系
16
内聚的好处
• 模块的内聚反映模块内部联系的紧密程度。 • 一个模块只需要做好一件事情,不要过分关
N
算平均成绩
算最高成绩
返回
比如常见的出错处理模块,工作模块发现错误后,调用
错误处理模块,将错误号作为控制参数传入,然后出错
处理模块根据不同的错误号大家执好 行相应的操作
20
3、时间内聚
• 将在有限时间单元内处理的成分组合为同 一模块
比如在程序初始化时所作的处理: m_Medirecno = psPerson.Medirecno txtMedirecno = psPerson.Medirecno txtTel = psPerson.Tel txtContact = psPerson.Contact txtAddr = psPerson.Addr txtMedirecno.Enabled = False
1、偶然内聚(coincidental cohesion) 2、逻辑内聚(Logical cohesion) 3、时间内聚(temporal cohesion) 4、步骤内聚(procedural cohesion) 5、通信内聚(communicational cohesion) 6、顺序内聚(Sequential cohesion) 7、功能内聚(functional_cohesion)
– 控制耦合:一个模块将控制信息传递给另一个模块,以 控制被调模块的内部处理逻辑。(可以分解)
– 公共环境耦合:如果两个模块共享同一全局数据,称为 公共耦合。
– 内容耦合:两个模块之间的内部属性有直接关联,也称 病态耦合。(某些GOTO语句)
大家好
14
减低耦合的设计原则
结构化设计要求模块间的耦合程度尽可能小。
• 步骤内聚在时间内聚的基础上增加了次序的 约束
大家好
22
模块划分示例
大家好
23
绘制划分后的模块图
准备好的矩阵指示标记
STMRO (主模块)
准备好的矩阵指示标记
PREP
PLANLOOP
矩阵指示标记
部分结果、标签 等
TYPDECID
• 模块PERP是一个初始化模块,属时间内聚。
• 模块PLANLOOP和TYPDECID都属于步骤内聚。前者
被调模块
循环调用
被调模块
被调模块
条件调用
1、结构图无严格的模块调用顺序,但一般习惯从左至右
2、因为约定遵从从上向下的调用,调用关系也可以不使
用箭头,而直接使用直线
3、模块间传递的信息如果出现在数据字典中,则视为数
据,否则为控制信息
大家好
5
一个完整的结构图
有效数据
计算
EOF
有效数据
结果
EOF 结果
获得有效数据
比如显示期末成绩通知:
读
读
入
取
学
成
号
绩
取
判
取
科
显
断
不
目
示
留
及
补
数
退
格
考
据
级
科
安
目
排
大家好
26
6、顺序内聚
• 顺序内聚有较强的内聚性 • 是步骤内聚和通信内聚的结合
• 例如:一个模块用于计算高于平均分的人数,步 骤是先循环累计总分,然后计算得到平均分,最 后循环统计高于平均分的人数
• 有步骤的先后,而且前一个步骤的结果要用于后 一步骤的运算中
• 过程语句调用:一个模块调用另一个模块, 所有数据来往都以参数或返回值方式传递并
使用
大家好
11
来往信息的作用
• 模块间的来往信息可以作数据用,也可以作 控制信息用
A
平均/最高
成绩
B
取平均成绩 或最高成绩
A
平均成绩
最高成绩
取平均成绩
取最高成绩
(a)控制耦合
(b)数据耦合
大家好
12
来往信息的数量
• 模块间传递的信息量越大,它们之间的耦合 程度越高。
• 可视化程序设计中在窗口打开时初始化窗口中得控件内容,
如列表框的项目、文本框或单选钮的缺省取值
• 还比如:C++的构造函数、大析家构好 函数
21
4、步骤内聚
• 当子程序中的操作是按某一特定过程结构进 行的,就是步骤内聚。
• 例如:用户想按一定的顺序打印告,子程序设计 成是用于按顺序打印销售收入、开支、雇员电话 表的。
• 但仍然不是最高的内聚类型
大家好
27
7、功能内聚
• 一个模块包括并且仅仅包括为完成一个具体 任务所需要的所有成分,称为功能内聚。
• 功能内聚性是最强也是最好的一种内聚
– 例如:打印职工名单,PrintStaffList() – 例如:计算平均分,CalculateAvg()
• 仅用一个动宾词组能明确指出这个模块的所 有功能。
• 一个模块最好只了解它确实需要使用的数据, 而完全不知道其他数据的存在(独立性好)
大家好
13
耦合的类型
• 根据以上因素,对耦合分类如下:
– 数据耦合:采用子程序调用,调用模块将需要进行处理 的数据传递给被调模块。数据耦合是不可避免的。
– 标记耦合:如果调用模块将整个数据记录传递给被调模 块,而被调模块只使用了部分数据项,则称为标记耦合 或特征耦合。
大家好
28
内聚的评分
• 耦合和内聚的概念是Stevens等人提出的, 是测量一个模块化系统好坏的标志。
• 按他们的观点, 给上述七种内聚评分如下:
– 功能内聚10分 – 顺序内聚9分 – 通信内聚7分 – 步骤内聚5分 – 时间内聚3分 – 逻辑内聚1分 – 偶然内聚0分
• 可以给一个软件的所有模块打分,最后计算 平均分,作为软件结大构家好质量评价的参考 29
第7章 结构化系统设计
大家好
1
本章主要内容
• 系统设计的任务
• 总体设计
– 结构化设计的概念、基本原则
– 从数据流图导出结构图
• 详细设计
– 代码设计 – 输出设计 – 输入设计 – 人机对话设计
– 模块详细设计
– 数据库设计、网络设计
• 系统设计说明书
大家好
2
7.2.1 模块的概念
• 模块(Module)一词使用很广泛。通常对应于 用一个名字就可以调用的一段程序语句(子 程序或函数)
语句调用
大家好
离坐标原点越远, 耦合程度越高
方式
10
模块联系方式
• 直接引用:一个模块直接存取另一个模块的 某些信息,例如全程变量、FORTRAN的 common量、C语言的extern量、共享的通 信区等 。也称为公共环境耦合(common environment coupling)
– 降低这种耦合程度的办法是使数据局部化,即使 用局部变量
心其它任务。
• 高内聚性的好处是可以提高程序的可靠性。
– 有一个调查表明,50%的强内聚性子程序是没有 错误的,而只有 18%的弱内聚性子程序才是无错 的,弱内聚性子程序的出错机会要比强内聚性出 错机会高 6 倍,而修正成本则要高 19 倍。摘自 《代码大全》
大家好
17
内聚的类型
• 模块的内聚可以分以下七类:
调用查补考安排模块 }
显示结果模块()
{ 调用显示成绩模块 如果标志1==True 则 调用不及格显示模块
}
显示不及格处理模块()
{ 如果标志2==True 则 调用留退通知模块
否则
调用补考通知模块
}
大家好
36
改写后的模块图
学生期末成绩查询
读入学号
X
Y
A
B
B1 B2
(b)
TOP
X
Y
B
A B1
(d)
B2
33
期末成绩查询
大家好
34
主模块
Main() {
stuNo = 读入学号模块 调用成绩查询模块 调用显示模块 }
大家好
35
子模块
成绩查询模块() {
调用查期末成绩模块 如果有不及格科目则
标志1=True 调用不及格处理模块 }
不及格处理模块() {
• 模块具有输入和输出、逻辑功能、运行程序、 内部数据四种属性。
计算年龄
int computeAge(date birthday)
模块的图形表示方法 模块的函数接口表示
大家好
3
7.2.2 模块结构图
• 结构图(Structured Chart)描述系统的模块结 构及模块间的联系
• 结构图中的主要成分有:
– 模块:用长方形表示
– 调用:从一个模块指向另一模块的箭头表示前一 个模块调用后一个模块。有循环调用和条件调用
– 数据:用带圆圈的小箭头表示从一个模块传递给 另一模块的数据(有实义)
– 控制信息:带涂黑圆圈的小箭头表示一个模块传 送给另一模块的控制信息
大家好
4
结构图的画法
主调模块
主调模块
被调模块
大家好
18
1、偶然内聚
当同一个子程序中的操作之间无任何联系时, 为偶然内聚性,也叫作“无内聚性”。
比如只是为了将程序中某几处凑巧相同的一些语 句组合起来形成的一个模块:
P
Q
R
S
T
大家好
B=A; read(Cardfile); D=C;
19
2、逻辑内聚
将几个逻辑上相似的功能放在一个模块中
准备
Y
取平均成绩?
的元素用于控制主循环,后者的元素负责主循环的整个
判定执行过程
大家好
24
5、通信内聚
当模块内的成分引用共同的数据,而不存在 其他联系时,称为通信内聚
购货单
修改库存
库存
开发货单
A、销售模块
期末不及格统计
学籍表 累计不及格统计
留退名单
B 、产生留退名单模块
大家好
25
6、顺序内聚
模块中某个成分的输出是另一成分的输入。
– 模块间的联系越少越好
– 为什么?
大家好
8
7.2.3 模块的耦合
double CalculateAvg()
{
int n;
double total, average, value;
scanf(“输入个数:\n”, &n);
total = sum(n);
average=total/n;
return(average);
显示成绩
查询成绩 显示成绩 不及格处理
确定留退 显示补考 显示留退
大家好
37
7.2.6 模块的扇入与扇出
• 模块的扇入是指有多少个上级模块调用它。 • 模块的扇出是指模块的直属下层模块的个数,
扇出系数不宜过大
A A的扇出为2
模块A的控制范围是: A、B、C、D
A
计算工资
假如判断x出现在模块A 中,并且仅在A中使用 了x,则该判断的作用 范围是:A, 而B、C、D不受影响
B
计算临时工工资
C 计算职工工资
大家好
D 计算总工资
31
判断的设计原则
• 一个设计原则:对于任何一个判断,其作用 范围应该是这个判断所在模块的控制范围的 一个子集
}
两个模块之间存在联系大家好
9
影响耦合度的因素
• 如果使用模块A需要了解模块B,那么A和B是 耦合的。影响模块间耦合程度有三方面的因 素:
– 联系方式--模块间通过什么方式联系 – 来往信息的作用--模块间来往信息作什么用 – 数量--模块间来往信息的多少。
作用
数量
0
少
多
混合 控制 数据
用过程 直接引用
生成报表
编辑数据 EOF
编辑数据
有效数据
打印报表
日期
行
行
获得编辑数据 核对数据
数据 EOF
编辑数据 数据
读入数据 编辑数据
显示无效 数据
大家好
打印表头
打印表尾
行
总
计
打印一行
6
简单的模块结构图
总账子系统
初始 设置
凭证 管理
出纳 管理
期末 处理
帐簿 输出
会计 报表
辅助 管理
系统 服务
其它
• 凭证管理模块的下层模块:
• 为此应:
– 用过程语句调用其它模块 – 模块间的参数作数据用 – 模块间的参数尽可能少
大家好
15
7.2.4 模块的内聚
double CalculateAvg()
{ int n; double total, average, value;
scanf(“input value:”, &value);
• 该原则的目的:消除控制耦合,降低耦合度
– 想象一下,假设某个控制标志在系统的很多部分 发挥作用,那么可能会产生这样一种情况:错误 发作的位置离产生错误的源头很远,这给程序调 试和维护带来极大困难。
大家好
32
作用范围和控制范围图示
TOP
X
Y
A
B
B1
B2
(a)
TOP
X
Y
A
B
B1 (c)
B2
大家好
TOP
– 凭证输入、凭证审核、凭证查询打印、凭证汇 总、记账
大家好
7
模块设计的度量标准
• 为了衡量模块的相对独立性,提出了模块间 的耦合(Coupling)与模块的内聚(Cohesion) 两个标准
– 耦合:模块和模块之间的联系程度
– 内聚:模块内部各元素之间的联系程度
• 设计目标:
– 模在紧密相关的关系:
– 模块内的高内聚往往意味着模块间的松耦合 – 反之,低内聚一般会带来紧耦合
大家好
30
7.2.5 作用范围与控制范围
• 一个判断的作用范围是所有这样的模块的集 合,这些模块内含有依赖于这个判断结果的
处理。或称影响范围。
• 一个模块的控制范围是指它本身及其所有下 属模块的集合。
while value<=0.0
{
n=n+1;
total=total+value;
scanf(“\ninput value:”, &value);
}
average=total/n;
return(average);
}
模块内部各元素(变量、语大家句好 )之间存在联系
16
内聚的好处
• 模块的内聚反映模块内部联系的紧密程度。 • 一个模块只需要做好一件事情,不要过分关
N
算平均成绩
算最高成绩
返回
比如常见的出错处理模块,工作模块发现错误后,调用
错误处理模块,将错误号作为控制参数传入,然后出错
处理模块根据不同的错误号大家执好 行相应的操作
20
3、时间内聚
• 将在有限时间单元内处理的成分组合为同 一模块
比如在程序初始化时所作的处理: m_Medirecno = psPerson.Medirecno txtMedirecno = psPerson.Medirecno txtTel = psPerson.Tel txtContact = psPerson.Contact txtAddr = psPerson.Addr txtMedirecno.Enabled = False
1、偶然内聚(coincidental cohesion) 2、逻辑内聚(Logical cohesion) 3、时间内聚(temporal cohesion) 4、步骤内聚(procedural cohesion) 5、通信内聚(communicational cohesion) 6、顺序内聚(Sequential cohesion) 7、功能内聚(functional_cohesion)
– 控制耦合:一个模块将控制信息传递给另一个模块,以 控制被调模块的内部处理逻辑。(可以分解)
– 公共环境耦合:如果两个模块共享同一全局数据,称为 公共耦合。
– 内容耦合:两个模块之间的内部属性有直接关联,也称 病态耦合。(某些GOTO语句)
大家好
14
减低耦合的设计原则
结构化设计要求模块间的耦合程度尽可能小。
• 步骤内聚在时间内聚的基础上增加了次序的 约束
大家好
22
模块划分示例
大家好
23
绘制划分后的模块图
准备好的矩阵指示标记
STMRO (主模块)
准备好的矩阵指示标记
PREP
PLANLOOP
矩阵指示标记
部分结果、标签 等
TYPDECID
• 模块PERP是一个初始化模块,属时间内聚。
• 模块PLANLOOP和TYPDECID都属于步骤内聚。前者
被调模块
循环调用
被调模块
被调模块
条件调用
1、结构图无严格的模块调用顺序,但一般习惯从左至右
2、因为约定遵从从上向下的调用,调用关系也可以不使
用箭头,而直接使用直线
3、模块间传递的信息如果出现在数据字典中,则视为数
据,否则为控制信息
大家好
5
一个完整的结构图
有效数据
计算
EOF
有效数据
结果
EOF 结果
获得有效数据
比如显示期末成绩通知:
读
读
入
取
学
成
号
绩
取
判
取
科
显
断
不
目
示
留
及
补
数
退
格
考
据
级
科
安
目
排
大家好
26
6、顺序内聚
• 顺序内聚有较强的内聚性 • 是步骤内聚和通信内聚的结合
• 例如:一个模块用于计算高于平均分的人数,步 骤是先循环累计总分,然后计算得到平均分,最 后循环统计高于平均分的人数
• 有步骤的先后,而且前一个步骤的结果要用于后 一步骤的运算中
• 过程语句调用:一个模块调用另一个模块, 所有数据来往都以参数或返回值方式传递并
使用
大家好
11
来往信息的作用
• 模块间的来往信息可以作数据用,也可以作 控制信息用
A
平均/最高
成绩
B
取平均成绩 或最高成绩
A
平均成绩
最高成绩
取平均成绩
取最高成绩
(a)控制耦合
(b)数据耦合
大家好
12
来往信息的数量
• 模块间传递的信息量越大,它们之间的耦合 程度越高。
• 可视化程序设计中在窗口打开时初始化窗口中得控件内容,
如列表框的项目、文本框或单选钮的缺省取值
• 还比如:C++的构造函数、大析家构好 函数
21
4、步骤内聚
• 当子程序中的操作是按某一特定过程结构进 行的,就是步骤内聚。
• 例如:用户想按一定的顺序打印告,子程序设计 成是用于按顺序打印销售收入、开支、雇员电话 表的。
• 但仍然不是最高的内聚类型
大家好
27
7、功能内聚
• 一个模块包括并且仅仅包括为完成一个具体 任务所需要的所有成分,称为功能内聚。
• 功能内聚性是最强也是最好的一种内聚
– 例如:打印职工名单,PrintStaffList() – 例如:计算平均分,CalculateAvg()
• 仅用一个动宾词组能明确指出这个模块的所 有功能。
• 一个模块最好只了解它确实需要使用的数据, 而完全不知道其他数据的存在(独立性好)
大家好
13
耦合的类型
• 根据以上因素,对耦合分类如下:
– 数据耦合:采用子程序调用,调用模块将需要进行处理 的数据传递给被调模块。数据耦合是不可避免的。
– 标记耦合:如果调用模块将整个数据记录传递给被调模 块,而被调模块只使用了部分数据项,则称为标记耦合 或特征耦合。
大家好
28
内聚的评分
• 耦合和内聚的概念是Stevens等人提出的, 是测量一个模块化系统好坏的标志。
• 按他们的观点, 给上述七种内聚评分如下:
– 功能内聚10分 – 顺序内聚9分 – 通信内聚7分 – 步骤内聚5分 – 时间内聚3分 – 逻辑内聚1分 – 偶然内聚0分
• 可以给一个软件的所有模块打分,最后计算 平均分,作为软件结大构家好质量评价的参考 29
第7章 结构化系统设计
大家好
1
本章主要内容
• 系统设计的任务
• 总体设计
– 结构化设计的概念、基本原则
– 从数据流图导出结构图
• 详细设计
– 代码设计 – 输出设计 – 输入设计 – 人机对话设计
– 模块详细设计
– 数据库设计、网络设计
• 系统设计说明书
大家好
2
7.2.1 模块的概念
• 模块(Module)一词使用很广泛。通常对应于 用一个名字就可以调用的一段程序语句(子 程序或函数)
语句调用
大家好
离坐标原点越远, 耦合程度越高
方式
10
模块联系方式
• 直接引用:一个模块直接存取另一个模块的 某些信息,例如全程变量、FORTRAN的 common量、C语言的extern量、共享的通 信区等 。也称为公共环境耦合(common environment coupling)
– 降低这种耦合程度的办法是使数据局部化,即使 用局部变量
心其它任务。
• 高内聚性的好处是可以提高程序的可靠性。
– 有一个调查表明,50%的强内聚性子程序是没有 错误的,而只有 18%的弱内聚性子程序才是无错 的,弱内聚性子程序的出错机会要比强内聚性出 错机会高 6 倍,而修正成本则要高 19 倍。摘自 《代码大全》
大家好
17
内聚的类型
• 模块的内聚可以分以下七类: