第九讲
详细设计
本讲(第六章)的主要内容
一、详细设计及其任务
二、结构程序设计
三、人机界面设计
四、详细设计的工具
五,Jackson程序设计方法
六、程序复杂度的定量度量
一、详细设计及其任务
1,什么是详细设计?
– 针对一个个模块的设计,是过程设
计、算法设计。
– 详细设计仅仅是设计出程序的“蓝
图”,是编码的先导,但不是编写
程序。
2,模块的属性:功能、逻辑和状态
3,详细设计的任务
3,详细设计的任务( Cont,)
? 每个模块内的数据结构
? 每个模块的控制算法
? 内部接口描述
? 为每一模块设计出一组测试用例( test
cases),因为详细设计人员对模块的功
能、逻辑、接口等最了解。
? 评审
二、结构程序设计
1,定义:结构化程序设计是一种设计程
序的技术,它采用自顶向下逐步求精
的设计方法和单入口单出口的控制结
构。
2,结构化程序设计的要点
– 自顶向下逐步求精
– 采用三种基本结构,消除 goto语句
– 设计单入口、单出口的模
3,结构程序设计的提出( Cont.)
? 1965年 E,W,Dijkstra指出 GO TO 语句对
程序质量的负面影响,建议取消它。
? Bohm等证明了任何单入口单出口的程序
都可以用“顺序”、“选择”和“循环”
三种控制结构实现。
? Mills基于在 IBM的实践,提出程序应该
只有一个入口和一个出口。
? Wirth通过对抽象层次的论述,对逐步求
精方法进行了肯定。
4,结构程序设计的类型( Cont.)
? 经典的结构程序设计
Seq; if-then-else; do-While
? 扩展的结构程序设计
增加 do-case; do-until
? 修正的结构程序设计
允许 leave; break
5,结构程序设计的优点( Cont.)
? 符合人类解决复杂问题的规律,提高成功率和生
产率。
? 自顶向下逐步求精,使得相邻两次精化之间变化
甚小,不难验证前后内容是否一致和有效。使得
程序具有清晰的结构层次。
? 不使用 GO TO 语句,避免了“病态连接”,消
除“涟漪效应”,提高软件的可理解性、可靠性、
可测试性和可维护性。
? 清晰的模块化程序利于重用和复用。
? 利于程序的正确性证明和形式化开发。
三,人机界面设计
1,设计问题
? 系统响应时间
? 用户帮助设施
? 出错信息处理
? 命令交互
2,设计过程( p111)
3,人机界面设计指南( p112)
1,设计问题
? 系统响应时间( p110)
? 用户帮助设施( p110)
? 出错信息处理( p110)
? 命令交互( p111)
2,设计过程( p111)
? 原型化设计与 GUI工具
? 对 GUI 设计模型的早期评价标准
1) 系统及其界面的规格说明书的长度和复杂程度决
定了用户学习使用该系统所付出的代价。
2) 命令或动作的数量、命令的参数个数等对系统交
互时间和效率的影响。
3) 命令或动作的数量、系统状态的数量对用户操作
的影响(如迷航问题)。
4) 界面风格、在线帮助、出错处理协议等决定了用
户是否能够顺利接受你所设计的界面。
3,人机界面设计指南( p112)
四、详细设计的工具( P114)
? 程序流程图( Program flow diagram)
? N-S图( Nassi和 Shneiderman提出)
? PAD图( Problem Analysis Diagram)
? 判定表 (Decision Table)
? 判定树 (Decision Tree)
? 过程设计语言 PDL( Program Design
Language,also called Structured English
or Pseudo code)
PDL is not a programming language
Component alarmManagement;
The intent of this component is to manage control panel switches
and input from sensors by type and to act on any alarm condition
that is encountered.
set default values for systemStatus(returned value),all data items
initialize all system ports and reset all hardware
Check controlPanelSwitches(cps)
if cps = ―test‖ then invoke alarm set to ―on‖
if cps = ―alarmOFF‖ then invoke alarm set to ―off‖
……
default for cps = none
reset all singalValues and switches
do for all sensors
cont.
invoke checkSensor procedure returning singalValue
if singalValue > bound [alarmType]
then phone.message = message [alarmType]
set alarmBell to ―on‖ for alarmTimeSeconds
set system status = ―alarmCondition‖
parbegin \parallel block,all tasks are executed in parallel.\
invoke alarm procedure with ―on‖,alarmTimeSeconds
invoke alarm procedure set to alarmType,phoneNumber
parend
else skip
endif
enddofor
End alarmManagement
五、面向数据结构的 设计方法
1,面向数据结构的设计方法
2,MJSD方法( Michael Jackson Structured
Design method),是一种面向数据结构
的设计方法,既可以表达程序结构,也
能表达数据结构。
3,Jackson设计方法与 SD比较
? 面向数据结构
? 一般用于详细设计阶段
? 设计工具不同
Jackson方法与 SD比较( cont.)
问题结构
( DFD)
程序结构
( SC)
程序的过程性表示
( PDL等)概要设计 详细设计
数据结构
( Jackson图)
程序结构
( Jackson图 )
程序的过程性表示
( Jackson 伪代码)
程序分析 程序设计
4,Jackson图与 Jackson伪代码
A
B C
A
Bo Co
A
B*
顺序
A seq
B
C
end A
选择
A select cond1
B
or cond2
C
end A
重复
A iter
{while}cond
B
end A
有关 Jackson图的提示
1,Jackson图既能表示数据结构,又能
表示程序结构。
2,表示数据结构时,用于表示数据元
素彼此间的三种逻辑关系(顺序、
选择和重复)。
3,表示程序结构时,Jackson图表现的
不是调用关系,一个方框中所包括的
操作仅仅由它下层方框中的那些操作组
成。 一个方框也不能代表一个模块。
4,改进的 Jackson图( p121)
实例:用 Jackson图表示二维表格
职工名册
姓名 类别 津贴
表示数据结构
津贴
教龄津贴 o 工龄津贴 o
名册
表头 表体
行 *表名行 栏名行
姓名 类别
产生津贴
产生教龄津贴 o 产生工龄津贴 o
产生名册
产生表头 产生表体
产生行 *产生表名行 产生栏名行
产生姓名 产生类别
表示程序结构
Jackson伪代码(过程性表示)
产生表体 iter while 小于或等于总人数
产生行
end 产生表体
产生行 seq
产生姓名
产生类别
产生津贴
end 产生行
产生名册 seq
产生表头
产生表体
end 产生行
5,Jackson程序设计步骤( P122)
? 分析并确定输入数据和输出数据的逻辑结构,并
用 Jackson图描绘这些数据结构( DS)。
? 找出输入 DS和输出 DS中有对应关系的数据单元。
? 用 有关规则 从描绘数据结构的 Jackson图导出描绘
程序结构的 Jackson 图。
? 列出所有操作和条件(分支条件和循环结束条
件),并且把它们分配到程序结构图的适当位置。
? 用 Jackson伪代码表示程序。(参见 P123实例)
三条映射规则
– 为每对有对应关系的数据单元,按照其在
数据结构图中的层次在程序结构图的相应
层次画一个处理框;
– 根据输入数据结构中剩余的每个数据单元
所处的层次在程序结构图的相应层次分别
为它们画上对应的处理框。
– 根据输出数据结构中剩余的每个数据单元
所处的层次在在程序结构图的相应层次分
别为它们画上对应的处理框。
一个简单例子
? 一个正文文件由若干个记录组成,每个记
录是一个字符串。
? 要求统计每个记录中空格字符的个数,以
及文件中空格字符的总个数。
? 要求的输出数据格式是,每复制一行输入
字符串之后,另起一行印出其空格数。最
后印出整个文件的空格总数。
Cont.
例如,作为输入数据的正文文件为,
How are you!
Testing is a process of executing a program with the
intent of finding an error.
那么,输出结果为:
How are you!
2
Testing is a process of executing a program with the
intent of finding an error.
13
15
一、分析并确定输入数据和输出数据的逻辑结构,并用
Jackson图描绘这些数据结构
空格数
输出表格
串信息 *
表格体 空格总数
字符串空格 o 非空格 o
正文文件
字符串 *
字符 *
二、找出输入 DS和输出 DS中有对应关系的数据单元。
三、从描绘 DS的 Jackson图
导出描绘 PS的 Jackson 图。
首先为每对有对应关系的数
据单元,按照其在 DS图中的
层次在 PS图的相应层次画一
个处理框;
根据输入 DS中剩余的每个数
据单元所处的层次在 PS图的
相应层次分别为它们画上对
应的处理框。
根据输出 DS中剩余的每个数
据单元所处的层次在 PS图的
相应层次分别为它们画上对
应的处理框。
统计空格
处理字符串 *
印空格数
程序体 印总数
印字符串 分析字符串
分析字符 *
处理空格 o 处理非空格 o
四、列出所有的操作和文件
停
止
打
开
文
件
读
入
字
符
串
初
始
化
处理字符串 *
统计空格
印空格数
程序体 印总数
印字符串 分析字符串
分析字符 *
处理空格 o 处理非空格 o
关
闭
文
件
五、伪码表示
统计空格 seq
打开文件
读入字符串
初始化 totalsum:=0
程序体 iter until 文件结束
处理字符串 seq
印字符串 seq
分析字符串 iter until 字符串结束
分析字符
处理空格
处理非空格
……
分析字符串 end
印空格数 seq
……
处理字符串 end
程序体 end
印总数 seq
关闭文件
停止
统计空格 end
基于数据结构设计的问题
? 数据合法性检查和错误处理
? 顺序冲突
? 该方法具有一定的局限性和规模要求
Warnier 程序设计方法
? 又称 LCP (Logical Construction of Program) 。
由 J,D,Warnier提出,既可以表达数据结构,
也能表达程序结构。
? LCP设计方法的特点
– 从数据结构出发 → 程序结构 → 伪代码
– 一般用于详细设计阶段
– 自成体系和专用的设计工具
? LCP设计工具
– Warnier图(描述数据结构和程序的处理层次)
– 程序流程图
– Warnier伪代码或结构化英语
六、程序复杂度的定量度量
? T,McCabe 方法(环域复杂度)
? Halstead 方法
? M,R,Woodward方法(交叉点复杂度)
? Card和 Glass(定义了三个软件体系结构复
杂度度量:结构复杂度、数据复杂度和系
统复杂度)
? OO度量( C&k度量,Lorenz和 Kidd度量、
面向操作的度量等)
McCabe 方法的基本概念
? 程序图 ——是“退化了的”程序流动图,即
把程序流动图中每个处理符号都退化成一个
点,原来连接不同处理符号的箭头变成连接
不同点的有向弧。
? 程序图是一个有向图(参见 P128图 6.15)。
? 入口点与出口点
? 环形复杂度 Cyclomatic Complexity——强连
通有向图中线性无关的有向环的个数。
环域复杂度的计算方法
? 对于强连通的有向图 G,线性无关的有向环
个数 V(G)的计算公式,V(G) = m - n + p
– m 为弧数
– n 为节点数
– p 为 不连通部分的数目,由于程序图总是连通的,
故 p = 1。
? 为了使程序图成为强连通的,须从出口点到
入口点添加一条虚弧。
7
4
6
5
3
T
T
2 F
X=X/A
F
1
X=X + 1
入口
出口
A>1 AND B=0
A=2 OR X>1
PROC EXPA( A,B,X,REAL);
BEGIN
IF (A>1 AND B=0 )
THEN X=X/A;
IF (A=2 OR X>1)
THEN X=X + 1;
END;
V(G)=3
三种计算 V(G)的方法
? V(G)=判定结点数+ 1
? V(G)=环域数
? V(G)= m-n+p
计算它的环形复杂度
V( G) = 判定数 +1
= 3+1 = 4
2
3
4 5
7
6 8
9
1
R1
R2
R3
R4
V( G) = 环域数
= 4
V( G) = m – n + p
= 12 – 9 + 1
环域复杂度的意义
? V(G)取决于程序控制流的复杂度,代表
了程序结构的复杂度。程序内分支或循
环数越大,环域复杂度越高。
? 环域复杂度是可加的。
? 基于环域复杂度的度量结果,可以对测
试难度和软件可靠性进行预测。
? 大量实验表明,V(G) ≤ 10 为宜。
利用环域复杂度度量软件的缺点
? 多行顺序执行的语句和一行的复杂性一样。
? 简单 if 语句与循环语句一样。
? 嵌套 if 语句与简单 case 语句一样。
? 模块间的接口当成一个简单的分支处理。
Halstead 方法
? 根据程序中运算符和操作数的总数来度量程
序的复杂度。
? 定义程序长度 N = N1 + N2
N1为运算符出现的总次数; N2操作符出现的总次数。
? 预测程序长度的经验公式:
H = n1 log2 n1+n2 log2 n2
n1为不同运算符(包括关键字)的个数;
n2为不同操作数(变量和常数)的个数。
? 预测程序中错误个数的经验公式:
E= N log2 ( n1+n2 ) / 3000
作业:
P130习题六,第 1,2,3,4,8题
详细设计
本讲(第六章)的主要内容
一、详细设计及其任务
二、结构程序设计
三、人机界面设计
四、详细设计的工具
五,Jackson程序设计方法
六、程序复杂度的定量度量
一、详细设计及其任务
1,什么是详细设计?
– 针对一个个模块的设计,是过程设
计、算法设计。
– 详细设计仅仅是设计出程序的“蓝
图”,是编码的先导,但不是编写
程序。
2,模块的属性:功能、逻辑和状态
3,详细设计的任务
3,详细设计的任务( Cont,)
? 每个模块内的数据结构
? 每个模块的控制算法
? 内部接口描述
? 为每一模块设计出一组测试用例( test
cases),因为详细设计人员对模块的功
能、逻辑、接口等最了解。
? 评审
二、结构程序设计
1,定义:结构化程序设计是一种设计程
序的技术,它采用自顶向下逐步求精
的设计方法和单入口单出口的控制结
构。
2,结构化程序设计的要点
– 自顶向下逐步求精
– 采用三种基本结构,消除 goto语句
– 设计单入口、单出口的模
3,结构程序设计的提出( Cont.)
? 1965年 E,W,Dijkstra指出 GO TO 语句对
程序质量的负面影响,建议取消它。
? Bohm等证明了任何单入口单出口的程序
都可以用“顺序”、“选择”和“循环”
三种控制结构实现。
? Mills基于在 IBM的实践,提出程序应该
只有一个入口和一个出口。
? Wirth通过对抽象层次的论述,对逐步求
精方法进行了肯定。
4,结构程序设计的类型( Cont.)
? 经典的结构程序设计
Seq; if-then-else; do-While
? 扩展的结构程序设计
增加 do-case; do-until
? 修正的结构程序设计
允许 leave; break
5,结构程序设计的优点( Cont.)
? 符合人类解决复杂问题的规律,提高成功率和生
产率。
? 自顶向下逐步求精,使得相邻两次精化之间变化
甚小,不难验证前后内容是否一致和有效。使得
程序具有清晰的结构层次。
? 不使用 GO TO 语句,避免了“病态连接”,消
除“涟漪效应”,提高软件的可理解性、可靠性、
可测试性和可维护性。
? 清晰的模块化程序利于重用和复用。
? 利于程序的正确性证明和形式化开发。
三,人机界面设计
1,设计问题
? 系统响应时间
? 用户帮助设施
? 出错信息处理
? 命令交互
2,设计过程( p111)
3,人机界面设计指南( p112)
1,设计问题
? 系统响应时间( p110)
? 用户帮助设施( p110)
? 出错信息处理( p110)
? 命令交互( p111)
2,设计过程( p111)
? 原型化设计与 GUI工具
? 对 GUI 设计模型的早期评价标准
1) 系统及其界面的规格说明书的长度和复杂程度决
定了用户学习使用该系统所付出的代价。
2) 命令或动作的数量、命令的参数个数等对系统交
互时间和效率的影响。
3) 命令或动作的数量、系统状态的数量对用户操作
的影响(如迷航问题)。
4) 界面风格、在线帮助、出错处理协议等决定了用
户是否能够顺利接受你所设计的界面。
3,人机界面设计指南( p112)
四、详细设计的工具( P114)
? 程序流程图( Program flow diagram)
? N-S图( Nassi和 Shneiderman提出)
? PAD图( Problem Analysis Diagram)
? 判定表 (Decision Table)
? 判定树 (Decision Tree)
? 过程设计语言 PDL( Program Design
Language,also called Structured English
or Pseudo code)
PDL is not a programming language
Component alarmManagement;
The intent of this component is to manage control panel switches
and input from sensors by type and to act on any alarm condition
that is encountered.
set default values for systemStatus(returned value),all data items
initialize all system ports and reset all hardware
Check controlPanelSwitches(cps)
if cps = ―test‖ then invoke alarm set to ―on‖
if cps = ―alarmOFF‖ then invoke alarm set to ―off‖
……
default for cps = none
reset all singalValues and switches
do for all sensors
cont.
invoke checkSensor procedure returning singalValue
if singalValue > bound [alarmType]
then phone.message = message [alarmType]
set alarmBell to ―on‖ for alarmTimeSeconds
set system status = ―alarmCondition‖
parbegin \parallel block,all tasks are executed in parallel.\
invoke alarm procedure with ―on‖,alarmTimeSeconds
invoke alarm procedure set to alarmType,phoneNumber
parend
else skip
endif
enddofor
End alarmManagement
五、面向数据结构的 设计方法
1,面向数据结构的设计方法
2,MJSD方法( Michael Jackson Structured
Design method),是一种面向数据结构
的设计方法,既可以表达程序结构,也
能表达数据结构。
3,Jackson设计方法与 SD比较
? 面向数据结构
? 一般用于详细设计阶段
? 设计工具不同
Jackson方法与 SD比较( cont.)
问题结构
( DFD)
程序结构
( SC)
程序的过程性表示
( PDL等)概要设计 详细设计
数据结构
( Jackson图)
程序结构
( Jackson图 )
程序的过程性表示
( Jackson 伪代码)
程序分析 程序设计
4,Jackson图与 Jackson伪代码
A
B C
A
Bo Co
A
B*
顺序
A seq
B
C
end A
选择
A select cond1
B
or cond2
C
end A
重复
A iter
{while}cond
B
end A
有关 Jackson图的提示
1,Jackson图既能表示数据结构,又能
表示程序结构。
2,表示数据结构时,用于表示数据元
素彼此间的三种逻辑关系(顺序、
选择和重复)。
3,表示程序结构时,Jackson图表现的
不是调用关系,一个方框中所包括的
操作仅仅由它下层方框中的那些操作组
成。 一个方框也不能代表一个模块。
4,改进的 Jackson图( p121)
实例:用 Jackson图表示二维表格
职工名册
姓名 类别 津贴
表示数据结构
津贴
教龄津贴 o 工龄津贴 o
名册
表头 表体
行 *表名行 栏名行
姓名 类别
产生津贴
产生教龄津贴 o 产生工龄津贴 o
产生名册
产生表头 产生表体
产生行 *产生表名行 产生栏名行
产生姓名 产生类别
表示程序结构
Jackson伪代码(过程性表示)
产生表体 iter while 小于或等于总人数
产生行
end 产生表体
产生行 seq
产生姓名
产生类别
产生津贴
end 产生行
产生名册 seq
产生表头
产生表体
end 产生行
5,Jackson程序设计步骤( P122)
? 分析并确定输入数据和输出数据的逻辑结构,并
用 Jackson图描绘这些数据结构( DS)。
? 找出输入 DS和输出 DS中有对应关系的数据单元。
? 用 有关规则 从描绘数据结构的 Jackson图导出描绘
程序结构的 Jackson 图。
? 列出所有操作和条件(分支条件和循环结束条
件),并且把它们分配到程序结构图的适当位置。
? 用 Jackson伪代码表示程序。(参见 P123实例)
三条映射规则
– 为每对有对应关系的数据单元,按照其在
数据结构图中的层次在程序结构图的相应
层次画一个处理框;
– 根据输入数据结构中剩余的每个数据单元
所处的层次在程序结构图的相应层次分别
为它们画上对应的处理框。
– 根据输出数据结构中剩余的每个数据单元
所处的层次在在程序结构图的相应层次分
别为它们画上对应的处理框。
一个简单例子
? 一个正文文件由若干个记录组成,每个记
录是一个字符串。
? 要求统计每个记录中空格字符的个数,以
及文件中空格字符的总个数。
? 要求的输出数据格式是,每复制一行输入
字符串之后,另起一行印出其空格数。最
后印出整个文件的空格总数。
Cont.
例如,作为输入数据的正文文件为,
How are you!
Testing is a process of executing a program with the
intent of finding an error.
那么,输出结果为:
How are you!
2
Testing is a process of executing a program with the
intent of finding an error.
13
15
一、分析并确定输入数据和输出数据的逻辑结构,并用
Jackson图描绘这些数据结构
空格数
输出表格
串信息 *
表格体 空格总数
字符串空格 o 非空格 o
正文文件
字符串 *
字符 *
二、找出输入 DS和输出 DS中有对应关系的数据单元。
三、从描绘 DS的 Jackson图
导出描绘 PS的 Jackson 图。
首先为每对有对应关系的数
据单元,按照其在 DS图中的
层次在 PS图的相应层次画一
个处理框;
根据输入 DS中剩余的每个数
据单元所处的层次在 PS图的
相应层次分别为它们画上对
应的处理框。
根据输出 DS中剩余的每个数
据单元所处的层次在 PS图的
相应层次分别为它们画上对
应的处理框。
统计空格
处理字符串 *
印空格数
程序体 印总数
印字符串 分析字符串
分析字符 *
处理空格 o 处理非空格 o
四、列出所有的操作和文件
停
止
打
开
文
件
读
入
字
符
串
初
始
化
处理字符串 *
统计空格
印空格数
程序体 印总数
印字符串 分析字符串
分析字符 *
处理空格 o 处理非空格 o
关
闭
文
件
五、伪码表示
统计空格 seq
打开文件
读入字符串
初始化 totalsum:=0
程序体 iter until 文件结束
处理字符串 seq
印字符串 seq
分析字符串 iter until 字符串结束
分析字符
处理空格
处理非空格
……
分析字符串 end
印空格数 seq
……
处理字符串 end
程序体 end
印总数 seq
关闭文件
停止
统计空格 end
基于数据结构设计的问题
? 数据合法性检查和错误处理
? 顺序冲突
? 该方法具有一定的局限性和规模要求
Warnier 程序设计方法
? 又称 LCP (Logical Construction of Program) 。
由 J,D,Warnier提出,既可以表达数据结构,
也能表达程序结构。
? LCP设计方法的特点
– 从数据结构出发 → 程序结构 → 伪代码
– 一般用于详细设计阶段
– 自成体系和专用的设计工具
? LCP设计工具
– Warnier图(描述数据结构和程序的处理层次)
– 程序流程图
– Warnier伪代码或结构化英语
六、程序复杂度的定量度量
? T,McCabe 方法(环域复杂度)
? Halstead 方法
? M,R,Woodward方法(交叉点复杂度)
? Card和 Glass(定义了三个软件体系结构复
杂度度量:结构复杂度、数据复杂度和系
统复杂度)
? OO度量( C&k度量,Lorenz和 Kidd度量、
面向操作的度量等)
McCabe 方法的基本概念
? 程序图 ——是“退化了的”程序流动图,即
把程序流动图中每个处理符号都退化成一个
点,原来连接不同处理符号的箭头变成连接
不同点的有向弧。
? 程序图是一个有向图(参见 P128图 6.15)。
? 入口点与出口点
? 环形复杂度 Cyclomatic Complexity——强连
通有向图中线性无关的有向环的个数。
环域复杂度的计算方法
? 对于强连通的有向图 G,线性无关的有向环
个数 V(G)的计算公式,V(G) = m - n + p
– m 为弧数
– n 为节点数
– p 为 不连通部分的数目,由于程序图总是连通的,
故 p = 1。
? 为了使程序图成为强连通的,须从出口点到
入口点添加一条虚弧。
7
4
6
5
3
T
T
2 F
X=X/A
F
1
X=X + 1
入口
出口
A>1 AND B=0
A=2 OR X>1
PROC EXPA( A,B,X,REAL);
BEGIN
IF (A>1 AND B=0 )
THEN X=X/A;
IF (A=2 OR X>1)
THEN X=X + 1;
END;
V(G)=3
三种计算 V(G)的方法
? V(G)=判定结点数+ 1
? V(G)=环域数
? V(G)= m-n+p
计算它的环形复杂度
V( G) = 判定数 +1
= 3+1 = 4
2
3
4 5
7
6 8
9
1
R1
R2
R3
R4
V( G) = 环域数
= 4
V( G) = m – n + p
= 12 – 9 + 1
环域复杂度的意义
? V(G)取决于程序控制流的复杂度,代表
了程序结构的复杂度。程序内分支或循
环数越大,环域复杂度越高。
? 环域复杂度是可加的。
? 基于环域复杂度的度量结果,可以对测
试难度和软件可靠性进行预测。
? 大量实验表明,V(G) ≤ 10 为宜。
利用环域复杂度度量软件的缺点
? 多行顺序执行的语句和一行的复杂性一样。
? 简单 if 语句与循环语句一样。
? 嵌套 if 语句与简单 case 语句一样。
? 模块间的接口当成一个简单的分支处理。
Halstead 方法
? 根据程序中运算符和操作数的总数来度量程
序的复杂度。
? 定义程序长度 N = N1 + N2
N1为运算符出现的总次数; N2操作符出现的总次数。
? 预测程序长度的经验公式:
H = n1 log2 n1+n2 log2 n2
n1为不同运算符(包括关键字)的个数;
n2为不同操作数(变量和常数)的个数。
? 预测程序中错误个数的经验公式:
E= N log2 ( n1+n2 ) / 3000
作业:
P130习题六,第 1,2,3,4,8题