知识要点:
1)总体设计:总体设计的过程、原理、模块化、抽象、逐步求精等过程;
2)层次图和HIPO图、结构图;3)面向数据流的设计方法的概念、变换分析、事务分析和设计优化,内聚和耦合。
4)详细设计:结构化程序设计;程序流程图、盒图、PAD图、判定树、判定表;
5)面向数据结构的设计方法,Jackson图及方法;程序复杂程度的定量度量。
总体设计:任务设计软件结构,确定系统中每个程序是由那些模块组成,以及这些模块相互之间的关系;
总体设计的目的是用比较抽象概括的方式确定系统如何完成预定功能(即确定系统的物理配置方案,进而确定组成系统
的每个程序结构),其主要由两个阶段组成:系统设计和软件结构设计;
总体设计过程:
1)设想可供选择的方案; 2)选取合理方案; 3)推荐最佳方案; 4)功能分解; 5)设计软件结构;
6)设计数据库; 7)指定测试计划; 8)书写文档; 9)审查和复审;
设计原理:抽象、模块化、逐步求精、信息隐藏与局部化、模块独立;
模块化定义:把程序划分为独立命名并且可以独立访问的模块,每个模块完成一个子功能,这些模块构成的整体可以完成指定
功能满足用户需求;(模块化可以使复杂问题简单化,并不意味之无限的模块化可以简化整体的工程,因为还需要考虑到不同
模块相互结合之间的接口问题)
抽象:把事物相似的方面结合起来,暂时忽略它们之间的差异;
逐步求精:集中精力去解决主要问题而尽量避免细节问题的考虑;
信息隐藏与局部化:
信息隐藏 | 使模块内包含的信息(过程和数据)对于不需要这些信息的模块是不可以被访问的; |
局部化 | 把关系密切的软件元素物理地放置得彼此靠近,有助于实现信息隐藏; |
模块独立(度量标准:内聚和耦合;提倡高内聚低耦合)
模块独立的优点:1)有效地模块化有助于软件的开发; 2)独立的模块比较容易测试和维护;
耦合:对软件结构内不同模块之间相互连接程度的度量;
数据耦合 | 模块之间交换的仅仅是数据; |
控制耦合 | 模块间传递的信息包含控制信息; |
特征耦合 | 传递的数据被模块利用的仅仅是其中一部分(未被完全利用) |
公共环境耦合 | 模块间通过公共作用域相互作用; |
内容耦合 | 一个模块访问另一个模块的数据 一个模块通过不正常入口进入另一个模块内部 两个模块之间由代码上的重叠 一个模块有多个出口 |
(注:尽量使用数据耦合、少用控制耦合和特征耦合、限制公共环境耦合、完全不用内容耦合,耦合程度由上到下依次增加)
内聚:标志模块各个元素的彼此结合的紧密程度;
偶然内聚 | 任务之间虽然有关系,但关系很松散 |
逻辑内聚 | 模块完成的任务在逻辑上相同或相似 |
时间内聚 | 模块包含的任务必须在同一段时间内执行 |
过程内聚 | 模块内处理元素是向相关的,但必须按照特定的次序执行 |
通信内聚 | 模块内所有元素使用同一个输入产生同一个输出 |
顺序内聚 | 模块内处理元素和同一个功能密切相关且处理必须按照顺序执行 |
功能内聚 | 所有处理元素属于一个整体且完成特定功能 |
(注:内聚程度由上到下依次增加)
启发式规则:(7条)
1)改进软件结构提高模块的独立性; 2)模块规模要适中; 3)深度、宽度、扇入、扇出要适当;
4)模块的作用域应该在控制域之内; 5)力争降低模块接口的复杂程度; 6)设计单入口、单出口的模块;
7)模块的功能要可预测;
详细设计:确定系统如何具体实现所要求的系统;
结构化程序设计:通过顺序、选择、循环三种基本控制结构进行连接,并且使得每个代码块只有一个入口和一个出口;
几种重要的图:(要求会画以及之间的相互转换)
1、程序流程图
缺点:不是逐步求精的好工具,使程序员过早的考虑程序的设计流程而不去考虑程序的整体结构、
箭头代表控制流,程序员可以不受任何约束任意转义控制、不易表示数据结构;
(注:一般使用a、e、g、h、l、m、p来描绘一个程序流程图)
2、盒图(N-S图)
特点:1)功能域明确; 2)不可能任意转移控制; 3)很容易确定局部和全局数据的作用域;
4)很容易表示嵌套关系,也可以表示模块的层次结构;
(注:N-S图中没有箭头,因此不允许随意转移和控制)
3、PAD图(问题分析图)
a表示顺序结构、b表示选择结构、c表示多分支结构、d表示while循环结构、e表示until循环结构、g表示定义
优点:1)设计出来的程序必然是结构化的; 2)描绘的程序结构十分清晰; 3)表现程序逻辑,易读、易懂、易记;
4)容易将PAD图转化成高级程序语言源程序; 5)既可以表示程序逻辑也可以用于描绘数据结构;
6)PAD图的符号支持自顶向下、逐步求精方法的使用;
(注:掌握以上几种图形的绘制,以及各个图形的相互转化)
4、判定树&判定表(两者类似前者以二维表表示,后者用树形图表示)
一张判定表由四部分组成(左上部列出所有条件,左下部所有可能的动作,右上部表示各种条件组合,右下部是每种条件
组合相对应的动作)
例子:假设某航空公司规定,乘客可以免费托运30kg的行李,行李超过30kg时对头等舱的国内乘客超重部分每kg收费4元
其他仓的乘客超重部分每kg收费6元,对国外乘客超重部分收费为国内乘客的一倍;
动作1:免费; 动作2:4(x-30);动作3:6(x-30);动作4:8(x-30);动作5:12(x-30);
条件1:行李小于30kg;条件2:国内乘客;条件3:头等舱;
| 1 | 2 | 3 | 4 | 5 |
行李小于30kg | T | F | F | F | F |
国内乘客 | | T | T | F | F |
头等舱 | | T | F | T | F |
| |||||
免费 | X | | | | |
4(x-30) | | X | | | |
6(x-30) | | | X | | |
8(x-30) | | | | X | |
12(x-30) | | | | | X |
找出所有的可能条件与对应条件下的结果,画成二维表即可(判定树为判定表的变种本质意义相同);
判定树的优点:清晰的表现出复杂的条件组合与对应动作之间的关系,形式简单不需要进行任何说明;
面向数据结构的设计方法:Jackson方法和Warnier方法;
Jackson图:(具有顺序、选择、重复三种结构)
6.8为顺序结构,表示 A是由BCD顺序组成;6.9位选择结构与顺序结构画法一致但在子层有小圆圈加以标识;
6.10表示重复在B上用*加以标识;
改进的Jackson图(可以在图中表示选择条件和循环结束条件)
Jackson方法基本步骤:(5条)
1) 分析确定输入和输出数据的逻辑结构,并用Jackson图描绘这些数据结构;
2)找出输入数据结构和输出数据结构中有对应关系的逻辑单元;
3)描绘数据结构的Jackson图导出描绘程序结构的Jackson图;
4)列出所有操作和条件;
5)用伪代码表示程序;
程序复杂度的定量度量(重点)
McCabe方法:根据程序控制流的复杂度定量度量程序的复杂度,这样度量的结果称为环形复杂度;
在流图(退化了的程序流程图)中一个圆表示一条或多条语句。程序流程图中的一个顺序处理序列和一个菱形框可以映射成
流图中的一个点,流图中的箭头称之为边,它和程序流程图中的箭头类型类似,代表控制流。在流图中一条边必须终止与一个
点。由边和结点围成的面积称为区域,计算区域时还应计算外部未被围住的那一部分区域;(理解就行,会画流图)
环形复杂度的计算(计算题重点,要求三种都会)
1)流图中区域数等于环形复杂度; 2)流图中的边数减去点数加2,即V(G)=E-N+2;
3)判定结点数目加1,即P+1;
例子:
方法1:区域数有4个(包含最外层的区域),则环形复杂度为4
方法2:结点数9,边数11,则环形复杂度为11-9+2=4;
方法3:判定结点(出度大于入度点的个数)为1,2,4有3个,则环形复杂度为3+1;