第3章结构化开发方法结构化开发方法20世纪70年代发展起来的最早的开发方法典型的结构化开发方法美国的Coad/Yourdon的面向数据流的开发方法欧洲的Jackson/Warnier-Orr的面向数据结构的开发方法日本小村良彦的PAD(问题分析图)开发方法本章内容安排需求与需求分析结构化分析软件设计面向数据流的设计面向数据结构的设计PAD图的设计原型开发需求与需求分析需求分析的意义完全弄清用户软件需求是任何一项软件开发工作成功的前提和基础需求分析的作用是系统层软件配置与软件设计之间的桥梁能够刻画软件的功能和性能确定软件与其他系统元素(硬/软件和人)的接口建立软件必须满足的约束需求分析的产品为软件设计提供可用的数据、体系结构、人-机界面和过程设计模型为开发者和用户提供对软件质量进行最后验收的准则分析过程软件需求分析过程1.问题识别2.评价和综合3.建模4.规格说明5.评审1.问题识别问题识别(ProblemRecognition)研究系统规格说明和软件项目计划必须为分析建立各种沟通(communication)关系目标是弄清用户已经理解的基本问题元素2.评价和综合评价和综合(EvaluationandSynthesis)必须评价信息流和信息内容定义和详细描述全部软件功能熟悉影响系统事件前后关系的软件行为建立系统界面的特征揭示设计限制综合出一个或多个解3.建模(Modeling)系统建立模型的目的主要是说明系统必须做什么,而不是怎么做建模的方法问题域划分-必须把大且复杂的问题划分为小且较简单的问题划分的方法-可以按垂直方向对功能逐层细化或按水平方向对功能进行分解,也可两者兼有软件需求是给出要完成的功能和处理信息上,而不应该把实现观点作为给出要完成功能和要处理数据的出发点模型的表达式(representation)图形表格专用语言和自然语言模型的重要作用用辅助分析员更好地了解系统的信息、功能和行为,从而使分析更容易和更系统化是评审系统完整性、一致性和规格说明准确性的关键元素是设计的基础,能给设计人员提供一种软件的基本表达式,它可以影射为实现文档4.规格说明(Specification)Balyer和Goldman提出了获得良好的规格说明的8条原则(1)从现实中抽象功能性(2)要求一个面向过程的系统规格说明的语言(3)必须围绕整个系统,而软件只是它的一个部分(4)必须围绕系统的操作环境(5)必须是一个可以认知的模型(6)必须是可操作的(7)必须允许它是不完整的和可扩展的(8)必须是局部化和松散耦合的软件需求规格说明软件需求规格说明是在对用户需求分析的基础上,把用户的需求规范化、形式化而写成的,其目的:为软件开发提出总体要求作为用户和开发人员之间相互了解和共同开发的基础具有合同的性质初步用户手册初步用户手册作为软件需求规格说明的附件这是为了使开发人员与用户之间更好的沟通必须开发的。其重点放在用户的功能和I/O上,主要用来发现系统功能和人-机界面上存在的各种问题一软件需求规格说明(GB8567-88)1.引言1.1编写说明1.2背景1.3定义1.4参考资料2.任务概述2.1目标2.2用户的特点2.3假定与约束3.需求规定3.1对功能的规定3.2对性能的规定3.2.1精度3.2.2时间特性要求3.2.3灵活性3.3I/O需求3.4数据管理能力要求3.5故障处理要求3.6其它专门需求4.运行环境规定5.评审软件需求规格说明的评审是由软件开发者和用户共同完成在宏观高层上评审者要保证规格说明的完整、一致和准确,评审时需要考虑14个方面的问题(教材36~37页)在详细低层上为了得到对上述各种问题的回答。评审者可以集中在规格说明的用词上,这样做能够发现隐藏在规格说明内容中的问题。详细评审建议大纲可以从10个方面的用词考虑(教材37页)评审一旦完成,用户和开发者要双方签字,成为软件开发的合同原型开发是解决软件需求规格说明确定中各种问题的可选方法分析员有许多叫法系统分析员、系统工程师、程序员、分析员分析员必须具备的条件有掌握抽象概念,并能把其整理为逻辑划分和根据每一个逻辑划分综合为解的能力有从冲突或混惑中吸取恰当事实的能力有弄清用户环境的能力有把硬件和软件系统用于用户环境的能力有较好的用书面和口头形式进行沟通的能力有“从树木见森林”的能力。这是区分一位真正杰出的分析员与一般分析员的标准。只有懂得软件工程的分析员才做一能做到这一点结构化分析(structuredanalysis,SA)是一种信息流内容和结构的建模技术是基于计算机系统的一种信息变换DFD基本符号实例:一个简化的机票销售系统需求售票员根据旅客需要的航班,首先查询有无该航班机票。若有,则负责录入旅客的基本信息(姓名、身份证号码、航班号、票价和到达港);保险公司的服务员负责录入保险金额;售票部经理可随时查询每一个航班的售票情况(航班号、售出机票的数量及营业额),并在当日结算时能计算出日营业额给出该系统的DFD和DDDFD(DataFlowDiagram)本系统DFD(一种方案)顶层DFD(0层)二层DFD(1层)三层DFD-1(2层-1)三层DFD-2(2层-2)顶层DFD(0层)售票员服务员0机票销售系统旅客基本信息有/无保险级别经理各航班售票信息日营业额二层DFD(1层)1查询和录入2统计和计算旅客基本信息有/无保险级别机票基本信息旅客基本信息保险金额各航班售票信息日营业额三层DFD-1(2层-1)旅客基本信息有/无保险级别1.1查询机票有/无1.2更新销售信息1.3录入旅客基本信息1.4录入保险金额机票基本信息旅客基本信息保险金额三层DFD-2(2层-2)机票销售信息2.1统计各航班售票信息2.2格式化2.3计算日营业额2.4格式化各航班售票信息计算结果各航班信息报表日营业额报表DD(DataDictionary)本系统DD(一种方案)文件(File)数据流(DataFlow)数据项(DataItem)最小处理(MinimumProcess)这里只给出一个简化了的机票销售系统DFD图中的部分条目定义。在实际应用中,应给出全部必须说明条目的定义数据字典-文件1.文件1)文件名:旅客基本信息组成:{姓名+身份证号码+航班号+票价+到达港+保险金额}组织:按售票先后顺序2)文件名:机票销售信息组成:{航班号+座位数+售出机票数}组织:按航班号、离港时间的先后顺序排序数据字典-数据流2.数据流1)数据流名:旅客基本信息组成:{姓名+身份证号码+航班号+票价+到达港+保险金额}2)数据流名:各航班售票信息组成:{航班号+座位数+售出机票数}数据字典-数据项3.数据项1)数据项名:姓名值:字符串2)数据项名:身份证值:1-17位为数字,18位为校验位,值为0-9、X3)数据项名:航班号值:前两位为汉语拼音字母+后四位方数字4)数据项名:保险金额值:﹝20|40|60|…|200﹞数据字典-最小处理4.处理名1)处理名:录入保险金额编号:1.4输入:保险级别输出:保险金额过程:保险服务员根据每位旅客的要求,输入保险级别,系统按照保险金额规定的标准,录入旅客保险金额触发条件:接到服务员输入旅客姓名和保险金额级别DFD图中信息流的细化分析方法-DFD分解规则在求解DFD的过程中应有以下规则0层数据流图,应当把系统或软件作为一个单一的圆圈来描绘应当格外注意原始输入和原始输出过程的下层细化,一般应控制在3-4个分过程,最多不应超过7个过程(圆圈)和数据流(箭头)应用有意义的名称标注。在同一DFD中,一个名称标注只能出现一次分析方法-DFD分解规则(续)必须保持层到层之间I/O信息流的连续性最好一次只对一个过程细化;一个过程的细化,一般应细化到最小处理为止一个系统给出DFD的同时,还应开发一个与之对应的DD在开发DFD和DD中,有时还需要给出辅助说明软件设计是软件工程过程的技术核心是一个把软件需求转换为软件表达式的过程首先,这种表达式只描绘一个软件的概貌然后,将其细化为一个非常接近于源代码的设计表达式是决定软件质量的重要步骤,它给我们提供了可以进行质量评价的软件表达式软件设计的发展是一个持续的过程早期着重于开发模块化所需要的准则,以及按自顶向下的方式逐步细化软件体系结构接着设计定义的过程逐渐发展成结构化编程原则之后提出了把数据流和数据结构翻译为设计定义的方法近年则建议采用OO设计方法和形式化方法软件设计准则为了评价设计表达式的质量,必须建立良好的设计准则:有分层的组织结构应模块化(软件应被逻辑地划分为能完成特定的功能和子功能的构件)有性质不同可区分的数据和过程表达式形成具有独立功能特征的子过程减小子过程间和与外部环境间接口的复杂性应利用需求分析中得到的信息和可重复的方法设计的基本原理1.抽象(abstraction)2.细化(refinement)3.模块化(modularization)4.软件体系结构5.控制层次6.数据结构7.软件过程8.信息隐藏抽象抽象是强调所注意的方面,而忽略与当前目标无关方面的原理软件工程过程中的每一步都是对软件解的抽象层次一次细化在抽象的最高层可以使用问题环境语言以概括的方式叙述问题的解;在抽象的较低层采用更为过程化的方法;在抽象的最低层则用直接实现的方式来说明抽象的应用对理解各种形式的计算机系统和进行系统开发都是十分重要的示例:二维绘图系统第一层抽象该软件包括一个计算机图形接口,它能在绘图员和鼠标之间进行可视化通信,鼠标代替了绘图板和丁字尺。所有的直线和曲线描绘、所有的几何计算、所有的剖面图和辅助视图都可以由CAD软件来完成。画法存储在一个绘图文件中,它包括所有几何、文本和辅助设计信息由此可见,其解是使用问题环境语言来概括的示例:二维绘图系统第二层抽象CAD软件的任务:用户交互任务;二维图形绘制任务;图形显示任务;绘图文件管理任务;结束应当注意:应把与CAD软件有关的每一个软件任务都列出来。所用术语已离开问题所处环境,但仍不是实现说明示例:二维绘图系统第三层抽象procedure:二维图形绘制repeatuntil〈绘图任务终止〉dowhile〈与绘图机进行交互〉绘图机接口任务;终止绘图请求;直线:直线绘制任务;曲线:曲线绘制任务;…卜end;dowhile〈与键盘进行交互〉键盘交互任务;分析/计算选择;视图:辅助视图任务;剖面图:横剖面任务;…end;…endrepetitionendprocedure.在这个层次上一个初步的过程表示已经产生。其所用术语已经是面向程序(使用了dowhile等结构),并开始显一出楼模块化的意义细化细化是一种自顶向下的设计策略程序的体系结构开发是由过程的细节层次不断细化而成分层开发则是逐步分解一个宏功能(一个过程抽象)直到获得编程语言语句每一步细化都隐含着一定的设计决策随着任务的细化,数据也要细化、分解或结构化模块化模块(module)是单独命名和可编址的构件模块化是软件的一个重要属性模块化使得一个程序易于为人们所理解、设计、测试和维护模块化过程中,必须减少接口的复杂性,提高模块的独立性,才能有效地降低软件总的复杂性模块化原则软件体系结构软件体系结构包含了过程构件(模块)的层次结构和数据结构结构决定于软件设计方法。由于各种设计方法的原理不同,因而同一个软件需求也会导出不同的软件件系结构到底哪一种设计方法最好?可以通过分析的方法来确定它们的整体质量需求分析到设计的转换可供选择的结构控制层次常用的为树形结构深度表示控制的层次,宽度表示同一个层次上控制的最大数扇出(fanout)是对一个模块直接控制其他模块数目的量度,扇入(fanin)则是一个给定模块被多少个模块直接控制的量度树形控制结构图数据结构数据结构是一种数据各元素之间逻辑关系的表达式数据结构与程序结构同样重要。因为数据结