第四章 面向过程的软件设计方法
主要内容:
软件设计的目标和任务
软件设计基础
模块独立性
机构化设计方法
数据设计和文件设计
过程设计
软件设计的目标和任务
根据用信息域表示的软件需求,以及功能和性能需求,进行数据设计,系统结构设计,过程设计。
软件设计任务:从工程管理的角度来看,软件设计分为两步完成:概要设计,详细设计。
软件设计过程
1、 制定规范
2、 软件系统结构的总体设计
3、 处理方式设计
4、 数据结构设计
5、 可靠性设计
6、 编写概要设计阶段的文档
7、 概要设计评审
软件设计基础
1、 自顶向下,逐步细化(将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化。)
2、 软件结构(软件结构包括两部分:程序的模块结构和数据的结构。)
3、 程序结构(树状结构,网状结构)
4、 结构图(结构图反映程序中模块之间的层次调用关系和联系)
5、 模块化(能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构。)
6、 抽象化(软件系统进行模块设计时,可有不同的抽象层次。数据抽象:在不同层次上描述数据对象的细节,定义与该数据对象相关的操作。)
7、 信息屏蔽
模块(Module)的独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能。
Module一般具有如下三个基本属性:功能(描述该模块实现什么功能)
逻辑(描述模块内部怎么做)
状态(该模块使用时的环境和条件)
一般采用两个准则度量模块独立性。即:模块间耦合和模块内聚。
耦合(coupling):概括的说是指两个或两个以上的实体相互依赖于对方的一个量度。
非直接耦合(Nondirect Coupling)
如果两个模块之间没有直接关系,这就是非直接耦合。
数据耦合(Data Coupling)如果一个模块访问另一个模块时,彼此之间是通过简单数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。
标记耦合(Stamp Coupling)如果一组模块通过参数表传递记录信息,就是标记耦合。
控制耦合(Control Coupling)如果一个模块通过传送开关、标志、名字等控制信息,明显的控制选择另一模块的功能,就是控制耦合。
外部耦合(External Coupling)一组模块都访问统一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
公共耦合(Common Coupling)
若一组模块都访问一个公共数据环境,则他们之间的耦合就称为公共耦合。(公共耦合有两种情况:松散共耦合和紧密公共耦合)
内部耦合(Content Coupling)
内聚(Cohesion)是一个模块内部各成分之间相关联程度的度量。
功能内聚(Functional Cohesion)一个模块中各个部分都是完成某一具体动能必不可少的组成部分,是不可分割的。
信息内聚(Informational Cohesion)这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点。
通信内聚(Communication Cohesion)如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。
过程内聚(Procedural Cohesion)使用流程图作为工具设计程序时,把流程图中的某一部分划分组成模块,就得到过程内聚模块。
时间内聚(Classical Cohesion)时间内聚模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。
逻辑内聚(Logical Cohesion)这种模块把几种相关的功能组合在一起。
巧合内聚(Coincidental Cohesion)巧合内聚模块各部分之间没有联系,或者即使有联系,这种联系也很松散。
结构化设计方法
首先研究、分析和审查数据流图。
然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务性。
针对两种不同的类型分别进行分析处理。
在系统结构图中的模块
传入模块,传出模块,变换模块,协调模块
变换型系统结构图
变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。
事务型系统结构图
它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。
变换分析
变换分析方法由以下四步组成:
重画数据流图;
区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分;
进行一级分解,设计上层模块;
进行二级分解,设计输入、输出和中心变换部分的中、下层模块。
1、 在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成。
2、 在设计下层模块时,应考虑模块的耦合和内聚问题。
3、 使用“黑箱”技术:在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”。
4、 在模块划分时,一个模块的直接下属模块一般在5个左右。
5、 如果出现了一下情况,就停止模块的功能分解:当模块不能再细分为明显的子任务时;当分解成用户提供的模块或程序库的子程序时;当模块的界面是输入/输出设备传送的信息时;当模块不宜再分解时。
事务分析
与变换分析一样,事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图。
事务分析过程
1、 识别事务源
2、 规定适当的事务型结构
3、 识别各种事务和它们定义的操作
4、 注意利用公共模块
5、 对每一事务,或对联系密切的一组事务,建立一个事务处理模块
6、 对事物处理模块规定它们全部的下层操作模块。
7、 对操作模块规定它们的全部细节模块
软件模块结构的改进
1、 模块功能的完善化
一个完整的模块应当有以下几部分:
a/执行规定的功能的部分;
b/出错处理的部分。
c/给它的调用者返回一个结束状态标志。
2、 消除重复功能,改善软件结构、
a/完全相似
b/局部相似
模块的作用范围应在控制范围之内
模块的控制范围包括它本身及其所有的从属模块。
模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围。
尽可能减少高扇出结构,随着深度增大扇入。
避免或减少使用病态联接
应限制使用如下三种病态联接:
①直接病态联接
②公共数据域病态联接
③通信模块联接
模块的大小要适中
通常规定其语句行数在50—100左右,保持在一页纸之内,最多不超过500行。
设计功能可预测的模块,但要避免过分受限制的模块。
软件包应满足设计约束和可移植性
设计后的处理
为每一个模块写一份处理说明
为每一个模块提供一份接口说明
确定全局数据结构和局部数据结构
指出所有的设计约束和限制
进行概要设计的评审
数据设计及文件设计
数据设计原则
1、 用于软件的系统方法也适用于数据。
2、 确定所有的数据结构和在每种数据结构上施加的操作。
3、 应当建立一个数据词典并用它来定义数据和软件的设计。
4、 低层数据设计的决策应推迟到设计过程的后期进行。
5、 数据结构的表示只限于那些必须直接使用该数据结构内数据的模块才能知道。
6、 应当建立一个存放有效数据结构及相关操作的库。
7、 软件设计的程序设计语言应当支持抽象数据类型的定义和实现。
以上原则适用于软件工程的定义阶段和开发阶段。
文件设计
文件设计的过程,主要分两个阶段。第一个阶段是文件的逻辑设计,主要在概要设计阶段实施。
1) 整理必须的数据元素
2) 分析数据见的关系
3) 确定文件的逻辑设计
4) 理解文件的特性
5) 确定文件的组织方式:1、顺序文件;2、直接存取文件
6) 确定文件的存储介质
7) 确定文件的记录格式
8) 估算存取时间和存储容量
索引顺序文件:
其基本数据记录按顺序文件组织,记录排列顺序必须按关键字值升序或降序安排,且具有索引部分,也按同一关键字进行索引。
分区文件:
这类文件主要用于存放程序。
虚拟存储文件:
这是基于操作系统的请求页式存储管理功能而建立的索引顺序文件。
倒排文件:
按候选属性建立索引表。
过程设计(详细设计)
从软件开发的工程化观点来看,在使用程序设计语言编制程序以前,需要对所采用算法的逻辑关系进行分析,设计出全部必要的过程细节,并给予清晰地表达。这就是过程设计的任务。
在过程设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做详细设计工具,它可以分为以下三类:图形工具,表格工具,语言工具
N-S图
N-S图也叫盒图,五种基本控制结构由五种图形构件表示。
问题分析图(PAD)
PAD也设置了五种基本控制结构的图式,并允许递归使用。
判定表
判定表用于表示程序的静态逻辑
在判定表中的条件部分给出所有的两分支判断的列表,动作部分给出相应的处理
要求将程序流程图中的多分支判断都改成两分支判断
建立判定表的步骤
列出与一个具体过程(或模块)有关的所有处理
列出过程执行期间的所有条件(或所有的判断)。
将特定条件取值组合与特定的处理相匹配,消去不可能发生的条件取值组合。
将右部每一纵列规定为一个处理规则,即对于每一条件取值组合将有什么动作。
PDL(Program Design Language)
PDL是一种用于描述功能模块的算法设计和加工细节的语言。称为设计程序用语言。它是一种伪码。
PDL具有严格的关键字外语法,用于定义控制结构和数据结构,同时它的表示实际操作和条件的内语法又是灵活自由的,可使用自然语言的词汇。
PDL的特点:
提供全部结构化控制结构、数据说明和模块特征,能对PDL正文进行结构分割,使之变得易于理解。
为了区别关键字,规定关键字一律大写,其他单词一律小写。或者规定关键字加下划线,或者规定它们为黑体字。