《软件工程》学习辅导.doc
软件工程学习辅导第一章 绪论第一节 软件工程的产生软件:计算机程序及其说明程序的各种文档。"程序"是计算任务的处理对象和处理规则的描述。软件的特点:1 是一种逻辑产品,与物质产品有很大的区别。2 软件产品的生产主要是研制,生产成本主要在开发和研制,开发研制完成后,通过复制就产生了大量软件产品。3 软件产品不会用坏,不存在磨损,消耗。4 生产主要是脑力劳动,还末完全摆脱手工开发方式,大部分产品是"定做"的。5 开发软件的费用不断增加,致使生产成本相当昂贵按软件的功能划分- 系统软件:能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和数据协调、高效率地工作的软件。如操作系统、数据库管理系统、设备驱动程序以及通信处理程序等。系统软件是计算机系统中必不可少的一个组成部分。 应用软件:是在特定的领域内开发,为特定目的服务的一类软件。如,CADCAM 计算机辅助制造CAI 计算机辅助教学, 专家系统,模式识别,刹车系统 支撑软件:是协助用户开发软件的工具性软件,其中包括帮助程序人员开发软件产品的工具,也包括帮助管理人员控制开发的进程的工具。按规模划分:1、微型-只有一个人,甚至是半时,在几天之内完成的软件。写出的程序不到500行语句。2、小型-一个人半年之内完成的2千行以内的程序。例如,数值计算问题或是数据处理问题就是这种规模的课题。这种程序通常没有与其他程序的接口。如,有求伯君开发最初的 WPS,单独完成BASIC 的比尔.盖茨。3、中型-5人以内在一年多时间里完成的5千到5万行的程序。这种课题开始出现了软件人员之间,软件人员与用户之间的联系、协调和配合关系的问题。4、大型-5人至10人在两年多的时间里完成5万行到10万行的程序。例如编译程序、小型分时系统、应用软件包、实时控制系统等很可能都是这种软件。5、甚大型-100人至1000人参加6、极大型-2000-5000人参加,如,微软的windows 2000项目就包含了近3000名工程师,他们被分成几百个小的团队。 按开发分-软件产品和软件项目 软件产品-指的是不局限于特定领域的、可以被广大用户直接使用的软件系统。如微软的 Windows,Office等。这类系统的特点是技术含量高,开发时要考到各种不同的用户需求; 软件项目-也称定制软件,是受某个特定客户(或少数客户)的委托,由一个或多个软件开发机构在合同的约如我们常说的管理信息系统(MIS)和电子商务系统。这类软件的特点是领域知识所占的比重较大,相对技术而言工程性更强。例如,军用防空指挥系统、卫星控制系统等均为这类软件。 针对这两种不同类型的软件,应该有不同的软件开发方法去指导项目开发过程。 软件项目的开发,目前比较成熟的软件开发方法有软件成熟度模型(CMM)。 这种软件开发模型试图将整个软件开发过程规范化和量化,直到可以对软件开发过程进行定量的控制和优化。 软件产品的开发,像微软公司积累了许多成功的经验。软件生产的发展:1 程序设计时代:这个阶段生产方式是个体劳动,生产工具是机器语言,汇编语言。(1946-1956年)2 程序系统时代:这个阶段生产方式是小集团合作生产,生产工具是高级语言,开发方法仍依靠个人技巧,但开始提出结构化方法。(1956-1968年)3 软件工程时代:这个阶段生产方式是工程化的生产,使用数据库,开发工具,开发环境,网络,分布式面向对象技术来开发软件。(1968年至今)软件危机: 软件开发技术的进步未能满足发展的要求。在软件开发中遇到的问题找不到解决的办法,问题积累起来,形态尖锐的矛盾,导致了软件危机。软件危机的表现:1 经费预算经常突破,完成时间一再拖延。2 开发的软件不能满足用户要求。3 开发的软件可维护性差。4 开发的软件可靠性差。软件危机产生原因:1 软件规模越来越大,结构越来越复杂。2 软件开发管理困难而复杂。3 软件开发费用不断增加。4 软件开发技术落后。5 生产方式落后,仍采用手工方式。6 开发工具落后,生产率提高缓慢。软件工程:用科学的知识和技术原理来定义,开发,维护软件的一门学科。用工程科学的观点进行费用估算,制定进度,制定计划和方案。用管理科学的方法和原理进行生产的管理。用数学的方法建立软件开发中的各种模型和算法。 那么为达到软件优质高产这个目标,从技术到管理做了大量的努力,从而逐渐已形成了"软件工程学"这一新学科。它包含以下主要内容:1、软件开发方法:软件工程的方法提供了建造软件在技术上需要"如何做"。 方法涵盖了一系列的任务:需求分析、设计、编程、测试和维护。 是在60年代后期才逐步形成了一种软件开发方法,在不同的软件开发阶段对应有不同的方法,例如在软件的设计阶段有"结构化分析与设计"方法,在软件测试阶段有"黑盒"与"白盒"测试技术,等等。 象目前又有一种更新的技术"面向对象的程序设计方法"。在这一方法中,数据和数据的操作是被封闭在一个个称为"对象(Object) "的统一体中,对象之间则是通过"消息"(message")进行相互联系的。 从而使由软件所描述的系统与客观世界的系统在结构上十分相似,不仅提高了软件的可修改性与可维护性,同时也提高了软件的可重用性,那么这些都是工程多年来所追求的目标。从结构程序设计到面向对象程序设计,是程序设计方法的又一次飞跃。2、软件工具:所谓工具,在这里泛指是开发一切帮助开发软件的软件。为了提高软件设计的质量和生产效率,现已经发展了许多的帮助开发和维护软件的软件 。例如,我们要用某种语言来开发一个应用软件,这就要涉及到 "编辑程序、编译程序、连接程序等,另外在软件测试阶段还要用到 "测试数据产生器、排错程序、跟踪程序、静态分析工具和覆盖监视工具等。也就是说在不同的时期要用到不同的软件开发工具。目前,软件工具发展迅速,许多用于软件分析和设计的工具正在建立,其目标 就是要实现软件生产自动化。3、软件工程环境:软件方法和工具是软件开发的两大支柱,她们之间密切相关。软件方法提出了明确的工作步骤和标准的文档格式,这是设计软件工具的基础,而软件工具的实现又将促进软件方法的推广和发展。 "环境"一词,对不同用户有着不同的含义。对最终用户(end user)而言,环境就是他们运行程序所使用的计算机系统。这类用户对环境的要求,主要是运行可靠,操作方便,容易学习和使用。而对于软件开发人员来说,则就不同了,可以说环境就是他们进行软件开发活动的舞台。(例如,Algo-60,或者 资料管理系统(DbaseII DbaseIII),例如界面只能采用菜单来完成各种功能) 象现在生产数据库管理的软件的环境有:大型数据库软件 Sybase ,还有能帮助进行程序设计的 PB 软件) 4、软件工程管理学:大家知道,对于一个企业来说,如果只有先进的设备和技术,而没有完善的管理,是不可能获得应有的经济效益的(例如海尔的海尔文化就是企业管理的象征),(例如微软企业文化宗旨的一句话) 软件生产也是一样的,如果管理不善,是不可能高质量、按时完成任务的。 "软件工程管理就是对软件工程生存期内的各阶段的活动进行管理。软件工程管理的目的是为了能按预期的时间和费用,成功地完成软件的开发和维护任务。 软件工程管理学的内容包括软件费用管理、人员组织、工程计划管理、软件配置管理等各项方面的内容。 显然,软件工程管理也可借助计算机来实现。供经理人员估算成本、指定进度、生成报告等管理工具都已经在许多公司使用了。一个理想的软件工程环境,应该同时具备 支持开发和支持管理两个方面的工具。 以上简介了软件工程学的主要组成成分-软件工程方法学、软件工程环境以及软件工程管理的基本内容台和作用。它们即包括计算机科学家的研究成果,也概括了广大软件工作者的时间经验。还必须指出,软件开发技术可区分为形式化方法与非形式化方法两大分支。前者以形式化的程序变化和严整为主要内容,目的在于达到程序设计的自动化,多用于计算机应用人员。本课程主要讨论的是工程化的软件开发技术。 软件工程目标:付出较低开发成本;达到要求的功能;取得较好的性能;开发的软件易于移植;只需较低的维护费用;能按时完成开发任务,及时交付使用;开发的软件可靠性高。软件工程内容:研究内容包括开发技术和开发管理两个方面。开发技术主要研究 :软件开发方法,开发过程,开发工具和环境。开发管理主要研究 :软件管理学,软件经济学,软件心理学。软件工程需要解决的问题:软件的费用,可靠性,可维护性,软件生产率和软件的重用。第二节 软件工程过程和软件生存周期软件工程:规定了获取,供应,开发,操作和维护软件时,要实施的过程,活动和任务。目的是为各种人员提供公共的框架,以便用相同的语言进行交流。包括:获取过程,供应过程,开发过程,操作过程,维护过程,管理过程,支持过程。软件生存周期:一个软件从提出开发要求开始直到该软件报废为止的整个时期。包括:可行性分析和项目开发计划,需求分析,概要设计,详细设计,编码,测试,维护。第三节 软件生存周期模型,方法和工具生存周期模型:描述软件开发过程中各种活动如何执行的模型。对软件开发提供强有力的支持,为开发过程中的活动提供统一的政策保证,为参与开发的人员提供帮助和指导,是软件生存周期模型化技术的基础,也是建立软件开发环境的核心。生存周期模型作用:确立了软件开发中各阶段的次序限制,活动准则,所要遵守的规定和限制,便于各种活动的协调,人员之间的有效通信,有利于活动重用和活动管理。生存周期模型准则:模型能表示各种活动的实际工作方式,能随情况变化而演化能表示各种活动间同步和制约关系,能表示活动的动态特性。容易为开发人员理解,能适应不同软件项目,具有较强灵活性,能支持软件开发环境的建立。目前有:1 瀑布模型:将软件生存周期中各活动规定为依线性顺序连接的若干阶段。包括可行性分析,项目开发计划,需求分析,概要设计,详细设计,编码,测试和维护。它是一种理想的线性开发模式,缺乏灵活,特别是无法解决软件需求不明确的问题。适合于需求不明确,设计方案有一定风险的软件项目。2 增量模型:软件在模型中是"逐渐"开发出来的,开发一部分,展示一部分,能及早发现问题。或者先开发一"原型"软件,完成主要功能,然后逐步完善,最终获得满意的软件产品。3 螺旋模型:将瀑布模型与增量模型结合起来,加入风险分析,弥补了这两种模型的不足。开发分四步:制定计划,风险分析,开发实施,用户评估。4 喷泉模型:以用户需求为动力,以对象为驱运动模型,适合于面向对象开发方法,使开发过程具有迭代性和无间隙性。 迭代性:系统有些部分常常重复工作多次,相关功能在每次迭代中随之加入演化的系统。 无间隙:在分析,设计,实现等开发活动之间不存在明显边界。5 基于知识的模型:瀑布模型与专家模型的结合。开发各阶段都有利用相应专家系统来辅助设计,使维护在系统需求一级进行。6 变换模型:适合于形式化开发方法的模型。软件开发方法:使用早已定义好的技术集及符号表示习惯来组织软件生产的过程。软件开发开发的目标:通过使用成功的软件开发方法,在规定的投资和时间内,开发出符合用户需求的高质量的软件。 软件开发方法是克服软件危机的重要方面之一,对软件工程及软件包产业的发展起了不可估量的作用。已使用的成功方法有:1、结构化方法:一种面向数据流的开发方法,适合数据处理领域。指导指导思想是自顶向下,逐步求精。用数据流图建立系统功能模型,完成需求分析工作。用软件结构图建立系统物理模型,实现概要设计。最后将每个模块的功能用相应标准控制结构表示出来,从而实现详细设计。2、JACKSON方法:一种面向数据结构的开发方法,适合小规模项目。首先描述问题的输入,输出数据结构,分析其对应性,然后推出相应程序结构,从而给出问题的软件过程描述。当输入与输出数据结构无对应关系时,难于应用此方法,JSD(一完整的系统开发方法)对JSP进行了扩充3、维也纳开发方法(VDM):一种形式化开发方法,软件的需求用严格的形式语言描述,然后把模型逐步变换成目标系统。4、面向对象的开发方法:基本出发点是尽可能按人类认识世界的方法和思维方式来分析和解决问题。以对象作为最基本的元素,客观世界中具体的事物,事件,概念和规则都有可看成对象,它也是分析问题,解决问题的核心。开发方法包括面向对象分析,面向对象设计,面向对象实现。主要有BOOCH方法,Coad方法和OMT方法。为统一这些方法的术语,概念和模型,(1997年)推出统一建模型语言UML。结构化方法可用:瀑布模型,增量模型,螺旋模型进行开发。JACKSON方法可用:瀑布模型,增量模型进行开发。面向对象的开发方法可用:喷泉模型,瀑布模型,增量模型进行开发。形式化的维也纳方法只能用变换模型进行开发 。软件工具:为支持软件人员开发和维护活动而使用的软件。使用软件工具后,可提高软件生产率。目前软件工具发生了很大变化,目的是生成软件周期各个环节的自动化。主要用于软件的分析和设计,使用这些工具软件开发人员就能在微机或工作站上以对话方式建立各种软件系统。工具箱:最初的软件工具是以工具箱形式出现的。但界面不统一,工具内部无联系,工具切换由人工操作。它们对大型软件的开发和维护的支持能力有限。软件开发环境:目的是使软件工具支持整个生存周期。而且做到不仅支持各阶段的技术工作,还要支持管理和操作工作,保持项目开发的高度可见性,可控制性和可追踪性。计算机辅助软件工程:可简单定义为软件开发的自动化,简称为CASE。实质是为软件开发提供一组优化集成的,大量节省人力的软件开发工具。是软件工具和软件开发方法的结合。目的是实现软件生存周期各环节的自动化,并使之成为一个整体。CASE工具与以往软件工具不同体现在:1 支持专用的个人计算环境;2 使用图形功能对软件系统进行说明并建立文档;3 将生存周期各阶段的工作连接在一起;4 收集和连接软件系统从最初的软件需求到软件维护各个环节的所有信息;5 用人工智能实现软件开发和维护工作的自动化。第二章可行研究与项目开发计划可行研究的任务:首先需要进行概要的分析研究,初步确定项目的规模,目标,约束和限制。分析员再进行简要的需求分析,抽象出项目的逻辑结构,建立逻辑模型。从逻辑模型出发,经过压缩的设计,探索出若干种可供选择的解决方法,对每种解决方法都要研究它的可行性。主要从三个方面考虑:1.技术可行性 一般要考虑的情况包括 开发的风险即设计出的系统能否达到要求的功能和性能;资源的有效性;相关技术的发展是否支持;2.经济可行性 进行开发成本的估算以及了解取得效益的评估,确定要开发的项目是否值得投资。3.社会可行性 要开发的项目是否存在任何侵权问题,运行方式在用户组织内是否可行,现有管理制度人员素质操作方式是否可行。可行性研究的具体步骤:1.确定项目规模和目标;2.研究正在运行的系统; 收集研究分析现有系统的文档资料,实地考察系统访问有关人员,然后描绘现有系统的高层系统流程图。3.建立新系统的高层逻辑模型; 使用数据流图和数据字典描述数据在系统中的流动和处理情况。4.导出和评价各种方案; 导出若干较高层次的物理解决方法,根据技术可行性经济可行性社会可行性进行评估,得到可行的解决方法。 5.推荐可行方案; 进行成本效益分析,决定该项目是否值得开发,若值得开发那么解决方案是什么,并且说明该方案可行的原因和理由。6.编写可行性研究报告; 将上述可行性过程的结果写成相应文档,即可行性研究报告。 系统流程图: 描述系统工程物理模型的工具,用图形符号来表示系统中各个元素,表达各元素之间的信息流动情况。投资回收率:通常用货币的时间价值进行估算。可用利率来表示货币的时间价值。 设年利率为I,现存入P元,n年后可得钱数为F,若不计复利则F=P*(1+n*I) 反之,若n年能收入F元,那么这些钱现在的价值是:P=F/(1+n*I) 通常把建立系统若干年后能取得的收益折算成现在的价值和开发系统所需的费用进行比较得出投资回收率。投资回收期:就是使累计的经济效益等于最初的投资费用所需的时间。纯收入:整个生存周期之内的累计经济效益(折成现在值)与投资之差。(例题见书2.3成本-效益分析)项目开发计划:包括1.项目概述:说明项目的各项主要工作;说明软件的功能性能;为完成项目应具有的条件;用户及合同承包者承担的工作完成的期限及其他条件限制;应交付的程序名称;所使用的语言及程储形式;应交付的文档。2.实施计划:说明任务的划分,各任务责任人,项目开发进度,项目的预算,各阶段的费用支出,各阶段应完成的任务,用图表说明每项任务的开始和完成时间。 3.人员组织及分工:所需人员类型数量组成结构。4.交付期限:最后完工日期。第三章 软件需求分析需求分析:开发人员准确地理解用户的要求,进行细致的调查分析,将用户非形式的需求陈述转化为完整的需求定义,再由需求定义转换到相应的需求规格说明的过程。它有以下几难点: 问题的复杂性。由用用户需求涉及的因素繁多引起,如运行环境和系统功能 交流障碍。需求分析涉及人员较多,这些人具备不同的背景知识,处于不同角度,扮演不同角色,造成相互之间交流困难。 不完备性和不一致性。用户对问题的陈述往往是不完备的,各方面的需求可能还存在矛盾,需求分析要消除矛盾,形成完备及一致的定义。 需求易变性。近几年来已提出多种分析和说明方法,但都必须适用以下原则: 必须能够表达和理解问题的数据域和功能域。数据域包括数据流(数据通过一个系统时的变化方式)数据内容和数据结构,功能域反映上述三方面的控制信息。 可以把一个复杂问题按功能进行分解并可逐层细化。 建模。可更好地理解软件系统的信息,功能,行为。也是软件设计的基础。 需求分析的任务: 问题识别:双方确定对问题的综合需求,这些需求包括功能需求,性能需求,环境需求,用户界面需求。 分析与综合,导出软件的逻辑模型 编写文档:包括编写"需求规格说明书""初步用户使用手册""确认测试计划""修改完善软件开发计划" 结构化分析:简称SA,面向数据流进行数据分析的方法。采用自顶向下逐层分解的分析策略。顶层抽象地描述整个系统,底层具体地画出系统工程的每个细节。中间层则是从抽象到具体的过渡。使用数据流图,数据字典,作为描述工具,使用结构化语言,判定表,判定树描述加工逻辑。结构化(SA)分析步骤:了解当前系统的工作流程,获得当前系统的物理模型。抽象出当前系统的逻辑模型。建立目标系统的逻辑模型。作进一步补充和优化。 数据流图(DFD)以图形的方式描述数据在系统中流动和处理的过程。只反映系统必须完成的逻辑功能,是一种功能模型。 画数据流图的步骤:首先画系统的输入输出,即先画顶层数据流图。顶层图只包含一个加工,用以表示被开发的系统。画系统内部,即画下层数据流图。将层号从0号开始编号,采用自顶向下,由外向内的原则。画更下层数据流图时,则分解上层图中的加工,一般沿着输出入流的方向,凡数据流的组成或值发生变化的地方则设置一个加工,一直进行到输出数据流。如果加工的内部还有数据流,则继续分解,直到每个加工足够简单,不能再分解为止。不能分解的加工称为基本加工。注意事项:命名。不能使用缺乏具体含义的名字,加工名应能反映出处理的功能。画数据流而不是控制流。数据流名称只能是名词或名词短语,整个图中不反映加工的执行顺序。一般不画物质流。 每个加工至少有一个输入数据流和一个输出数据流,反映出此加工数据的来源与加工的结果 。编号。某个加工分解成加一张数据流图时,上层图为父图,下层图为子图。子图应编号,子图上的所有加工也应编号,子图的编号应与父图的编号相对应。父图与子图的平衡。子图的输入输出数据流同父图相应加工的输入输出数据流必须一致局部数据存储。当某数据流图中的数据存储不是父图中向外部接口,而只是本图中某些加工之间的数据接口,则称这些数据存储为局部数据存储。 提高数据流图的易理解性。为使数据流图便于在计算机上输入和输出,给出了描述数据流图的另一套图形符号表示数据流,只能水平或垂直画 数据字典(DD)用来定义数据库流图中的各个成分的具体含义。有以下四类条目:数据流,数据项,数据存储,基本加工。 数据流条目,内容及举例如下:数据流名称:订单别名:无简述:顾客订货时填写的项目来源:顾客去向:加工1"检验订单"数据流量:1000份/每周(单位时间内的传输次数)组成:编号+订货日期+顾客编号+地址+电话+银行帐号+货物名称+规格+数量 数据存储条目,内空及举例数据存储名称:库存记录别名:无简述:存放库存所有可供货物的信息组成:货物名称+编号+生产厂家+单价+库存量组织方式:索引文件,以货物编号为关键字查询要求:要求能立即查询 数据条目,内容及举例数据项名称:货物编号别名:G-No,G-num,Goods-No简述:本公司所有货物的编号 类型:字符串长度:10取值范围及含义:第一位:进口/国产第2-4位:类别第5-7位:规格第8-10位:品名编号 加工条目,内容及举例加工名:查阅库存编号:12激发条件:接收到合格订单时优先级:普通输入:合格合格订单输出:可供货订单,缺货订单加工逻辑:根据库存记录IF 订单项目数量<该项目库存量临界值THEN 可供货处理ELSE 此订单缺货,登录,待进货后再处理ENDIF 数据字典的实现:手工建立:数据字典的内容用卡片形式存放利用计算机辅助建立并维护 加工逻辑的描述:一般用结构化语言,判定表,判定树 结构化语言是介于自然语言和形式语言之间的一种半形式化语言。它的结构可分里层和内层外层:用来描述控制结构,采用顺序,选择,重复三种基本结构。顺序结构:是一组祈使语句,选择语句,重复语句的顺序排列 选择结构:一般用IF-THEN-ELASE-ENDIF,CASE-OF-ENDCASE等关键词。重复结构:一般用DO-WHILE-ENDDO,REPEAT-UNTIL等关键词。内层:一般采用祈使语句的自然语言短语,使用数据字典中的名词和有限的自定义词,其 动词含义要具体,尽量不使用形容词和副词来修饰。 判定表由四个部分组成:条件定义 条件取值的组合动作定义 在各种取值的组合下应执行的动作 例:加工逻辑描述为,如果申请者的年龄在21岁以下,要额外收费;如果申请者是21岁以上并是26岁以下的女性,适用于A类保险;如果申请者是26岁以下的已婚男性,或者是26岁以上的男性,适用于B类保险;如果申请者是21岁以下的女性或是26岁以下的单身C类保险。除此之外的其他申请者都适用于A类保险。 条件取值表判定表能把在什么条件下系统应做什么动作准确无误地表示出来,但不能描述循环的处理特性,循环处理还需结构化语言。判定树,是判定表的变形,比判定表更直观,更易于理解和使用。下面的判定树与所举例的判定表等价:第4章 软件概要设计学习本章,我们要考虑以下几个问题:软件概要设计指的是什么? 软件概要设计要做的事情是什么? 用什么来评价软件设计的技术质量? 软件结构优化的准则是什么? 如何进行软件概要设计? 以上问题就是本章所要讨论的内容。一、软件概要设计指的是什么? 我们知道,软件设计是把一个软件需求转换为软件表示的过程,而概要设计(又称结构设计)就是软件设计最初形成的一个表示(这里的表示是一个名词),它描述了软件的总的体系结构。简单地说软件概要设计就是设计出软件的总体结构框架。而后对结构的进一步细化的设计就是软件的详细设计或过程设计。本章所学内容主要就是软件的概要设计内容。二、软件概要设计的基本任务软件概要设计阶段要做的事情是什么呢? 总的来看有四个方面:它们是1、设计软件系统结构(软件结构) 2、数据结构及数据库设计 3、编写概要设计文档 4、评审 在需求分析阶段,已经把系统分解成层次结构,而在概要设计阶段,需要进一步分解,划分为模块以及模块的层次结构。划分的具体过程是:(1)采用某种设计方法,将一个复杂的系统按功能划分成模块。 (2)确定每个模块的功能。 (3)确定模块之间的调用关系。 (4)确定模块之间的接口,即模块之间传递的信息。 (5)评价模块结构的质量。 对于大型数据处理的软件系统,还要对数据结构及数据库进行设计。 在概要设计阶段,还要编写概要设计文档,我们初学者有一个不是很好的做法,就是在编程序时,往往不注意文档的编写,导致以后软件修改和升级很不方便,用户使用时也得不到帮助。所以应该在软件设计的每个阶段编写相应文档,在概要设计阶段,主要有以下文档需要编写:(1)概要设计说明书。(2)数据库设计说明书。(3)用户手册,(4)修订测试计划。 最后一个任务就是评审,在概要设计中,对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等都要进行评审,以免在以后的设计中发现大的问题而返工。 以上就是软件概要设计的四个基本任务,总结一下用八个字表示:两类结构文档评审。(两类结构就是指软件结构和数据结构及数据库设计) 在了解了软件概要设计的基本任务之后,我们来看看软件设计的基本原理,也就是用于衡量软件设计的技术质量的一些标准。三、软件设计的基本原理1、模块化 模块就是指在程序中的数据说明、可执行语句等程序对象的集合,或者是单独命名和编址的元素。如高级语言中的过程,函数、子程序等。每个模块可以完成一个特定的子功能,各个模块可以按一定方法组装起来成为一个整体。从而实现整个系统的功能。 模块化就是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。 为了解决复杂的问题,在软件设计中就必须把整个问题进行分解来降低复杂性,这样就可以减少开发工作量并降低开发成本和提高软件生产率。但是划分模块并不是越多越好,因为这会增加模块之间接口的工作量。所以划分模块的层次和数量应该避免过多或过少。2、抽象 抽象这个词本身也比较抽象,(老师要小明用抽象和具体造一个句子,可是他不懂,就问妈妈,什么是抽象,什么是具体? 妈妈告诉他:抽象就是看不见摸不着的,具体就是看得见摸得着的。小明懂了,很快造好了一个句子,是这样的:今天我很早起床,看见具体的妈妈在炒具体的菜,我打开窗户,抽象的新鲜空气呼地一下跑进来,真舒服啊。)呵呵,事实上,抽象并不是这么简单的意思,它是一种思维工具,就是把事物本质的共同特性抽出来而不考虑其他细节,比如说我们可以把把男人女人老人小孩的共同本质特性抽出来之后形成一个概念"人",这个概念就是抽象的结果。在软件工程中就是这样,在每个阶段中,抽象的层次逐步降低,在软件结构设计中的模块分层也是由抽象到具体的分析和构造出来的。比如上一层的模块所进行的加工是一个抽象的操作"销售统计",分解到最后一层,就可能是具体"打印报表"的操作了。3、信息隐蔽 信息隐蔽的意思就是指,在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说是不能访问的。举个例子吧,假设我是程序中的一个模块,电话机是另一个模块,我在使用电话机时,对电话机的控制是通过几个按键来确定的,输入的数据是我的语音,输出的数据是对方的语音,而这些输入、输出的数据变换以及控制在电话机内部是怎么实现的我不需要知道,同时也不能加以直接控制,这样,如果电话机坏了,修复或更换后对我的使用是没有任何影响的。所以说,电话机这个模块的信息隐蔽是十分完善的。在软件设计中,模块的划分也要采取措施使它实现信息隐蔽。4、模块独立性 模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。这个概念就是上面说的三个基本原理的直接产物,在概要设计过程中,就是要求设计出具有良好模块独立性的软件结构。 那么如何来衡量软件的模块独立性呢?这里有两个定性的度量标准。(1)耦合性:就是指模块之间的联系紧密程度。模块之间联系越紧密,其耦合性越强,独立性就越差。模块的耦合性从低到高可分为以下几种类型:(假设某人为一模块)无直接耦合 (比如陌生人之间的联系) 数据耦合 (比如去售货员与顾客之间的联系) 标记耦合 (比如两个人下棋) 控制耦合 (领导和下属之间的联系) 公共耦合 (比如图书馆的所有借书者之间的联系) 内容耦合 (比如小两口之间的联系) 在软件设计中,提高模块的独立性,建立模块间尽可能松散的系统,是模块化设计的目标。为了降低模块间的耦合度,可以采取以下措施:(1)在耦合方式上降低模块间接口的复杂性。(2)在传递信息类型上尽量采用数据耦合,避免使用控制耦合,慎用或有控制地使用公共耦合。在实践中要根据实际情况综合考虑。(2)内聚性内聚性是指模块内部各个元素彼此结合的紧密程度。根据内聚性的从低到高可分为以下六种类型:偶然内聚:指一个模块内的各处理元素之间没有任何联系。(公共汽车内的人群) 逻辑内聚:指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。(警察局里的警察) 时间内聚:把需要同时执行的动作组合在一起形成的模块为时间内聚模块。(交响乐团的演奏员) 通信内聚:指模块内所有处理元素都在同一个数据结构上的操作。或者指各处理使用相同的输入数据或者产生相同的输出数据。(建筑工地上的工人) 顺序内聚:指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能的元素的输出就是下一功能元素的输入。(我们可以想像纺织厂中从纺纱到织布的各个操作形成的一个模块,就是一种顺序内聚) 功能内聚:这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可,模块已不可再分。(就如两个人演狮子舞,要完成狮子形象的再现,两个人缺一不可.) 耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚,低耦合,提高模块的独立性。在内聚性与耦合性发生矛盾的时候,最好优先考虑耦合性,也就是先保证耦合性低一些。四、软件结构的优化准则 首先应学会用图形表示软件结构,软件结构图反映了整个系统的功能实现,即将来编好程序中的控制层次体系。软件结构往往用树状或网状结构的图形来表示。 请大家对照课本的解释来看软件结构图包括哪些内容。 我们已经知道了软件概要设计的主要任务就是软件结构的设计,为了提高设计的质量,可以根据下面的设计优化准则进行优化:在这些准则中,都是针对模块及模块间关系来提出的。1、模块的划分:要做到高内聚,低耦合,保持相对独立性。 2、模块的控制:模块的作用范围要在他的控制范围内,判定所在的模块应与受其影响的模块在层次上尽量靠近) 3、形成的结构;软件结构的深度、宽度、扇出、扇入要适当 4、模块的大小: 要适中。 5、模块的接口:模块的接口要简单、清晰、含义明确,便于理解、易于实现、测试与维护)。 五、概要设计的设计方法。(一)面向数据流的设计方法(这是需要我们熟练掌握的方法) 面向数据流的设计方法是以需求阶段产生的数据流图为基础,按一定的步骤映射成软件结构,因此又称为结构化设计(Structured Design SD)。这是目前使用最广泛的软件设计方法之一,应该熟练掌握它。1、首先要研究数据流图(DFD)的类型,无论何种软件系统,DFD一般都可分为变换型和事务型两类。 先来看变换型数据流图,顾名思义,变换就是把输入的数据处理后变成另外的数据输出,所以变换型数据的工作过程就是三步:取得数据、变换数据和输出数据。在图4-6中,可以看到两股数据流经过交换中心变成一股数据流进行输出。虚线为标出的流界。 再来看事务型数据流图,所谓事务也是一个处理,但不是数据变换,而是将输入数据流分离成许多发散的数据流,形成许多加工路径,并根据值选择其中一个路径来执行。举个例子,好比有一个邮件分发中心,把收进的邮件根据其发送地址进行分流,有的用飞机邮送,有的用汽车来运输等等。 在大型软件系统中的DFD数据流图中,这两种类型特征都有可能存在。2、SD方法设计过程1)精化DFD。 2)确定DFD类型并进行相应的映射。 3)分解上层模块,设计中下层模块结构 4)根据优化准则对软件结构求精。 5)描述模块功能、接口及全局数据结构 6)复查,如果有错则转向2)修改完善,否则进入详细设计。 下面我们通过例子来说明变换分析设计和事务分析设计方法。3、变换分析设计 以课本 页图 为例说明变换分析设计。 根据面向数据流的设计方法,第一步是精化DFD,也就是研究分析这个数据流图,我们可以看到图中从A到H的数据流向和加工,图形比较简单。 第二步是确定DFD类型并确定加工中心,在这里已经说明为本图为变换型,在实际分析中应该根据每个相关操作来确定其类型。在图中,我们可以直观地看到中间几股数据流的汇合处是系统的变换中心。也可以通过双向寻找法来确定,左边是物理输入端,从f1沿着单向路径一直到f3,后面的f4是从C流出的,同时C还有f5流出,则可见f4,f5不能再看作是系统的输入,因此可确定f4,f5前一个数据流f3就是系统的逻辑输入,同样,我们从右边的物理输出端往左边沿数据流的反向寻找,可以发现f4,f6不能看作是整个系统的输出,因此可以确定f7,f8是逻辑输出端,然后在这两个分界处添上虚线,这样,DFD的三部份就确定了。 第三步 设计软件结构的顶层和第一层,根据变换中心可以对应得到主模块的位置,就可以画出顶层模块(即主模块,在实际应用中,这个模块的名字就是系统的名字,如销售管理系统等)。然后在这个模块下方根据划分好的三个部分画出三个功能模块,即输入、变换和输出模块,就是图中的get f3,将f3变换成f7和f8模块,put f7及put f8模块,注意,这里应当为每个输入和输出设计一个模块。然后将这些模块与顶层模块用连线连上表示所属控制。画上相应的数据传送箭头。 第四步 分解上层模块,设计中下层模块。 根据上面的方法,分解输入模块,图中的get f3模块的功能是向主模块提供数据,而在DFD中可以看到f3是数据流f2经过B操作后流出的,因此这里有两个部分,就是接收f2数据,再通过B转换流出。所以在get f3模块下画出两个子模块 get f2 和B操作模块。 就这样一一分解,可以画出所有的输入和输出子模块,直到物理输入和输出为止。 对于变换中心的下属模块,根据数据流和变换操作,以每个基本加工建立一个功能模块,可以画出CDE三个子模块。 整个过程并不复杂,画好后根据实际情况对软件结构进行优化,也就是进行必要的合并或分解。以求设计出高内聚低耦合的模块组成的、具有良好特性的软件结