2011年软件水平考试软件设计师辅导资料(1)

来源:互联网 发布:凯里欧文总决赛数据 编辑:程序博客网 时间:2024/06/05 17:44

2011年软件水平考试软件设计师辅导资料(1)

第一章 绪论
  第一节 软件工程的产生
  软件:计算机程序及其说明程序的各种文档。"程序"是计算任务的处理对象和处理规则的描述。
  软件的特点:
  1 是一种逻辑产品,与物质产品有很大的区别。
  2 软件产品的生产主要是研制,生产成本主要在开发和研制,开发研制完成后,通过复制就产生了大量软件产品。
  3 软件产品不会用坏,不存在磨损,消耗。
  4 生产主要是脑力劳动,还末完全摆脱手工开发方式,大部分产品是"定做"的。
  5 开发软件的费用不断增加,致使生产成本相当昂贵
  按软件的功能划分-
  系统软件:能与计算机硬件紧密配合在一起,使计算机系统各个部件、相关的软件和数据协调、高效率地工作的软件。如操作系统、数据库管理系统、设备驱动程序以及通信处理程序等。系统软件是计算机系统中必不可少的一个组成部分。
  应用软件:是在特定的领域内开发,为特定目的服务的一类软件。如,CAD-CAM 计算机辅助制造-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位:品名编号
  ⒋加工条目,内容及举例
  加工名:查阅库存
  编号:1﹒2
  激发条件:接收到合格订单时
  优先级:普通
  输入:合格合格订单
  输出:可供货订单,缺货订单
  加工逻辑:根据库存记录
  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)修订测试计划。
  最后一个任务就是评审,在概要设计中,对设计部分是否完整地实现了需求中规定的功能、性能等要求,设计方案的可行性,关键的处理及内外部接口定义正确性、有效性,各部分之间的一致性等都要进行评审,以免在以后的设计中发现大的问题而返工。
  以上就是软件概要设计的四个基本任务,总结一下用八个字表示:两类结构文档评审。(两类结构就是指软件结构和数据结构及数据库设计)
  在了解了软件概要设计的基本任务之后,我们来看看软件设计的基本原理,也就是用于衡量软件设计的技术质量的一些标准。

 


第6章_软件编码
  本章的内容比较少且简单,多为识记的内容,想必每一个学到本课程的同学都已经有过编码(写程序)的经验,也积累了一些编程方面的经验,在本章中,就是从理论的角度来讨论一下程序设计语言的特色及编码应注意的程序设计风格。以理解和记忆为主。所以下面就一些记忆要点作一摘要。
  一、程序设计语言的特性及选择
  程序设计语言有三个特性,他们是:心理特性、工程特性和技术特性。
  1、心理特性:是指影响程序员心理的语言性能,包括歧义性,简洁性,局部性和顺序性,传统性几个方面。
  歧义性:是指某些语言虽然在编译程序中只有一种解释,但在人们看来却可能产生两种或多种不同的解释。
  简洁性:是指人们必须记住的语言成分的数量。
  局部性和顺序性:局部性指语言的联想性,模块的高内聚低耦合使局部性得以加强,提供异常处理的语言特性则削弱局部性。顺序性强则使人们易理解,易接受。
  传统性:由于人们使用语言有一种习惯性。若新语种的传统性强,则人们学习起来容易接受。反之则需要更多时间来学习。可见传统性容易影响人们学习新语种的积极性。
  2、工程特性:从软件工程的观点,程序设计语言的特性着重考虑软件开发项目的需要,因此对程序编码有如下要求:可移植性、开发工具的可利用性、软件的可重用性及可维护性。
  可移植性:是指程序从一个计算机环境移植到另一个计算机环境的容易程度。
  开发工具的可利用性:就是说一个开发工具好不好用,功能多不多,强不强。比如VC++就是一个开发工具。
  软件的可重用性:指编程语言能否提供可重用的软件成分,重用时需要修改调整的内容多不多。
  可维护性:一个易读懂,易修改的软件就是可维护性好的软件。
  3、技术特性。
  二、程序设计语言的选择
  这一节主要要识记一些语言所适合的需求,考虑选择语言的因素有:项目的应用领域、软件开发的方法、软件执行的环境、算法和数据结构的复杂性以及软件开发人员的知识等。
  1、项目应用领域
  科学工程计算:主要有FORTRAN语言,它是世界上第一个被正式推广应用的计算机语言。
  Pascal语言,具有很强的数据和过程结构化能力,它是第一个体现结构化编程思想的语言
  C语言:功能强大,它具有汇编语言的某些特征,使程序运行效率高。
  PL/1语言:适用性广,但由于太庞大而难以推广。
  数据处理与数据应用,主要有Coble语言,广泛用于商业数据处理。这种语言中程序说明与硬件环境说明分开、数据描述与算法描述分开。
  SQL:结构化查询语言,用于对数据库进行存取管理。
  4GL(第4代语言),包括Foxpro、Uniface、PowerBuilder Informix4GL等语言。这种语言有几个特征:
  (1)友好的用户界面
  (2)兼有过程性和非过程性双重特性
  (3)高效的程序代码
  (4)完备的数据库
  (5)应用程序生成器
  实时处理,主要有汇编语言和Ada语言。
  系统软件,主要可用汇编语言、C语言、Pascal和Ada语言。
  人工智能,应选择Prolog、Lisp语言。Lisp是一种函数型语言。Prolog是一种逻辑型语言。
  如果用面向对象方法开发软件,可采用C++、Java语言。
  近年来软件开发环境已进入可视化时代,我们的实践课程中,也都需要你有可视化编程工具进行程序设计,可用的如Visual Basic 、Visual C++、Visual Foxpro 、Delphi等等。我们应该去学习掌握这些可视化编程工具。
  三、程序设计风格
  程序设计风格是指一个人编制程序时所表现出来的特点、习惯、逻辑思路等。
  要形成良好的程序设计风格,应注意以下几个方面:
  源程序文档化:即给标识符取名和注释方面养成良好的习惯,注意写出易读易理解的程序文档。
  数据说明:注意数据说明时的顺序和变量名的排列顺序以及必要的注释。
  语句构造:特别要注意的是,在写程序时要以代码的易读易解为先,不要把为了实现高效率而把一些原本容易理解的语句写成一个复杂的语句。从而降低软件可维护性。
  输入输出效率:要注意的是,追求效率要建立在不损害程序可读性或可靠性基础之上,要先使程序正确、再提高效率,要先使程序清晰,再提高程序效率。

 

 

 第七章_软件测试
  本章介绍了软件测试的有关概念、方法及测试步骤。对本章提到的概念一定要理解记忆清楚,方法需要领会和记忆,设计测试用例的设计应该达到应用层次。本章是重点章。
  一、软件测试的目的(识记)
  软件测试的目的是为了发现错误。因此
  1、软件测试就是为了发现错误而执行程序的过程。
  2、一个好的测试是发现了至今尚未发现的错误测试。
  3、一个成功的测试是发现了至今尚未发现错误的测试。
  二、软件测试方法(识记和领会)
  软件测试方法一般分为两大类:动态测试方法和静态测试方法。
  静态测试是指被测程序不在机器上运行,而是采用人工检测和计算机辅助静态分析的手段对程序进行检测。
  动态测试是指通过运行程序发现错误。一般意义的测试多指动态测试。
  动态测试分为黑盒法和白盒法两种。
  黑盒法,是指测试人员完全不考虑程序的内部结构和处理过程,只在软件接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求。
  举个例子,一头猪就我们的测试对象,输入它能吃的东东,输出它的猪肉和猪粪(有的情况下,输入其他内容可以输出小猪猪)。并且它能自动拒绝吃不能吃的东东(如石头之类),并且不会直接输出金元宝之类的东东。那么这个猪是健康的,正常的。我们的测试不去理会猪的内部有什么花花肠子,怎么把食物变成肉的。这就是黑盒测试法。
  白盒法,是指测试人员须了解程序内部结构和处理过程,以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否有错,实际的运行状态与预期的状态是否一致。
  这就好象是给猪做B超啦,CT啦,胸透啦什么的,把它里面的花花肠子看个透,并且还要看看吃进去的东东都经过哪里,怎么出来的,通过这些检测来确定它每个脏器的功能是否正常,处理食物的状态是否和理论上的一致或者发现它肚子里长了个瘤。
  呵呵,这种比较太粗鄙了,也不完全像。反正就是这样,一个是只看输入和输出,另一个是看里面的细节。但是两种测试法都不可能对程序进行穷举测试。
  三、测试用例的设计(简单应用)
  首先来了解白盒技术
  白盒测试是结构测试,所以被测对象基本上是源程序,以程序内部逻辑为基础设计测试用例。
  使用白盒技术,要尽可能覆盖最多的路径,当程序内部存在判定时,就要考虑逻辑覆盖。
  (1)语句覆盖:就是要设计足够多的测试用例(也就是输入的数据),使被测程序中每个语句至少执行一次。在这里,重点在于每个语句即每个语句都要被执行过。设计时要记住这一点。
  (2)判定覆盖:指设计足够的测试用例,使得程序中每个判定表达式至少获得一次"真"值和"假"值,从而使程序的每一个分支至少都通过一次,因此判定覆盖又称为"分支覆盖"。它和语句覆盖有什么不同呢?
  就在于判定,语句覆盖不管是真是假,只要执行过这句就成,而判定覆盖则必须让这个语句的执行结构为真和为假都要有测试用例给出。所以判定覆盖比语句覆盖严格些。但是判定覆盖也不能检查出全部错误,因为有些条件语句即使写错了,也同样能够产生正确真值或假值。
  比如 (a=2)or(x>1),由于这个or的存在,那么把x>1错写成x<1时,如果用例为a=2,语句的值都为"真"。要解决这个问题,就要看下面的覆盖。
  (3)条件覆盖:是指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。这就比上面的单是判定覆盖要严格得多了,如上例,(a=2)
  or (x>1);在这里必须使a=2 、x>1,a≠2、x≤1均出现一次。
  (4)判定/条件覆盖:上面条件覆盖也不一定满足判定该,因为只符合条件覆盖的用例可能会不满足每个判定语句均有真值或假值出现。因此要两者兼顾,判定条件覆盖就是指设计足够
  的测试用例,使得判定表达式中每个条件的所有可能取值至少出现一次并且每个判定表达式所有可能的结果也至少出现一次。
  (5)条件组合覆盖:是指设计足够的测试用例,使得每个判定表达式中条件的各种或能的值的组合都至少出现一次。这就是前面两个覆盖的组合。
  (6)路径覆盖:是指测设计足够的测试用例,覆盖被测试程序中所有可能的路径。
  这六种覆盖进行比较有下面一个表:
  条件组合发现错误的能力较强,凡满足其标准的测试用例,也必然满足前四种覆盖标准。在实际的逻辑测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例来达到路径覆盖的测试标准。
  2、循环覆盖:当程序中存在循环结构时,要覆盖所有的路径是不可能的,但是可以通过限制循环结构来测试。
  3、基本路径测试:由于实际问题中,程序的路径是庞大的,因此要将覆盖的路径压缩到一定限度才能解决这个问题。基本路径测试就是在程序控制流程图的基础上,通过分析控制构造的环路复杂性,导出基本路径集合从面设计测试用例保证这些路径至少通过一次。
  再来看看黑盒技术
  黑盒测试是功能测试。测试的是程序的接口。在设计测试用例时有以下几种方法:等价类的划分、边界值分析、错误推测和因果图。这几种方法都不能提供一组完整的测试用例,在实际测试中应把各种方法结合起来使用。
  1、等价类的划分:是将输入数据按有效的或无效的(也称合理的或不合理的)划分成若干个等价类,测试每个等价类的代表值就等于对该类其他值的测试。用该法设计测试用例的步骤为:
  (1)划分等价类(列一个表)
  (2)确定测试用例:根据已划分的等价类,按以下步骤设计测试用例:
  1)为每个等价类编号
  2)设计一个测试用例,使其尽可能多的覆盖尚未被覆盖过的合理等价类。重复这步直到所有合理等价类被测试用例覆盖。
  3)设计一个测试用例,使其只覆盖一个不合理等价类。重复这一步直到所有不合理等价类被覆盖。
  要注意课本上的例子,会应用这种方法设计测试用例
  2、边界值分析:也就是在为设计测试用例时,在等价类范围内选择一些边界值作为测试用例,这样可以比单用等价类划分法所选的测试用例能查出更多错误,因为实践表明,程序更容易在处理边界值时发生错误。
  3、错误推测:通常根据经验或直觉来推测程序中可能出现错误的情况,并有针对性的编写检查这些错误的测试用例。
  4、因果图:因果图能够有效地检测输入条件的各种组合可能会引起的错误。它的基本原理是通过画因果图,把用自然语言描述的功能说明转换为判定表,最后为判定表的每一列设计一个测试用例。
  在以上几种软件测试方法,各有所长,但各有所短,在实际测试中,应该采用综合策略,通常先用黑盒法设计基本的测试用例,再用白盒法补充一些必要的测试用例。
  本节具体要掌握的就是等价类划分及边界值的测试用例设计。
  四、软件测试过程(识记)
  软件测试的步骤通常有四步:单元测试、集成测试、确认测试和系统测试。
  1、单元测试主要针对模块的五个基本特征进行测试:模块接口、局部数据结构、重要的执行路径、错误处理和边界条件。单元测试时要用到"驱动模块"和"桩"模块。注意要概念:驱动模块是用来模拟被测试模块的上级调用模块。桩模块则用来代替被测试模块所调用的模块。
  2、集成测试有两种方法:非渐增式测试和渐增式测试。
  非渐增式测试是指首先对每个模块分别进行单元测试,再把所有模块组装成一个完整的系统进行的测试。而渐增式测试就是逐个把未经测试的模块组装到已经过测试的模块上去进行集成测试,每加入一个新模块进行一次集成测试,重复此过程直到程序组装完毕。渐增式测试有两种不同的组装方法:自顶向下和自底向上结合。注意两者区别。
  3、确认测试又称有效性测试,它的任务是检查软件的功能与性能是否与需求规格说明书中确定的指标相符合。因而需求说明规格说明是确认测试的基础.确认测试有两项工作:进行确认测试与软件配置审查。
  4、系统测试:即要对软件所运行的整个系统(包括硬件、外设、其他软件和操作人员等)结合在一起进行测试,确定其是否能够协调工作。
  五、调试(识记)
  软件测试的目的是尽可能多地发现程序中的错误,而调试则是在进行了成功的测试之后才开始的工作。调试的目的是确定错误的原因和位置,并改正错误,因此调试也称为纠错(Debug)。
  调试方法有简单的调试方法、归纳法、演绎法和回溯法等。


第8章_软件维护
  软件维护是软件工程的一个重要任务,作为理论,本章的内容比较简单,多为识记领会内容,主要应注意一些概念。其中的软件可维护性是本章的重点内容。
  一、软件维护的内容
  有四种:校正性维护,适应性维护,完善性维护和预防性维护。
  1、校正性维护:指为了识别和纠正错误,修改软件性能上的缺陷,进行确定和修改错误的过程。占整个维护工作的21%.
  2、适应性维护:为了使本软件适应硬件和软件的变化而修改软件的过程称为适应性维护。占整个维护活动的25%。
  3、完善性维护:增加软件功能、增强软件性能、提高运行效率而进行的维护活动称为完善性维护。占整个维护工作的50%.
  4、预防性维护:为了提高软件的可维护性和可靠性而对软件进行的修改称为预防性维护。只占4%。
  二、维护的特点
  1、非结构化维护和结构化维护:主要是开发过程是否用软件工程方法,若各阶段均有相应的文档记录,则容易维护,采用结构化维护可以大大提高软件维护效率。
  2、软件维护的困难性:是由于软件需求分析和开发方法的缺陷。
  3、软件维护的费用:在总费用中的比重不断增加,已经上升到了70%~80%或更多,我们看到的软件不断升级就是维护的体现。
  三、维护任务的实施
  1、维护工作要建立维护机构,通常是成立维护小组,有临时维护小组和长期维护小组之分。
  2、维护的流程是:(1)制定维护申请报告。(2)审查申请报告并批准。(3)进行维护并做详细记录。(4)复审。
  3、维护技术:有两类维护技术,即面向维护的技术和维护支援技术。(1)面向维护技术是在软件开发阶段用来减少错误、提高软件可维护性的技术。(2)维护支援技术是在软件维护阶段用来提高维护作业的效率和质量的技术。
  4、维护的副作用:有三种:
  (1)编码副作用:即在修改源代码时可能引入错误。
  (2)数据副作用:在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致错误,数据副作用是修改软件信息结构导致的结果。
  (3)文档副作用:即对可执行软件的修改没有反映在文档中,就会产生文档副作用。
  四、软件可维护性
  为了使软件能够易于维护,必须考虑使软件具有可维护性。
  1、软件可维护性是指软件能够被理解、校正、适应及增强功能的容易程度。
  软件的可维护性、可使用性、可靠性是衡量软件质量的几个主要特性。
  软件的可维护性是软件开发阶段的关键目标。
  软件可维护性的七个质量特征:可理解性、可测试性、可修改性、可靠性、可移植性、可使用性和效率。
  2、度量软件可维护性的方法:质量检查表、质量测试、质量标准。
  3、提高可维护性的方法:
  (1)建立明确的软件质量目标
  (2)利用先进的软件开发技术和工具
  (3)建立明确的质量保证工作
  (4)选择可维护的程序设计语言
  (5)改进程序文档
  注:本章的习题及答案基本上就是以上内容。在复习时,并不一定会出到这些题目,主要是对整个维护工作特点和过程的理解领会,在此基础上,不需要太多的记忆也能正确答题。

 

第10章面向对象的方法
  面向对象的方法是今后软件开发方法的主流。学习本章,最好是学过面向对象程序设计语言,这样可以对对象、类、类的层次结构、方法、消息等概念更容易理解。本章总的要求是,掌握面向对象的基本思想、基本概念、基本原理,掌握三种模型的基本概念和构造方法,掌握面向对象的分析、设计和实现的过程。
  一、面向对象的基本概念
  1、什么面向对象?首先了解几个概念:
  1、对象:对象是人们要进行研究的任何事物。具体一点讲就是研究对象。它可以是有形实体,也可以是作用、事件、性能说明等,当然,如果女朋友成为你研究的对象时,对象也可以是你的女朋友。
  2、对象的状态和行为:对象有自身的状态,比如你的女朋友有她的姓名(叫小丽)、年龄(22岁)、工作单位等。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为,比如"小丽.跳槽到(某公司)"这个行为将使她的工作单位这个状态发生变化。
  3、类:具有相同或相似性质的对象的抽象就是类。如桃树、李树、樟树等是具体的树,抽象之后得到"树"这个类。类具有属性,属性是状态的抽象,如一棵李树的高度是3米,樟树是10米,树则抽象出一个属性"高度"。类具有操作,它是对象行为的抽象。
  4、类的结构:有两种,一种是"一般-具体"结构,如植物、树都是类,它们之间是抽象到具体的关系,即树是一种(is a)植物。还有一种就是"整体-部分"结构,如计算机是类、CPU也是类,则计算机与CPU之间就是整体与部分的关系。
  5、消息和方法:对象之间进行通信的构造叫做消息,比如小丽是一个对象,上司发出一个消息:小丽.出差到(深圳)。这样,相应的对象接收到这个消息就会给予响应,在这个消息中,小丽是对象名,出差到就是方法名,深圳就是参数。在类中操作的实现过程叫做方法。上面的出差到(某地)这个方法如何实现呢,就是买车票,乘车到某地。这个过程就是方法。
  总之,面向对象这种思想很符合人们观察世界的自然思想。在很多时候我们可以用自然的观点去理解面向对象。
  2、面向对象的特征有四点:对象唯一性、分类性、继承性和多态性。
  3、面向对象的要素:抽象、封装性、共享性
  4、面向对象技术强调的是对象结构而不是程序结构。
  5、面向对象的开发方法主要有以下几种:Coad方法、Booch方法、OMT方法和OOSE方法,最新的统一建模语言UML则不仅统一了Booch方法,OMT方法、OOSE方法,而且对其作了进一上的发展,最终统一为大众所接受的标准建模语言。
  二、面向对象的模型(简单应用)
  面向对象的模型包括三个,它们分别是:描述系统数据结构的对象模型、描述系统控制结构的动态模型和和描述系统功能的功能模型。这三种模型都涉及到数据、控制和操作等共同的概念,只是每种模型描述的侧重点不同。这三种模型从三个不同但又密切相关的角度模拟目标系统,它们各自从不同的侧面反映了系统的实质性内容,综合起来则全面反映了对目标系统的需求。
  1、对象模型:它表示了静态的、结构化的系统数据性质,描述了系统的静态结构,它是从客观世界实体的对象关系角度来描述,表现了对象的相互关系。该模型主要关系的是系统中对象的结构、属性和操作,使用了对象图的工具来刻画,它是分析阶段三个模型的核心,也是其他两个模型的框架。涉及及的概念有,对象和类、关联和链。
  2、动态模型:是与时间和变化有关的系统性质。该模型描述了系统的控制结构,它表示了瞬时的、行为化的系统控制性质,它关系的是系统的控制,操作的执行顺序,它从对象的事件和状态的角度出发,表现了对象的相互行为。该模型描述的系统属性是触发事件,事件序列、状态、事件与状态的组织。使用状态图作为描述工具。涉及的重要概念是事件、状态、操作等。
  3、功能模型:描述了系统的所有计算。功能模型指出发生了什么,动态模型确定什么时候发生,而对象模型确定发生的客体。功能模型表明一个计算如何从输入值得到输出值,它不考虑所计算的次序。功能模型由多张数据流图组成。数据流图说明数据流是如何从外部输入、经过操作和内部存储输出到外部的。功能模型也包括对象模型中值的约束条件。功能模型说明对象模型中操作的含义、动态模型中动作的意义以及对象模型中约束的意义。相关的概念有:数据流图中的处理、数据流、动作对象、数据存储对象等。
  三、面向对象的分析(简单应用)
  面向对象分析的目的是对客观世界的系统进行建模。分析问题有三种用途:用来明确问题需求;为用户和开发人员提供明确需求;为用户和开发人员提供一个协商的基础,作为后继的设计和实现的框架。通过分析,建立对象模型、动态模型和功能模型。
  四、面向对象的设计(领会)
  1、面向对象设计的准则:
  (1)模块化:对象就是模块,它是把数据结构和操作这些数据的方法紧密地结合在一起所构成的模块。
  (2)抽象:包括过程抽象、数据抽象、规格说明抽象及参数化抽象等。
  (3)信息隐蔽:在面向对象方法中,信息隐蔽通过对象的封装性来实现。
  (4)低耦合:低耦合是设计的一个重要标准,应该避免对象之间的高耦合,强调对象间的低耦合。
  (5)高内聚:在面向对象设计中存在三种内聚:操作内聚、类内聚及一般-具体内聚,紧密的继承耦合与高度的一般--具体内聚是一致的。
  2、面向对象设计的启发规则:
  (1)设计结果应该清晰易懂
  (2)一般--具体结构的深度应适当
  (3)设计简单的类
  (4)使用简单的协议
  (5)使用简单的操作
  (6)把设计变动减至最小
  五、面向对象的实现(领会)
  面向对象实现主要包括两项工作,把面向对象设计结果翻译成用某种程序设计语言写成的面向对象程序;测试并调试面向对象程序。
  在开发过程,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的实例中,而整个程序则被封装在一个更高级的类中。


 

原创粉丝点击