一、结构化需求分析
在软件系统的需求工作中,通常面临三大挑战,即问题空间理解、人与人之间的通信、需求的变化性。为了应对这三大挑战,支持需求工作目标的实现,一种好的需求技术应具有以下基本特征:
① 提供方便的通信机制;
② 鼓励需求分析人员使用问题空间的术语思考问题,编写文档;
③ 提供定义系统边界的方法;
④ 提供支持抽象的基本机制;
⑤ 为需求分析人员提供多种可供选择的议案;
⑥ 提供特定的技术,适应需求的变化等。
典型的方法包括结构化方法、面向数据结构的软件开发方法以及近年来流行的面向对象方法等。
结构化方法是一种系统的软件开发方法,其中包括结构化分析方法、结构化设计方法以及结构化程序设计方法。
软件需求分析的目标是给出“系统必须做什么的一个估算”,即需求规格说明——以一种系统化的形式,准确地表达用户的需求,其中应不存在二义性和不一致性等问题。这样的需求需求规格说明可作为开发组织和客户关于“系统必须做什么”的一种契约,并作为以后开发工作的基础。
1、基本术语
(1) 数据流
在计算机软件领域中,把数据定义为客观事物的一种表示,而把信息定义为具有特定语义的数据。所以,数据是信息的载体。在结构化分析方法中,数据流是数据的流动。
(2) 加工
在结构化分析方法中,加工是数据的变换单元,即它接受输入的数据,对其进行处理,并产生输出。
既然加工是数据变换单元,因此它必须关联一个或多个输入/输出数据流,一个加工相关联的输入和输出数据,可进一步增强该加工的语义。有序的加工及相关的数据流形成系统的信息流。
(3) 数据存储
数据存储是数据的静态结构。
(4) 数据源和数据潭
数据源是数据流的起点;数据潭是数据流的归宿。数据源和数据潭是系统之外的实体,可以是人、物或其他软件系统。它们均用一个矩形来表示。
2、系统功能模型表示
需求分析的首要任务是建立系统功能模型,为此结构化分析方法给出了一种表达功能模型的工具,即数据流图,简称DFD图。
简单地说,DFD是一种描述数据变换的图形化工具,其中包含的元素可以是数据流,数据存储、加工、数据源和数据潭等。
在使用DFD图来表达系统功能模型时,应注意以下3个问题:
① 在DFD图中,数据流起到连接其他实体的作用;
② 加工之间可以有多个数据流,这些数据流之间可以没有任何直接关系,数据流图也不表明它们的先后次序;
③ 对于一个较大的软件系统,往往需要采用多层次的数据流图。
3、建模过程
(1) 建立系统环境图,确定系统语境
经过需求发现工作之后,分析人员一般可以比较容易地确定系统的数据源和数据潭,以及和这些数据源和数据潭相关的数据流,形成系统顶层数据流图,也称为系统环境图。
(2) 自顶向下,逐步求精,建立系统的层次数据流图
在顶层数据流图的基础上,按功能分解的设计思想,对加工进行分解,自顶向下的画各层设计流图,直到底层的加工足够简单,功能清晰易懂,不必再继续分解为止,并把这样的加工称为叶加工。
系统分层数据流图的层次编号是按顶层、0层、1层、2层…的次序编排的。顶层数据流图标出了系统的边界,0层数据流图是对顶层数据流图中包含的大加工的细化,1层数据流图又是对0层中加工的细化。为了方便,有时称这些图互为“父子”关系。
为了方便管理,从0层开始就要对数据流图以及其中的加工进行编号,并在整个系统中应是唯一的。编号的规则如下:
① 顶层数据流图以及其中唯一加工均不必编号;
② 由于0层通常只有一个子图,因此该子图的层号为0,而其中每一加工的编号分别为0.1,0.2,0.3…;
③ 以后各层,其子图层号为上一层(父层)的加工号;而该层中的加工编号为子图层号,后跟一个小数点,再加上该加工在子图中的顺序号,例如1.1,1.2,1.3…。
由“父图”生成“子图”的步骤如下:
① 将“父图”的每一加工按其功能分解为若干个子加工;
② 将“父图”的输入流和输出流“分派”到相关的子加工;
③ 在各加工之间建立合理的关联,必要时引入数据存储,使之形成一个有机的整体。
(3) 定义数据字典
它依据系统的数据流图,定义其中包含的所有数据流和数据存储的数据结构,直到给出构成以上数据的各数据项的基本数据类型。
数据是对客体的一种表示,所有客体均可用三种基本结构表示,这三种结构分别是顺序结构、选择结构和重复结构。它们的特点如下:
① 顺序结构
顺序结构是指数据A是由数据B和数据C顺序构成的,并记为“+”。例如:“学生成绩” 是由“学号”、“姓名”、“成绩”构成的,记为:学生成绩 = 学号 + 姓名 + 成绩,其中 = 表达的意思是“定义为”。
② 选择结构
选择结构是由数据A或是数据B或数据C定义的,并记为“|”。例如:“性别”是“男”或是“女”,记为:性别 = 男|女。
③ 重复结构
重复结构是指数据A是由多个重复出现的数据B构成的,并记为“{ }”。例如:“学生成绩表”是由多个“学生成绩”构成的,记为:学生成绩表 = {学生成绩}
在数据字典中,为了使定义的结构便于理解和阅读,一般按3种条目来组织,即数据流条目、数据存储条目和数据项条目。其中,数据流条目给出DFD图中所有数据流的结构定义;数据存储条目给出DFD图中所有数据存储的结构定义;数据项条目给出所有数据项的类型定义。
(4) 描述加工
它依据系统的数据流图,给出其中每一加工的小说明。由于需求分析的目的是定义问题,因此对DFD图中的每一加工只需给出加工的输入数据和输出数据之间的关系。对此可根据实际情况采取以下3种表达工具:
① 结构化自然语言
如果一个加工的输入数据和输出数据之间的逻辑关系比较简单,可以使用结构化自然语言予以表述。
② 判定表
如果一个加工的输入数据和输出数据之间比较复杂,可以采用一定的表达工具,例如判定表或判定树等,以避免产生不一致的理解。
一个判定表由4个区组成,Ⅰ区内列出所有的条件类别,Ⅱ区内列出所有的条件组合,Ⅲ区内列出所有的操作,Ⅳ区内列出在相应的组合条件下,某个操作是否执行或执行情况。示例图如下:
Ⅰ 条件类别 | Ⅱ 条件组合 |
Ⅲ 操作 | Ⅳ 操作执行 |
③ 判定树
判定树也是一种描述加工的工具。
4、应用中注意的问题
(1) 模型平衡问题
① 系统DFD中每个数据流和数据存储都要在数据字典中予以定义,并且数据名一致;
② 系统DFD中最底层的加工必须在小说明中予以描述,并且加工名一致;
③ 父图中的某加工的输入输出数据流和分解这个加工的子图的输入输出数据流必须保持一致,特别是保持顶层输入数据流和输出数据流在个数上、在标识上均是一样的;
④ 在加工小说明中,所使用的数据流必须是在数据字典中定义的,并且名字是一致的。
(2) 信息复杂性控制问题
① 上层数据流可以打包;
② 为了便于理解,一幅数据流图中的图元个数要控制在一定的数量以内;
③ 检查与每个加工相关的数据流,是否有太多的输入输出数据流,并寻找可降低该加工接口复杂性的、对数据流进行划分的方法;
④ 分析数据内容,确定是否所有的输入信息都用于产生输出信息。
5、需求验证
需求验证应验证需求规格说明书中的每一单一需求是否满足5个性质,即必要性、无歧义性、可测性、可跟踪性、可测量性;验证需求规格说明是否满足4个性质,即重要性和稳定性程序、可修改性、完整性和一致性。
二、结构化设计
结构化设计的主要任务是在需求分析的基础上,定义满足需求所需要的结构,即针对给定的问题,给出该问题的软件解决方案。其中,结构化设计又进一步细分为总体设计和详细设计。
1、总体设计
(1) 总体设计的目标及表示
总体设计阶段的基本任务是把系统的功能需求分配到一个特定的软件体系结构中。表达这一软件体系结构的工具有以下几种:
① Yourdon提出的模块结构图
模块结构图是一种描述软件宏观结构的图形化工具。在结构图中每个方框代表一个模块,框内注明模块的名字或主要功能。连接上下层模块的线段表示他们之间的调用关系。带注释的箭头表示模块调用过程中传递的信息。处于较高层次的是控制模块,它们的功能相对复杂而且抽象;处于较低层次的是从属模块,它们的功能相对简单而且具体。依据控制模块的内部逻辑,一个控制模块可以调用一个或多个下属模块;同时,一个下属模块也可以被多个控制模块所调用,即尽可能的复用已经设计出的低层模块。
② 层次图
层次图主要用于描绘软件的层次结构。在层次图中,每个方框代表一个模块,方框间的连线表示模块的调用关系。层次图适合自顶向下设计软件的过程中使用。
③ HIPO图
实际上,HIPO图是由H图(层次图)和IPO图两部分组成的。为了使用HIPO图具有可跟踪性,除最顶层的方框外,为每个方框都加了编号。对H图中的每个方框,应有一张IPO图,用于描述这个方框所代表的模块的处理逻辑。IPO图的基本形式是在左边的输入框中列出有关的输入数据,在中间的处理框中列出主要的处理以及处理次序,在右边的输出框中列出产生的输出数据。另外,还用类似向量符号(箭头线)清楚地指出数据通信的情况。
(2) 总体设计步骤
总体设计的基本步骤是,首先将系统的DFD图转化为初始的模块结构图,再基于“高内聚低耦合”这一软件设计原则,通过模块化,将初始的模块结构图转化为最终的、可供详细设计使用的模块结构图(MSD)。
待建的数据流图一般可以分成两类,即变换型数据流图和事务型数据流图。
① 变换型数据流图
具有较明显的输入部分和变换部分之间的界面、变换部分和输出部分之间界面的数据流图,称为变换型数据流图。左边的虚线是输入和变换之间的界面,右边的虚线是变换与输出之间的界面。左边虚线处的输入称为逻辑输入,右边虚线处的输出称为逻辑输出。最开始的输入称为物理输入,最终结束的输出称为物理输出。
DFD图所对应的系统,在高层次上来来讲由3个部分组成,即处理输入数据的部分、数据变换部分以及处理数据输出部分。那么数据处理工作也分为3个部分,即获取数据、变换数据、输出数据。
② 事务型数据流图
当数据到达一个加工T,该加工T根据输入数据的值,在其后的若干动作序列(事务)中选出一个来执行,这类数据流图称为事务型数据流图。
加工T完成的任务有:接收输入数据、分析并确定对应的事务、选取与该事务对应的一条活动路径。
事务型数据流图所描述系统的数据处理模式为“集中——发散”式。其中,每一路径完成一项事务处理并且一般可能还要调用若干个操作模块。而这些模块又可以共享一些细节模块。因此,事务型数据流图可以具有多种形式的软件结构。
结构化设计方法基于“自顶向下,功能分解”的基本原则,针对两种不同类型的数据流图,分别提出了变换设计和事务设计。其中,变换设计的目标是将变换型数据流图映射为模块结构图,而事务设计的目标是将事务型数据流图映射为模块结构图。
总体设计分为3个阶段。第一阶段为初始设计,在对给定的数据流图进行复审和精华的基础上,将其转换为初始的模块结构图。第二阶段为精化设计,依据模块“高内聚,低耦合”的原则,精化初始的模块结构图,并设计其中的全局数据结构和每一模块的接口。第三阶段为复审阶段,对前两个阶段所得到的高层软件结构进行复审,必要时还可能需要以该软件结构做一些精化工作。
在实践中,一个大型的软件系统一般是变换型流图和事务型流图的混合结构。在软件总体设计中,通常以变换设计为主,事务设计为辅进行结构设计。即首先利用变换设计,把软件系统分为输入、中心变换和输出3个部分,设计上层模块,然后根据各部分数据流图的结构特点,适当地利用变换设计和事务设计进行细化,得到初始的模块结构图,再按照“高内聚低耦合”的原则,对初始的模块结构图进行精化,得到最终的模块结构图。
(3) 模块化以及启发式规则
① 模块化
模块是执行一个特殊任务的一个过程以及相关的数据结构。模块通常由接口和模块体(接口的实现)组成。
结构化设计方法是一种典型的模块化方法,即把一个待开发的软件分解成若干简单的、具有高内聚低耦合的模块,这一过程称为模块化。
⒈ 耦合
耦合是指不同模块之间相互依赖程序的度量。耦合的产生主要基于以下几个因素:
● 一个模块对另一个模块的引用;
● 一个模块向另一个模块传递数据;
● 一个模块对另一个模块施加控制。
常见的模块耦合类型有:内容耦合、公共耦合、控制耦合、标记耦合、数据耦合。
⒉ 内聚
内聚是指一个模块内部各部分之间相互关联程度的度量。
常见的模块内聚类型有:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚。
② 启发式规则
从实践中总结的一些启发式规则有:
● 改进软件结构,提高模块独立性
● 力求模块规模适中
● 力求深度、宽度、扇出(需要控制和协调的下级模块数量)和扇入(直接调用它的上级模块的数量)适中
● 尽力使用模块的作用域在其控制域之内
● 尽力降低模块接口的复杂度
● 力求模块功能可以预测
2、详细设计
通过详细设计,具体描述模块结构图中的每一模块,即给出实现模块功能的实施机制,包括一组例程和数据结构,从而精确地定义了满足需求所规约的结构。详细设计的目标是将总体设计阶段所产生的系统高层结构映射为以这些术语所表达的低层结构,也是系统的最终结构。
(1) 结构化程序设计
结构化程序设计方法是一种基于结构的编程方法,即采用顺序结构、选择结构以及重复结构进行编程,其中每一结构只允许一个入口和一个出口。它的本质是使程序的控制流程线性化,实现程序的动态执行顺序符合静态书写的结构,从而增强程序的可读性,有利于理解、测试和排错。
(2) 详细设计工具
详细设计工具通常分为图形、表格和语言3种。
① 程序流程图
程序流程图又称为程序框图。在程序流程图中,使用的主要符号包括顺序结构、选择结构和循环结构。它的主要优点是对控制流程的描绘很直观,便于初学者掌握。但它也有很多缺点,比如:
● 它诱使程序员过早的考虑程序的控制流程,而不去考虑程序的全局结构;
● 它所表达的控制流,往往不受任何约束可随意转移,从而会影响甚至破坏好的系统结构;
● 它不易表示数据结构。
② 盒图(N-S图)
采用盒图进行设计时,首先给出一个大的矩形,然后为了实现该模块的功能,再将该矩形分成若干个不同的部分,分别表示不同的子处理过程,这些子处理过程又可以进一步分解成更小的部分,其中每次分解都只能使用给定的基本符号,最终形成表达该模块的设计。
③ PAD图
PAD图采用二维树形结构来表示程序的控制流。采用PSD图设计的模块一定是结构化的,并且所描述的程序结构也是十分清晰的。左边的竖线是程序的主线,是第一层控制结构,随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线,竖线的条数总是程序的控制层次数,从而使PAD图表现出的处理逻辑易读、易懂、易记。
④ 类程序设计语言(PDL)
PDL也称为伪码,它不仅可以作为一种设计工具,还可以作为注释工具直接插在源程序中,以保持文档和程序的一致性,提高了文档的质量,可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作,已经存在的一些PDL处理工具,可以自动由PDL生成程序代码。
PDL的缺点是水如图形工具那样形象直观,并且当描述复杂的条件组合与动作间的对应关系时,不如判定表或判定树那样清晰直观。
(3) 设计规约
设计规约通常包括概要设计规约和详细设计规约,它们是相应设计过程的输出文档。
概要设计规约指明高层软件体系结构,它的的主要内容包括:系统环境、软件模块的结构、模块描述、文件结构和全局数据文件的逻辑结构、测试需求等。
详细设计规约是对软件各部分属性的描述,它的主要内容包括:各处理过程的算法、算法所涉及的全部数据结构的描述。