第四章 笔记
4.1 结构化设计与结构化分析的关系
4.1.1 结构化设计
4.1.2 结构化设计与分析关系图
4.2 软件设计的概念与原理
4.2.1 结构化设计的概念与原理——模块化
4.2.2 结构化设计的概念与原理——抽象
4.2.3 结构化设计的概念与原理——逐步求精
4.2.4 结构化设计的概念与原理——信息隐蔽
4.2.5 结构化设计的概念与原理——模块独立
4.3 启发规则
4.4 面向数据流设计方法
面向数据流的设计要解决的任务,就是将软件需求分析阶段生成的逻辑模型数据流映射(Mapping)表达软件系统结构的软件结构图。
结构化设计属于面向数据流的设计方法。
4.4.1 软件结构图
4.4.2 信息流类型
4.4.3 面向数据流设计过程
4.4.4 变换分析
4.4.5 事物分析
4.5 人机界面设计
4.5.1 人机界面设计问题
4.5.2 人机界面设计指南
4.6 过程设计
4.6.1 过程设计任务
4.6.2 结构化程序设计
4.6.3 结构化程序设计工具(程序流程图、N-S图、PAD图、判定表、判定数、过程设计语言)
4.6.4 程序复杂度
4.7 面向数据结构设计方法
数据结构既影响程序的结构也影响程序的处理过程,可从数据结构导出程序的处理过程,适合详细设计。
面向数据结构设计方法有两种:Jackson和Warnier方法
4.7.1 Jackson图
4.7.2 Jackson方法步骤
4.7.3 Jackson方法示例
4.1.1 结构化设计
传统软件工程方法学采用结构化设计技术(SD)。
从工程管理角度结构化设计分两步:概要设计:
将软件需求转化为数据结构和软件系统结构
详细设计:
过程设计,通过对结构细化,得到软件详细数据结构和算法。
4.1.2 结构化设计与分析关系图
数据设计:
数据模型及核心数据字典转变为数据结构。
体系结构设计:
功能模型中数据流图转变成计算机模块框架。
接口设计:
功能模型中数据流图转变成软件内部、软件协作系统间、软件与用户间通信方式。
过程设计:
行为模型及功能模型中的“处理规格说明”转换成软件构件过程描述。
4.2.1 结构化设计的概念与原理——模块化
模块(module)——“模块”又称“构建”一般指用一个名字调用的相邻程序元素序列。
模块化设计(modular design)——按适当的原则吧软件划分为一个个较小的、相关而又相对独立的模块
设:C(x)为复杂程度函数
E(x)为决定解决问题x所需的工作量(时间)函数
C(P1) > C(P2) E(P1)> E(P2)
C(P1 + P2) > C(P1) + C(P2) E(P1 + P2) > E(P1) + E(P2)
C(P1 + P2) > C(P1) + C(P2)
E(P1 + P2) > E(P1) + E(P2)
4.2.2 结构化设计的概念与原理——抽象
Miller法则: Magical Number Seven,Plus or Minus Two,Some Limits on Our Capacity for Processing Information
——The Psychological Review,1956
奇妙的数字 7+2,人类信息处理能力的限度
抽象事物的本质特性,暂不考虑细节(人无法考虑到所有的细节,不可能刚开始就可以想到某些很难想到的奇特细节)
4.2.3 结构化设计的概念与原理——逐步求精
求精是指为了能集中精力解决主要问题,尽量推迟对细节问题的考虑,实际上是一个细化的过程,与抽象是互补的概念。
抽象使得设计者能够说明过程和数据,同时却忽略底层细节;
求精帮助设计者在设计过程中解释底层细节。
4.2.4 结构化设计的概念与原理——信息隐蔽
每个模块的实现细节对于其他模块来说是隐藏的也就是说,模块中所包含的信息是不允许其他不需要这些信息的模块访问的。
每个客户只能通过接口来了解模块,而所有的实现都隐蔽起来。
4.2.5 结构化设计的概念与原理——模块独立
具有独立功能且和其他模块没过多作用。
两条理由:
- 容易分工合作;
- 容易测试和维护,修改工作量较小,错误传播范围小,扩充功能容易。
两个定性度量标准: 耦合和内聚。
耦合:
定义:
软件结构中不同模块间互联程度度量。
取决于模块间接口复杂程度(越复杂耦合度越高),通过接口数据(数据量越大耦合度越高)
最求尽可能松散耦合系统。(为了追求系统模块的独立,只有模块之间的关系简单了,模块就独立了)
耦合示意图:
白色区域:四个模块
红色箭头:模块间传递的信息
非直接耦合:
两个模块分别能独立地工作不需要另一模块存在
数据耦合:
两模块通过参数交换数据信息(相对松散的耦合,是设计中想设计出来的耦合)
数据耦合示意图:
控制耦合:
两模块通过参数交换控制信息(包括数字形式)(相对紧密的耦合)
控制耦合示意图:
公共环境耦合:
两个或多个模块通过一公共数据环境作用。
公共环境耦合示意图:
两种可能:
- 一模块送数据,另一模块取,等价数据耦合
- 两模块既往公共环境送又从里面取,介于数据耦合和控制耦合之间。
两种公共环境耦合示意图:
内容耦合(相当紧密的耦合):
- 一模块访问另一模块内部数据;
- 一模块不通过正常入口转到另一模块内部;
- 两模块又部分程序代码重叠(汇编程序);
- 一模块有多个入口。
内容耦合示意图:
耦合原则:
尽量使用数据耦合,少用控制耦合,限制公共环境耦合,完全不用内容耦合。
内聚:
定义:模块内各元素彼此结合紧密程度。(模块与内部元素越紧密就代表与外部越松散,就越独立)
功能内聚:(较好)
一模块中各部分是完成某一功能必不可少组成部分。
顺序内聚:(较好)
模块内处理元素同某功能密切相关,顺序执行。
通信内聚:(中等)
一模块内各功能部分都是使用相同输入数据,或产生相同的输出数据。
通信内聚示意图:
过程内聚:
模块内处理元素相关,特定次序执行。如把流程中循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。
过程内聚示意图:
时间内聚:
多为多功能模块,要求所有功能在同一时间内执行。如初始化模块和终止模块及紧急故障处理模块。
逻辑内聚:
一模块完成功能在逻辑上属相同相似一类。
逻辑内聚示意图:
偶然内聚:
模块内各部分间没有联系,即使有也很松散。
偶然内聚示意图:
内聚比较:
- 功能内聚:10分
- 顺序内聚:9分
- 通信内聚:7分
- 过程内聚:5分
- 时间内聚:3分
- 逻辑内聚:1分
- 偶然内聚:0分
4.3 启发规则
一、改进软件结构提高模块独立性
初步结构分解或合并,降低耦合提高内聚。
改善软件结构示意图:
二、模块规模应该适中
过大分解不充分,但进一步分解不应降低模块独立性;
过小开销大于有效操作,模块数目过多系统接口复杂;
通常语句行数在50~100(一页纸),最多不超过500行。
三、深度、宽度、扇出和扇入应适当
深度:软件结构控制层数,标志一个系统大小和复杂程度。
宽度:软件结构同一层模块数最大值,越大系统越复杂。
软件结构参数示意图:
扇出:
一模块直接控制(调用)模块数,过大,模块复杂,过小(如1)不好。一般保持在3-9之间。
扇入:
有多少上级模块直接调用它,越大共享该模块上级模块越多。
扇出扇入不合适--改善。
改善高扇出软件结构示例
改善后的软件结构图
四、模块作用域应在控制域内
作用域:受该模块内判定影响的所有模块集合。
控制域:模块本身及所有直接或间接从属它的模块集合。
若模块作用域不在控制域内,会增大模块间控制耦合。
改善作用域不在控制域的软件结构图
改善方案一:
改善方案二:
五、降低模块接口复杂程度
模块接口复杂是软件发生错误一主要原因。应使信息传递简单且和模块功能一致。
QUAD-ROOT(TBL,X) QUAD-ROOT(A,B,C,ROOT1,ROOT2)
六、设计单入口、单出口模块
避免内容耦合。
七、模块功能可预测
输入数据相同,产生同样输出。模块功能防止过分受限。
不可预测模块:
过分受限模块:
4.4.1 软件结构图
1. 模块——在SC图中用矩形框表示,并用名字来标记它
2. 模块的调用关系和接口
注:数据信号用空心圆带箭头,控制信号用实心圆带箭头,模块调用关系不用带箭头的线(默认自上而下)
4.4.2 信息流类型
1. 变换流
信息沿输入通路进入系统,由外部形式变换成内部形式,通过变换中心教工处理再沿输出通路换成外部形式离开软件系统。
2. 事务流
信息沿输入通路到一处理,由处理根据输入信息类型再若干动作序列中选一个执行。
处理称事务中心,完成任务:
(1)接收输入信息(又称事物);
(2)分析每个事物确定类型;
(3)根据事务类型选取一活动通路
事务流示意图:
4.4.3 面向数据流设计过程
4.4.4 变换分析
将具有变换流特点的数据流图映射成软件结构。
例:软件做在只读存储器中,使设备具有某些“智能”。假设的仪表板将完成下述功能:
- 通过模/数转换实现传感器和微处理机接口;
- 再发光二极管面板上显示数据;
- 指示每小时英里数(mile/h)、行驶里程和每加仑油行驶的英里数(mile/Gal)等;
- 指示加速或减速
- 超速警告:发出超速警告铃声。
1. 复查基本系统模型
确保系统输入和输出数据符合实际。
2. 复查并精化数据流图
正确、处理项完成相对独立功能。
数字仪表板系统数据流图
3. 确定数据流图具有变换特性还是事务特性
没有明显事务中心,为变换型。
4. 找出变换中心
确定数据流边界。
具有边界的数据流图
5. 完成一级分解
数字仪表板的第一级分解
6. 完成第二级分解
数字仪表板的第二级分解-输入结构
数字仪表板的第二级分解-变换结构
数字仪表板的第二级分解-输出结构
7. 对初步软件结构精化
4.4.5 事物分析
信息流有明显事务特点(事务中心),采用事务分析方法。
软件结构:一接收分支和一发送分支。
事务分析映射方法
事务分析示例
4.5.1 人机界面设计问题
1. 系统响应时间
从用户完成某控制动作,到软件给出预期响应。
两个重要属性:长度和易变性。
关于长度:
过长用户感到不安、沮丧
用户觉得系统立即响应时间范围0.1-1秒,超出1秒就会让用户主义到延迟
1-10秒 鼠标显示成为沙漏
10-18秒 由微帮助来显示处理进度
18秒以上 显示处理窗口,或显示进度条
过短迫使用户加快操作节奏,导致出错。
关于易变性:
易变性指相应时间相对平均响应时间偏低,越低越好,否则会让用户误认为系统异常。
2. 用户帮助措施
手册和联机帮助(不离开用户界面)。
联机帮助两类:集成帮助和附加帮助。
集成帮助设计在软件里面,附加帮助系统建成后加到软件中,前者可用性更强。
请求帮助:帮助菜单,特殊菜单,特殊功能键,help命令
显示帮助信息:
独立窗口
参考某个文档
屏幕固定位置做简短提示
组织帮助信息:
平面结构,通过关键字访问
层次结构,查更详细信息
超文本结构
3. 出错信息处理
- 以用户可理解的术语;
- 提供清楚、易理解的报错信息(出错位置、原因);
- 以错误中恢复的建设性意见;
- 信息用颜色等在视觉上引人注目;
- 可能造成的负面后果
4. 命令交互(建议保留命令交互方式)
- 控制序列:Ctrl+C(拷贝)、Ctrl+H(帮助)、Ctrl+P(打印)
- 功能键:F1(帮助)
- 命令宏机制:用户定义名字代表一个常用命令序列。
4.5.2 人机界面设计指南
1. 一般交互
- 保持人机界面菜单选择、命令输入、数据显示风格一致;
- 提供有意义信息反馈:双向通信;
- 破坏性动作前要确定:删除、覆盖;
- 允许取消大多数操作;
- 减少两次操作之间必须的记忆量;
- 提高对话、移动和思考的效率;
- 允许犯错误:保护不受致命错误破坏;
- 按功能对动作分类,设计屏幕布局;
- 提供帮助措施;
- 用简单的动词或动词词语作为命令名;
2. 信息显示
3. 数据输入
4.6.1 过程设计任务
4.6.2 结构化程序设计
结构化程序设计技术是过程设计一关键技术
- 经典定义:
程序代码通过顺序、选择、循环三种控制结构链接,单入口单出口。- 扩展定义:
可限制使用goto语句、do_until和do_case- 修正定义:
leave和break,可从循环中转移出来。
4.6.3 结构化程序设计工具(程序流程图、N-S图、PAD图、判定表、判定数、过程设计语言)
一、流程图
- 顺序型
几个连续的加工依次序排列- 选择型
由某个判定的取值决定选择两个加工中的一个。- 当型循环型
当循环控制条件成立是,重复执行特定的加工。- 直到型循环型
重复执行特定的加工,知道循环条件成立时。- 多情况选择型
列出多种加工情况根据控制变量的取值,选择执行其一。- 程序设计流程图标准化图符
- 计算n阶乘的程序流程图
- 优点:
对控制流程描绘直观,便于初学者掌握。- 缺点:
不是逐步求精的好工具,过早考虑流程控制,非整体结构;
用箭头代表控制流,程序员随意转移控制;
不易表示数据结构和调用关系。二、N-S图
三、PAD图
- 示例
- 计算n阶层的PAD图
- 优点:
(1)使用PAD图设计的程序必然是结构化程序;
(2)PAD图描绘的程序结构十分清晰;
(3)用PAD图表现程序逻辑,易读、易懂、易记;
(4)容易将PAD图转换成高级语言源程序;
(5)支持自顶向下逐步求精。- 逐步求精
四、判定表
能清晰表示复杂的条件组合与应做动作间的对应关系。
四部分:
左上部列出所有条件;
左下部所有可能的动作;
右上部表示条件组合的一矩阵;
右下部是和各种条件组合相对应的动作。
五、判定树
六、伪码
用正文形式表示数据和处理过程设计的工具
- PDL具有严格关键字外部语法,定义控制结构和数据结构;
- PDL表示实际操作和条件的内部语法灵活自由,适应各种工程项目需要。
4.6.4 程序复杂度
介绍使用比较广泛的McCabe方法。
4.7.1 Jackson图
4.7.2 Jackson方法步骤
- 确定输入数据和输出数据逻辑结构,用Jackson图表示;
- 去定输入结构和输出结构中有对应关系(因果)的单元;
- 描绘数据结构的Jackson图导出描绘程序结构Jackson图;
- 列出所有操作和条件,分配到Jackson图中;
- 用伪码表示。





















































































浙公网安备 33010602011771号