860 likes | 993 Views
结构化设计方法. 王林章 软件工程组 南京大学计算机科学与技术系 lzwang@nju.edu.cn http://sec.nju.edu.cn/. 定义. 分析. 设计. 编码. 测试. 维护. 经典软件工程方法. 问题定义 需求分析 概要设计 详细设计 编 码 测 试 维 护. 结构化设计. 概要设计 详细设计. 概要设计. 关于软件设计. 软件设计是把软件需求变为软件的具体方案 软件设计包括两个阶段: 概要设计 和 详细设计
E N D
结构化设计方法 王林章 软件工程组 南京大学计算机科学与技术系 lzwang@nju.edu.cn http://sec.nju.edu.cn/
定义 分析 设计 编码 测试 维护 经典软件工程方法 • 问题定义 • 需求分析 • 概要设计 • 详细设计 • 编 码 • 测 试 • 维 护
结构化设计 • 概要设计 • 详细设计
概要设计 • 关于软件设计 • 软件设计是把软件需求变为软件的具体方案 • 软件设计包括两个阶段:概要设计和详细设计 • 概要设计根据软件需求所确定的信息流程或信息结构,导出软件的总体表示----软件结构或程序过程
概要设计 1、软件结构 • 软件结构概念 • 软件结构是一种层次化的表示,其指出了由需求分析隐含地确定的某一问题的软件解法的各个元素(称之为模块)之间的相互控制关系 • 软件结构的演变从确定问题开始,当该问题的每个部分用一个或多个软件加以解决以后,整个问题的解也就有了
P3 S1 S2 P1 P2 S3 P4 P5 S4 S5 概要设计
概要设计 • 软件结构的度量和术语 • 深度:表示控制的层数。 • 宽度:表示控制(同一层次)总跨度。 • 扇出数:指由一模块直接控制的其他模块的数目。 • 扇入数:指有多少个模块直接控制一个给定的模块。 • 上级模块 • 下级模块
概要设计 2、程序过程 • 程序过程是用于描述每个模块的操作细节,是关于模块算法的详细描述,它应当包括处理的顺序、精确的判定位置、重复的操作以及数据组织和结构等。
概要设计 3、模块 模块是数据说明、可执行语句等程序对象的集合,是单独命名的并且可以通过名字来访问,例如过程、函数、子程序、宏、modula等。
概要设计 4、模块化 • 软件被划分成独立命名和可独立访问的被称作模块的构件,每个模块完成一个子功能,它们集成到一起满足问题需求。
概要设计 • 模块化论据 • C(x)定义为问题x的感知复杂性 • E(x)定义为解决问题x所需要的工作量 • 对p1和p2两个问题, • 若 C(p1) > C(p2),则 E(p1) > E(p2) • C(p1 + p2) > C(p1) + C(p2) • E(p1 + p2) > E(p1) + E(p2)
软件总成本 最小成本区域 集成成本 M 成本或工作量 成本/模块 模块数量 概要设计
概要设计 • 实现模块化的手段 • 抽象:抽出事物的本质特性而暂时不考虑它们的细节。 • 信息隐蔽:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不可访问的。
概要设计 • 模块独立性 • 模块独立性:模块独立是指开发具有独立功能而且和其它模块之间没有过多的相互作用的模块。 • 模块独立的意义: 功能分割,简化接口,易于多人合作开发同一软件; 独立的模块易于测试和维护。
概要设计 • 模块独立程度的衡量标准 • 耦合性:对一个软件结构内不同模块间互连程度的度量。 • 内聚性:标志一个模块内各个处理元素彼此结合的紧密程度,理想的内聚模块只做一件事情。
概要设计 • 耦合分类 • 无任何连接:两个模块中的每一个都能独立地工作而不需要另一个的存在(最低耦合)。 • 数据耦合:两个模块彼此通过参数交换信息,且交换的仅仅是数据(低耦合)。 • 控制耦合:两个模块之间传递的信息有控制成分(中耦合)。
概要设计 • 公共环境耦合:两个或多个模块通过一个公共环境相互作用: 1、一个存数据,一个取数据(低耦合); 2、都存取数据(低--中之间)。 • 内容耦合: 1、一个模块访问另一个模块的内部数据; 2、两个模块有一部分程序代码重叠; 3、一个模块不通过正常入口而转移的另一个的内部; 4、一个模块有多个入口(意味着该模块有多个功能)。
概要设计 • 内聚分类 • 偶然内聚:一组任务关系松散(低) • 逻辑内聚:一组任务在逻辑上同属一类,例如均为输出(低) • 时间内聚:一组任务必须在同一段时间内执行(低) • 信息内聚:模块内所有元素都引用相同的输入或输出数据集合(中) • 顺序内聚:模块中的每个元素都是与同一功能紧密相关,一个元素的输出是下一个元素的输入(高) • 功能内聚:一个模块完成一个且仅完成一个功能(高)
概要设计 • 关于耦合性和内聚性的设计原则 • 力争尽可能弱的耦合性:尽量使用数据耦合,少用控制耦合,限制公共环境耦合的范围,完全不用内容耦合 • 力争尽可能高的内聚性:力争尽可能高的内聚性,并能识别出低内聚性
概要设计 5、概要设计的启发式准则 • 改进软件结构,提高模块独立性 • 模块规模应该适中(最好能写在一页纸上) • 大模块分解不充分;小模块使用开销大,接口复杂。 • 尽量减少高扇出结构的数目,随着深度的增加争取更多的扇入 • 扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块。一般来说,顶层扇出高,中间扇出少,低层高扇入。
概要设计 • 模块的作用范围保持在该模块的控制范围内 模块的作用范围是指该模块中一个判断所影响的所有其它模块;模块的控制范围指该模块本身以及所有直接或间接从属于它的模块。 • 力争降低模块接口的复杂程度 模块接口的复杂性是引起软件错误的一个主要原因。接口设计应该使得信息传递简单并且与模块的功能一致。
概要设计 • 设计单入口单出口的模块 避免内容耦合,易于理解和维护。 • 模块的功能应该可以预测 相同的输入应该有相同的输出,否则难以理解、测试和维护。
概要设计 6、设计方法 • 结构化程序设计(Dijkstra) • 结构化程序设计的基础建立在三种能够构成结构化程序的逻辑构造(顺序,选择,重复)上。 • 面向数据的设计方法 • 面向数据流的设计 • 面向数据结构的设计 • 面向对象的设计方法
概要设计 • 面向数据流的设计 • 面向数据流的设计方法把信息流映射成软件结构 • 信息流的类型决定了映射的方法 • 信息流有两种类型:变换流、事务流
概要设计 变换流 信息沿输入通路进入系统,同时由外部形式变换成内部形式。进入系统的信息通过变换中心,经过加工处理以后再沿着输出通路变换成外部形式离开系统。
外部表示 输入流 输出流 变换中心 信息 内部表示 时间 概要设计
概要设计 事务流 事务流的特点是数据沿着接收通路把外部世界的信息转换成一个事务项,然后,计算该事务项的值,根据它的值激励起多条活动通路中的一条数据流。发出多条通路的信息流中枢被称为“事务中心”。
事务 T 事务中心 活动通路 概要设计
概要设计 变换型分析 • 第1步 复查基本系统模型。 • 第2步 复查并精化数据流图。 • 第3步 确定数据流图具有变换特性还是事务特性。 • 第4步 确定输入流和输出流的边界,从而孤立出变 换中心。
概要设计 • 第5步 完成“第一级分解”。 • 软件结构代表对控制的自顶向下的分配,所谓分解就是分配控制的过程。 • 对于变换流,数据图将被映射成一个特殊的软件结构,这个结构控制输入、变换和输出信息等处理过程:位于软件结构最顶层的控制模块Cm协调下述从属的控制功能: • (1)输入信息处理控制模块Ca,协调对所有输入数据的接收; • (2)变换中心控制模块Ct,管理对内部形式的数据的所有操作; • (3)输出信息控制模块Ce,协调输出信息的产生过程。
Cm Ca Ct Ce
概要设计 • 第6步 完成“第二级分解”。 把数据流图中的每一个处理映射成软件结构中一个适当的模块:从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受Ce控制的一个低层模块;最后把变换中心内的每个处理映射成受Ct控制的一个模块。 • 第7步 使用设计度量和启发式规则对得到的软件结构进一步精化。
Cm D C A Ca B C B D A 概要设计
概要设计 事务型分析 • 第1步 复查基本系统模型。 • 第2步 复查并精化数据流图。 • 第3步 确定数据流图具有变换特性还是事务特性。 • 第4步 确定事务中心和每个活动通路的流程特征。
概要设计 • 第5步 把数据流图映射成一个适合于事务处理的软件结构。 • 第6步 对事务中心的结构和每个活动通路的结构进行分解、合并和改进。 • 第7步 使用设计度量和启发式规则对得到的软件结构进一步精化。
接收通路 总控 调度 A-CTL B-CTL C-CTL D E D E F F B通路 G G A通路 概要设计 C通路
概要设计 • 面向数据结构的设计: • 面向数据结构的设计方法用信息结构导出程序过程 • 面向数据结构的设计过程分为如下几步: • (1)分析数据结构的特性; • (2)用一些基本类型(如:顺序,选择和重复)来描述数据; • (3)把数据结构表示映射成软件的控制层次; • (4)利用一组规则改进软件的层次结构; • (5)最后得到软件的过程性描述。
概要设计 Jackson方法 • Jackson方法的精髓在于:应该把问题分解成仅用三种结构化形式(顺序,选择和重复)来表示的层次结构。 • Jackson方法包括一种数据结构符号和一组映射或转换步骤。
顺序 重复 选择 A A A B C D B* B# C# D# 概要设计 • Jackson图(数据结构符号): A select do B; A or do C; A or do D; A end A seq do B; do C; do D; A end A iter do B; A end
概要设计 • Jackson图的特点: • 便于表示层次结构,而且是对结构进行自顶向下分解的有力工具; • 形象直观,可读性好; • 既能表示数据结构,又能表示程序结构。
姓名 年龄 类别 状态 概要设计 • 建立程序结构 例1:设计一个打印表格的程序。表格如下: 这里类别可以是“教师”或“学生”两种。“状态”一项,如果 是教师则印出他的“工龄”,如果是学生则印出他的年级。
表格 表头 表体 行* 姓名 年龄 类别 状态 工龄# 年级# 概要设计
产生表格 产生表头 产生表体 产生行* 产生姓名 产生类别 产生状态 产生年龄 产生工龄# 产生年级# 概要设计
概要设计 例2:仓库中存放了多种零件,每种零件的每次变动(收到或发出)都有一张卡片作出记录,库存管理系统每月要根据这些卡片打印一张月报表,列出各种零件在这个月中库存量的净变化。
月报表 输入文件 零件组* 表头 表体 卡片* 行* 发# 收# 概要设计
概要设计 根据输入文件产生月报表 产生表头 产生表体 从零件组产生行* 处理文件 产生行 处理卡片* 处理发# 处理收#
概要设计 • Jackson方法的基本步骤: (1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描述这些数据结构; (2)找出输入数据和输出数据结构中有对应关系的数据单元。所谓对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元必须重复的次数相同才可能有对应关系);
概要设计 (3)用下述三条规则从描述数据结构的Jackson图导出描述程序结构的Jackson图: 第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,若这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应); 第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图中的相应层次分别为它们画上对应的处理框; 第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图中的相应层次分别为它们画上对应的处理框。
概要设计 (4)列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。 (5)用伪码表示程序。
概要设计 例:输入一个文件FIPT,此文件只包含三种记录类型T1、T2和T3,现在要对该文件作如下处理: (1)统计出现的第一个T1类型的记录前的记录总数(计数A); (2)显示第一个T1类型的记录; (3)显示最后一个记录,最后一个记录是在第一个T1类型的记录后的 第一个T2类型的记录; (4)计算第一个T1类型的记录后的记录批数(一批记录指一串连续的 T1类型的记录或一串连续的T3类型的记录((计数B); (5)统计在第一个T1类型的记录后出现的T1类型记录的总数(计数C); (6)计算在第一个T1类型的记录后的T3类型记录的批数(计数D)。