软件技术基础——软件工程软件技术基础——软件工程4.1软件工程概述4.2问题定义与可行性研究4.3软件的需求分析4.3.1需求分析概述4.3.2结构化分析方法4.3.3数据流图4.3.4数据字典4.4软件的设计4.4.1软件设计概述4.4.2软件设计准则4.4.3结构化设计方法4.4.4详细设计方法4.4.5面向对象的程序设计方法4.5软件的编程4.6软件的测试4.6.1软件测试概述4.6.2测试用例的设计4.6.3测试实例的设计4.6.4软件的调试4.7软件的维护习题4软件技术基础——软件工程4.1软件工程概述1.软件与软件危机软件是由计算机程序演变而形成的一种概念。程序是按既定算法,用某种计算机语言规定的指令或语句编写的指令或语句的集合。软件是程序再加上程序实现和维护程序时所必需的文档的总称。软件是程序和程序设计发展到规模化和商品化后所逐渐形成的概念。软件技术基础——软件工程随着计算机技术的迅速发展,计算机软件在计算机系统中占有越来越重要的地位。在软件需求量迅速增加,规模日益增长的情况下,计算机软件的开发和维护过程中遇到了一系列严重问题。如软件开发的复杂度大大上升,导致大型软件的开发费用经常超出预算,完成时间也常常超期,同时,软件可靠性随规模的增长而下降,质量保证也越来越困难,即产生了软件危机。软件危机主要有以下几种表现:软件技术基础——软件工程(1)不能准确估计软件开发的成本与进度;(2)用户对“已完成的”软件系统经常不满意;(3)软件产品质量往往靠不住;(4)软件难以维护;(5)软件无完整的文档,无法用以管理和控制软件的开发和维护;(6)软件费用急剧上升;(7)软件生产效率低,供不应求。软件技术基础——软件工程2.软件工程“软件工程”一词是1968年北大西洋公约组织(NATO)在联邦德国召开的一次会议上首次提出的。它的中心思想是把软件当作一种工业产品,而不是某种个体或小作坊的神秘技巧,要求“采用工程化的原理与方法对软件进行计划、开发和维护”。这样做的目的,不仅是为了实现按预期的速度和经费完成软件生产计划,也是为了提高软件的生产率与可靠性。软件工程是从技术(方法和工具)和管理两方面研究如何更好地开发和维护计算机软件的一门新兴学科。软件技术基础——软件工程软件工程是一门交叉学科,涉及到计算机科学、管理科学、工程学和数学。凡是计算机科学中的成果均可用于软件工程,但计算机科学着重于理论研究,如自动机理论、形式语言理论、编译原理、数据库原理、操作系统原理、人工智能原理等,而软件工程着重于具体软件系统的研制和建立。软件工程的理论、方法、技术都是建立在计算机科学的基础上,它是用管理学的原理、方法来进行软件生产管理;用工程学的观点来进行费用估算,制定进度和方案;用数学的方法来建立软件可靠性模型以及分析各种算法和性质。软件技术基础——软件工程软件工程研究的对象是大型软件系统的开发过程,它研究的内容是生产流程、各生产步骤的目的、任务、方法、技术、工具、文档和产品规格。软件是一种逻辑产品,与物质产品有很大差别,它看不见,摸不着,具有无形性,是脑力劳动的结晶。它以程序和文档形式存在,通过计算机来体现它的作用,在研制过程中,能见度差,这给开发过程的管理带来极大的困难,进度难以控制,质量难以保证。软件技术基础——软件工程因此,软件生产的管理也是软件工程的一个重要研究领域,大型软件开发过程的管理是一件非常复杂的事情,因此,管理不当也会导致软件开发的失败。软件生产的管理包括开发人员的层次结构和组织方式、开发进度的控制、软件质量的保证、开发费用的估算和管理、软件开发文档的管理等。软件技术基础——软件工程3.软件生存周期软件生存周期的概念是从工业中产品生存周期的概念借用过来的。一种产品从定货开始, 经过设计、制造、调试、使用维护,直到该产品淘汰为止,这就是所谓的产品生存周期。软件技术基础——软件工程图4-1瀑布模型问题定义项目说明可行性研究可行性分析报告需求分析需求说明书设计设计说明书编码程序测试测试报告维护计划期开发期运行期软件技术基础——软件工程软件生存周期是从用户提出开发要求开始,直到该软件报废为止的这段时间,可分为3个时期:计划期、开发期和运行期。计划期又分为问题定义和可行性研究两个阶段;开发期分为4个阶段:需求分析阶段、设计阶段(总体设计、详细设计)、编码阶段和测试阶段;运行期即维护阶段。各阶段的工作按顺序开展。图4-1是这种软件生存周期的模型示意图,由于其形状似多级瀑布,常称为“瀑布模型”。软件技术基础——软件工程4.2问题定义与可行性研究1.问题定义问题定义阶段的任务是要确定软件系统所要解决的任务。分析人员在与用户和部门负责人交流之后,应提出关于问题性质、工程目标和规模的书面报告,即软件系统目标与范围的说明。为了成功地完成问题定义阶段的任务,需要硬件人员和软件人员的共同参与,这一阶段是软件生存周期中较短的阶段。软件技术基础——软件工程2.可行性研究1)可行性研究的任务可行性研究的目的在于用最小的代价确定在问题定义阶段确定的系统目标和规模是否现实,所确定的问题是否可以解决,系统方案在经济上、技术上和操作上是否可以接受。可行性研究着重考虑以下几个方面:①经济可行性。估计开发费用以及新系统可能带来的收益,将两者进行权衡,看结果是否可以接受。软件技术基础——软件工程②技术可行性。对要求的功能、性能以及限制条件进行分析,看是否能够做成一个可接受的系统。所考虑的因素通常还应包括开发的风险,是否能够得到需要的软件和硬件资源,以及一个熟练的有能力的开发队伍,另外与系统开发有关的技术是否足以支持系统的研制。技术可行性的估计,需要有经验的人员去完成。③操作可行性。判断系统的操作方式在该用户组织内是否可行。软件技术基础——软件工程2)推荐方案根据可行性研究结果要做出的决定是:是否继续按预定目标进行开发。可行性分析人员必须清楚地表明他对这个关键性决定的建议。如果认为值得继续进行这项开发工程,则应提供一种最好的解决方案,并说明理由。软件技术基础——软件工程3)软件开发计划分析人员应该为推荐的系统草拟一份软件开发计划。软件开发计划是根据用户提出的功能性要求,开发时间和费用的限制而制定的,它要说明该项目需要的硬件资源和软件资源,需要的开发人员的层次和数量,项目开发费用的估算,开发进度的安排等。软件开发计划的阅读者可以包括软件主管部门、用户和技术人员。所确定的成本与进度可供主管部门复审。软件开发计划同时也给出了整个软件生存周期的基本预算和进度安排。软件技术基础——软件工程4.3软件的需求分析4.3.1需求分析概述软件的需求分析是开发期的第一个阶段。这个阶段的基本任务是:用户和分析人员双方共同来理解系统的需求,并将共同理解形成一份文件,即软件需求说明书。该阶段是面向用户问题的,它主要是对用户的业务活动进行分析,明确在用户的业务环境中软件系统应该“做什么”。软件技术基础——软件工程需求分析是一项重要的工作,也是困难的工作。该阶段是用户与软件人员双方讨论协商的阶段,由用户提出问题,软件开发人员给出问题的解答。用户的业务活动和业务环境对软件开发人员来说是不熟悉的,要想在短期内搞清楚是不太可能的;用户只熟悉本身的业务活动和业务环境,不熟悉计算机技术。由于这两方面人员缺乏共同的语言,开发人员往往急于求成,于是在未明确软件系统应该“做什么”的情况下,就开始进行设计、编程,而用户则不清楚软件人员在设计怎样的一个系统,直至系统完成交付用户之后,才发现它不符合要求,但这为时已晚,这类教训国内外都不少见。用户与开发人员无共同语言,很难进行交流,这是需求分析阶段的特点之一。软件技术基础——软件工程对于一个大型而复杂的软件系统,用户也很难精确完整地提出它的功能要求,只有经过多次长时间的讨论才逐步精确、完善。有时进入到设计、编码阶段才能明确,更有甚者,到开发后期还在提新的要求。这无疑给软件开发带来困难。这是需求分析阶段的特点之二。需求分析对整个开发阶段都具有重大的影响,它是软件开发的基础,一旦需求分析出现错误,将导致整个软件开发的失败。如果在需求分析产生一个错误,这个错误发现越晚,则花的代价越高。这是需求分析的特点之三。软件技术基础——软件工程需求分析的任务是理解和表达用户的要求。用户的要求包括软件系统的范围、功能、性能、限制和约束。范围是指软件的规模有多大,处理的对象及性质是什么;功能是指能做什么样的加工和处理,如数据录入、查询、统计分析、打印报表等;性能是指处理数据量的多少、系统响应时间、查询速度、数据的精度、系统工作可靠性等;限制和约束是指开发费用、开发周期、可使用的资源等。其中功能要求是基本的,它又包括数据要求和处理要求两个方面。软件技术基础——软件工程需求分析是在系统分析员主持下,由用户和软件开发人员参加。参加需求分析的用户人员应有三个层次,即企业负责人,各部门负责人,具体工作人员。他们提供的情况在需求分析阶段都应认真收集和考虑。需求分析的过程。首先召开调查会与上述三个层次的用户人员讨论,了解收集业务过程和业务环境,然后收集与各业务有关的资料、报表、记录等文字或图表材料,还应到现场去参观了解。这种调查研究应反复进行几次,直到把用户要求的功能、性能都搞清楚为止。然后对用户的要求进行分析、理解,最后用文档形式把用户要求的功能、性能表达出来,也就是编写需求说明书。软件技术基础——软件工程需求说明书主要有三个作用:作为用户和软件开发人员之间的合同;作为开发人员进行设计和编程的根据;作为软件开发完成后验收的依据。编写需求说明书时,应该完整、一致、精确、无二义性,同时又要简明、易懂、易修改。它越精确,以后出现错误、混淆、反复的可能性就越小。如“系统查询等待时间很短”等词语,是含糊不清的描述,验收时无法检查,而“查询等待时间不超过5秒”就是精确的描述,验收时就可检查是否达到这个要求。软件技术基础——软件工程需求说明书最终要得到用户的认可,所以用户要能看得懂,并且还能发现和指出其中的错误。由于用户往往不是一个人,而是企业中各个部门的若干人,他们可能提出相互冲突的要求,这就需要协调和解决这些冲突,在需求说明书中用户要求的应该是一致的、无二义性的。需求说明书包括的内容和书写参考格式如下:软件技术基础——软件工程一、概述二、数据描述·数据流图·数据字典·系统接口说明·内部接口三、功能描述·功能·处理说明·设计的限制软件技术基础——软件工程四、性能描述·性能参数·测试种类·预期的软件响应·应考虑的特殊问题五、参考文献目录六、附录软件技术基础——软件工程概述是从系统的角度描述软件的目的和任务。数据描述是对软件系统所必须解决的问题做出的详细说明。功能描述中描述了为解决用户问题所需要的每一项功能的过程细节。对每一项功能要给出处理说明和在设计时需要考虑的限制条件。软件技术基础——软件工程在性能描述中说明系统应达到的性能和应该满足的条件,以及测试的方法和标准,预期的软件响应和可能需要考虑的特殊问题。参考文献目录中应包括与该软件有关的全部参考文献,其中包括前期的其它文档、技术参考资料、产品目录手册以及标准等。附录部分包括一些补充资料,如列表数据、算法的详细说明、框图、图表和其它材料。软件技术基础——软件工程4.3.2结构化分析方法结构化分析(SA,StructuredAnalysis)方法是一种简单实用、使用很广的方法。SA方法与设计阶段的SD方法联合使用,能够较好地实现一个软件系统的研制。软件技术基础——软件工程SA方法的基本思想和步骤是采用“分解”和“抽象”的基本手段,自顶向下逐层分解,使分解工作有条不紊地进行,使复杂的问题有效地被控制。如图4-2所示,系统A很复杂,为了理解它,可以将它分解成1,2,3几个子系统;如果子系统1和2仍然很复杂,把它们再分解成1.1,1.2,…等子系统,如此继续下去,直到子系统足够简单,能够清楚地被理解和表达为止。软件技术基础——软件工程132A1.11.31.22.12.2图4-2分解和抽象软件技术基础——软件工程逐层分解体现了抽象的原则,使人们不至于纠缠于具体细节而是有