第一章 绪论
一、 软件的基本概念
1. 软件是计算机系统中的程序及其文档。
2. 程序是计算机任务的处理对象和处理规则的描述;文档是为了理解程序所需的阐述性的文书和资料。
3. 文档一般主要面向管理人员、开发人员、用户、使用维护人员。
4. 文档在软件工程中的作用:(1)提高软件开发过程的能见度。(2)提高开发效率。(3)
作为开发人员阶段工作成果和结束标志。(4)记录开发过程有关信息便于使用和维护。(5)提供软件运行、维护和培训等资料。(6)便于用户了解软件功能、性能。 5. 软件的生产经历了三个阶段:
* 程序设计时代:生产方式是个体手工劳动,使用工具是机器、汇编语言,主要通过汇
编来实现,不注重程序设计方法。
* 程序系统时代:生产方式是作坊式小集团合作生产,生产工具是高级语言,开始提出结构化方法。
* 软件工程时代:生产方式是工程化生产,使用数据库、网络、先进的开发技术和方法。 6. 软件既是知识性(逻辑性)工业产品,具有一些独特的特性是:
* 软件是逻辑产品,具无形性,通过计算机的执行才能体现它的功能和作用。 * 软件只会退化,不存在磨损和消耗问题。
* 成本主要体现在软件的开发和研制上,可进行大量的复制。 * 主要靠脑力劳动生产,开发和维护成本高。 7. 软件的主要结构和功能是在分析设计阶段决定的。
8. 软件的复杂性主要体现在程序的复杂性,即模块内程序的复杂性。直接关联到软件的
1
简单和可理解性、开发费用多少、开发周期长短和软件潜伏错误的多少。
二、 软件危机
1. 软件危机是指在软件开发和维护时遇到的一系列难以控制的问题导致的供需矛盾。出
现在软件发展的第二阶段末期,随着第三代计算机的诞生之际。 2. 软件危机主要体现在:
* 软件发展速度跟不上硬件的发展和用户需求。 * 软件成本和开发进度不能预先预算,用户不满意。 * 软件产品质量差,成本高,可靠性没有保证。 * 软件可维护性差,产品没有配套文档。
3. 软件危机产生原因:(1)软件规模变大,结构更加复杂。(2)软件开发管理困难。(3)软件
开发技术和工具落后。(4)软件开发费用增加。(5)采用落后的个体手工生产方式开发。
4. 解决途径:(1) 纠正对软件开发的错误观念。(2) 提高软件工程管理水平,重视文档重
要性。(3) 使
用好的软件开发工具,研究软件开发技术,规范软件开发流程,提高开
发效率。
5. 为了克服软件危机,人们首先想到要用形式化方法来开发软件。
三、 软件开发
1. 软件开发的本质是实现问题空间的概念和处理逻辑到运行平台的概念和处理逻辑间的
映射。
2
2. 软件开发基本途径:先通过需求建模,把问题域的概念和处理逻辑向需求(抽象)层次进
行映射,再把需求层的概念和处理逻辑向设计(抽象)层进行映射,依次进行,直到映射到运行平台这一抽象层为止。
3. 软件开发涉及的技术:过程方向(即求解软件的开发逻辑)和过程途径(即求解软件的开发
手段,基本手段是问题建模)。
4. 软件开发方法:是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过
程。
5. 问题建模是指运用所掌握的知识,通过抽象,给出该问题的一个结构。建模手段有结构
化方法、面向对象方法和诸多面向数据结构的方法。
6. 模型是待建系统的任意抽象,包括所有的基本能力、特性或其他一些方面,而没有任何
冗余的细节,是在特定意图下所确定的角度和抽象层次上对物理系统的描述,通常包含对该系统边界的描述、对系统内各模型元素以及它们之间关系的语义描述。
7. 软件系统模型大体分为概念模型和软件模型,而软件模型进一步分为设计模型、实现模
型、部署模型。
四、 软件开发环境
1. 软件开发环境是相关的一组软件工具的集合,支持一定的软件开发方法或按照一定
的软件开发模型组织而成,与软件生存期、软件开发方法、软件处理模型密切相关。 ? 按解决问题分类:程序设计环境、系统合成环境、项目管理环境。
? 按演变趋向分类:以语言为中心的环境、工具箱环境、基于方法的环境(分为支持
软件开发周期特定阶段的管理和开发过程管理。后者即项目计划和控制、任务管理)。
3
2. 软件开发环境是高度集成的一体化系统,主要目标是提高软件开发的生产率、降低
软件成本。
五、 软件工具
1. 软件工具是指为支持计算机软件的开发、维护、模拟、移植或管理而研制的程序系
统,是为了支持软件人员开发和维护活动而使用的软件。
2. 软件工具由工具、工具接口、工具用户接口组成,主要目的是提高软件生产率和改
善软件质量。
3. 发展特点:(1) 由单个工具到多个工具集成化方向发展。(2) 重视用户界面设计,
不断采用新理论技术。(3) 它的商品化推动软件产业的发展,进而增加了对软件工具的需求,促进了软件工具的商品化过程。
4. 分为6类:模拟工具、开发工具、测试和评估工具、运行和维护工具、性能测试工
具、程序设计支持工具。
六、 软件工程
1. 由于软件危机,产生了以软件开发技术(主要研究软件开发方法、过程、工具和环境)
和软件工程管理(主要研究软件管理学、心理学、经济学)为研究内容的软件工程学科,以达到软件开发工程化的最终目标。
2. 软件工程是用科学知识、技术以及工程管理原则和方法来定义、开发、维护软件,按
预算和进度实现满足用户要求的软件产品的一门综合性的交叉学科。
3. 软件工程是一种自顶向下分阶段实现的软件程序开发方法,着重于建造软件系统,要
用管理科学的方法和原理进行软件生产的管理。
4
4. 软件工程的概念于1968年提出,涉及计算机科学、工程科学、管理科学、数学等领
域。
5. 软件工程面临的问题有:软件费用、软件可靠性、软件可维护性、软件生产率和软件
重用。
6. 软件工程过程是指规定了获取、供应、开发、操作、维护、管理、支持过程时,要实
施的过程、活动和任务。
7. 软件工程的纵向分解是把软件生产分为几个阶段。
七、 计算机辅助软件工程
1. 计算机辅助软件工程(CASE),英文是 Computer Aided Software Engineering,
是一组工具和方法的集合,可以辅助软件开发生命周期各阶段进行软件开发。 2. 较早期的CASE是结构的基于图形的CASE。
3. CASE领域是一个应用、集成和综合的领域。它把软件开发技术、软件工具和软件
开发方法集成到一个统一而一致的框架,吸收了CAD、网络、软件工程、数据库、操作系统和许多其他计算机领域的原理和技术。
4. 根据支持的范围,CASE工具可分为窄支持(支持单个过程任务的工具)、较宽支
持(工作台支持某一过程所有活动或某些活动)、一般支持(环境软件过程所有活动或至少大部分活动)工具。另外还可根据支持过程和功能进行分类。
5. CASE生存期步骤:CASE需求、CASE剪裁、CASE引入、CASE操作、CASE
演化、CASE废弃。
6. CASE系统所涉及的技术有:支持软件开发过程本身的技术、支持软件开发过程管
理的技术。从CASE系统产生方式看还有一种生成CASE系统的生成器所采用的
5
技术:元-CASE技术。 7. 集成化CASE的五级模型:
? 平台集成:工具运行在相同的硬件/操作系统平台上。
? 数据集成:不同软件工程能相互交换数据,工具使用共享数据模型来操作。分为三
个级别:共享文件、共享数据结构、共享仓库。
? 表示集成:工具使用相同的用户界面。分为三个级别:窗口系统集成、命令集成、
交互集成。
? 控制集成:工具激活后能控制其它工具的操作。
? 过程集成:工具在一个过程模型和“过程机”的指导下使用。即CASE系统嵌入了关
于过程活动、阶段、约束和支持这些活动所需的工具的知识。
第二章 软件需求和软件需求规约
一、 可行性研究
1. 可行性研究是用最小的代价在尽可能短的时间内确定该软件项目是否能够开发,是否
值得开发,给出“行或不行”的回答。
实质是以较抽象的方式进行一次简化的、压缩了的需求分析、设计过程。它是系统方案实现的必要性。
2. 可行性研究任务:(1)先进行概要的分析研究,初步确定项目的规模和目标、约束和
限制,把它们清楚的列出来。(2)分析员进行简要的需求分析,抽象出项目逻辑结构,建立逻辑模型。(3)经压缩设计,探索出若干种可选的解决方法,对每种方法研究其
6
可行性。
3. 可行性研究主要考虑开发风险、资源有效性和技术等情况,具体分为:
技术可行性:指在现有条件下估算开发项目的技术风险。对项目的功能、性能、限制
条件进行分析,要解决技术风险问题,研究硬件等开发资源的有效性。研究内容为:成本-效益分析、公司经营长期策略、开发所需成本和资源、潜在的市场前景。
经济可行性:指进行开发成本的估算及预期取得经济效益的评估。研究范围是效益分
析。
社会可行性:涉及范围有合同、责任、侵权、用户组织的管理模式、规范及其他一些
技术人员常不了解的陷阱。
4. 可行性研究步骤:(1)确定项目规模和目标。(2)研究正在运行的系统。(3)建立新
系统的高层逻辑模型。(4)导出和评价各种方案。(5)推荐可行的方案。(6)编写可行性研究报告。
5. 可行性研究报告的主要内容有:引言、可行性研究前提、对现有系统的分析、所建议
系统的技术可行性分析、所建议系统的经济可行性分析、社会因素可行性分析、其他可供选择的方案、结论意见。
6. 项目开发计划是一种管理性文档,内容包括:项目概述、实施计划、人员组织和分工、交付期限。
7. 与“可行性研究报告”、“项目开发计划”文档有关的人员是管理人员和开发人员。与“程序
维护手册”文档有关的人员是管理人员和维护人员。 8. 可行性分析中,系统流程图用于描述当前运行系统。
7
二、 效益分析
1. 成本-效益分析首先估算开发系统的开发成本,再与可能取得的效益进行比较和权衡。
目的是从经济角度评价开发一个新的软件项目是否可行。
2. 效益分为有形效益(用货币的时间价值、投资回收期、纯收入等指标度量)和无形效
益(从性质和心理上衡量)。
纯收入:是软件生存周期内系统的累计经济效益和投资之差。 投资回收期:是累计的经济效益等于最初的投资费用所需的时间。
货币的时间价值:通常用利率表示货币的时间价值。设年利率为i,现存入P元,n年
后的价值为F=P*(1+n*i)。
3. 一个软件开发成本为5万元,寿命为3年。未来3年的每年收入预计为22000元、24000元、26620
元。银行年利率为10%。试对此项目进行成本效益分析,以决定其经济可行性。 解:3年后,5万的价值为50000*(1+3*10%)=65000元。
3年软件总获利为22000*(1+2*10%)+24000*(1+1*10%)+26620=79420
元>65000元,所以此项
目盈利,经济可行。
4. 系统的经济效益是因使用新的系统而增加的收入和使用新的系统可以节省的运行费用之和。
三、 需求和需求分析
1. 软件需求以一种技术形式,描述了一个产品/系统应具有的功能、性能和其他性质。如
功能要求、环境需求、用户界面要求。
8
2. 需求的性质:必要的、无歧义的、可测的、可跟踪的、可测量的。 3. 需求分为:
功能需求:规约系统或系统构件必须执行的功能的一类需求,是整个需求的主体。 非功能需求:指软件产品为满足用户业务需求而必须具有的除功能需求以外的特性,
包括性能需求、外部接口需求、设计约束需求和质量属性需求。
4. 需求分析是指开发人员要准确理解用户需求,进行细致的调查分析,将用户非形式的
需求转化成完整的需求定义,再由需求定义转化到相应的需求规格说明的过程。可概括成“理解,分解,表达”六字。
5. 需求分析是软件开发工作的基础,基本任务是准确定义新系统的目标,为满足用户的
需要,回答系统必须做什么的问题。首要任务是确定软件系统功能,定义需求并建立系统功能模型。
6. 需求分析阶段需编写的文档有:
需求规格说明书:是软件设计、验收的依据,双方对软件要做什么的共同理解,也是
需求分析的最终结果。内容包括对主要数据、功能、用户界面和运行环境、软件性能的描述。一般伴随可行性分析报告产生。
初步用户使用手册、确认测试计划。
7. 需求分析之前要进行必要的可行性分析,研究对象是用户要求,用户和分析设计人员
双方确定对问题的功能需求、性能需求、环境需求、用户界面需求。此阶段建立原型的目的是确定系统的功能和性能需要求。
8. 需求分析的难点:(1)问题的复杂性。(2)交流障碍。(3)用户需求易变性。(4)用
户陈述的不一致性和不完备性。
解决途径:(1)与用户充分交流。(2)合同约束需求的变更。(3)选用适当的开发模
9
型。(4)用户参与需求评审。(5)需求规格说明由用户确认。(6)研究需求分析的方法和自动化工具(如CASE技术)。
9. 各种需求分析方法都有共同适用的基本原则:(1)能表达和理解问题的数据域和功能域。
(2)可把一个复杂问题按功能分解并可逐 层细化(描述软件主要处理的数据域,并给软件开发提供一种可转化为数据设计、结构设计、过程设计的数据与功能表示)。(3)建模。
10. 需求分析阶段可用的工具有:数据流图、判定表、数据字典等。 11. 需求分析阶段的工作:
对问题的识别和分解、分析和综合:(1)确定对系统的综合要求。(2)分析系统的数
据要求。(3)导出系统的逻辑模型。(4)修正系统开发计划。
导出软件逻辑模型、制定规格说明书、需求分析评审。 12. 初始需求发现技术:自悟、交谈、观察、小组会、提炼。
13. 常用的软件需求分析方法有:结构化分析方法(SA)、功能分解法、信息建模法、面向对
象的分析方法(OOA)。
四、 需求规约
1. 需求规约是一个系统/产品所有需求陈述的正式文档,它表达了一个系统/软件产品的概念模型。
2. 需求规约的性质:(1)重要性和稳定性程度。(2)可修改的。(3)完整的。(4)一致的。
3. 需求规约的三种表达风格:
10
非形式化的需求规约:以一种自然语言来表达。
半形式化的需求规约:以半形式化符号体系(包括术语表、标准化的表达格式等)表达。
形式化的需求规约:以一种基于良构数学概念的符号体系来编制。
4. 需求规约和项目需求是两个不同的概念。需求规约是开发组织和用户之间一份事实上
的技术合同书,
关注产品需求,回答“交付给客户的产品/系统是什么”;而项目需求是客户和开发者之间对产品/系
统需求的理解,关注项目工作与管理,回答“开发组要做的是什么”。
5. 需求规约的内容包括:引言、信息描述、功能描述、行为描述、检验标准、参考书目和附录。
6. 需求规约的作用:
1)需求规约是软件开发组织和用户之间事实上的技术合同书,是产品功能及其环境的体现。
2)对于项目的其余大多数工作,需求规约是一个管理控制点。 3)对于产品/系统的设计,需求规约是一个正式的、受控的起始点。 4)需求规约是创建产品验收测试计划和用户指南的基础。
第三章 结构化方法
一、 结构化分析方法
11
1. 软件系统/产品的需求工作中的三大挑战:问题空间的理解、人与人之间的通信、需求
的变化性。
2. 在软件需求分析和设计工程的对象是数据和程序,按实施原则的处理是先数据后程序。
每一种分析方法必须能够表达和理解问题的数据域(包括数据流、数据内容、数据结构)和功能域(反映数据域的控制信息)。
3. 结构化分析方法(SA)是面向数据流进行需求分析的方法。是一种建模活动,使用简
单易读符号,根
据软件内部数据传递、变更的关系,以“分解”和“抽象”为基本原则,以自顶向下逐层分解的分析策略,描绘满足功能要求的软件模型。
4. SA分析步骤:(1)了解当前系统的工作流程,活得当前系统的物理模型。(2)抽象出
当前系统的逻
辑模型。(3)建立目标系统的逻辑模型。(4)做进一步的补充和优化。
5. SA方法优点:适用于开发数据处理类型软件的需求分析,利用半形式化工具表达需求,
简明易懂。
缺点:(1)是一个静态模型,不反映处理顺序,不能控制模型,不适合描述实时控制系统。(2)只有和E-R图结合才能较完整描述用户对系统的需求。(3)只有和形式化方法结合才能精确描述软件需求。(4)不适合描述人机界面系统的要求。(5)要借助需求分析工具,提高需求分析质量和效率。
6. SA方法特征:(1)严格定义需求。(2)划分开发阶段。(3)制定规范文档。(4)分析
控制流程是其 主要特征。
7. SA是早期的软件工程方法,主要用于数据处理方面的问题。
12
二、 结构化方法描述工具 1. 数据流图(DFD图),以图形方式描绘数据在系统中的流动和处理过程,只反映系统必须完成的逻辑 功能,是一种功能模型。体现系统“做什么”的功能,通过功能分解可完成对其细化,描述系统的分解。基本元素有: 数据流:是数据的流动,具有名字和方向。 加工:又称数据处理,是数据的变换单位,接受输入的数据内容或数据结构 ,进行处理并产生输出,必须有名字。 数据存储:是数据的静态结构,也叫文件,指暂时保存的数据,是数据库文件或任何形式的数据组织,必须用名词或名词短语命名。 数据源:是数据流的起点,必须有名字; 数据潭:是数据流的归宿地,不能作为计算机处理的成分,必须有名字,和数据源统称外部实体。 “数据流”表示 “加工”表示 “数据存储”表示 “数据源”和“数据潭”表示 使用这些基本元素应注意的问题:①数据流起到连接其它实体的作用;在应用中,数据流和数据存储一般需要给出标识,但对流入或流出数据存储的数据流,在语义比较清晰的情况下可省略;②加工之间可以有多个数据流,这些数据流可以没有直接关系,数据流图也不表明他们的先后次序。 2. 数据字典(DD)是用来定义数据流图各个成分的具体含义,以准确、无二义性的说明 13 方式为系统的分 析、设计、维护提供有关因素的一致的定义和详细的描述。 建立形式有:手工建立、利用计算机辅助建立并维护。它和数据流图共同构成系统的逻辑模型,是需求说明书重要组成部分。 四类基本条目:数据流、数据项、数据存储、基本加工条目。 数据字典定义数据流或数据存储组成时使用的符号: = 被定义为 + 与 {|}或 {}重复 m{}n重复 ()可选 “”数据元素 ..连接符 3. 加工逻辑是只指对数据流图中的数据处理进行逻辑上的说明,详细描述数据流图中不能再分解的每一个加工,采用三种工具: 结构化语言:介于自然语言和形式化语言间的一种半形式语言。非为外层(采用顺序、选择、重复三种基本结构,描述控制结构)和内层。 判定表:构成如下: 条件类别 操作 条件组合 操作执行 判定树:是判定表的变形,更直观易懂。与判定表主要用于描述存在多个条件复杂组合的判断问题。 4. 另外还有结构化英语等工具。 三、 数据流图的绘制 1. 绘图方法有:自顶向下、分层绘制、初步求精等。 2. 步骤:(1)先画出系统的输入输出,即先画顶层数据流图。顶层数据流图包括一个加工 14
以表示被开发
的系统。
(2)画系统内部,即画下层数据流图。将层号从0号开始编号,采用自顶向下、
由外向内德原则。画更下层数据流图时,则分解上层图中的加工,一般沿输入流方向,凡数据流的组成或值发生变化的地方则设置一个加工,一直进行到输出流。如果加工的内部还有数据流则继续分解,直到每个加工足够简单,不能分解为止。不能分解的加工叫基本加工。
3. 注意问题:(1)命名:不能使用缺乏具体含义的名字,加工名应能反映处理的功能。 (2)画数据流而不是控制流:数据流名称只能是名词或名词短语,整个图
中不反映加工的执行顺序。一般不画物质流。
(3)每个加工至少有一个输入数据流和一个输出数据流,反映出此加工的
来源和结果。
(4)编号:某个加工分解成一张数据流图时,上层图为父图,下层图为子
图。子图和其上的所有加工应编号,子图编号和父图编号相对应。
(5)父图和子图的平衡。子图的输入输出数据流同父图加工的输入输出数
据流必须一致。
(6)当局部数据存储作为某些加工的数据接口或某些加工特定的输入输出
时,就把它画下来,有助于实现信息隐蔽性。
(7)提高数据流图的易理解性。
四、 数据流图的基本类型
1. 数据流图一般分为变换型数据流图和事务型数据流图。两者的区别在于前者具有明显
15
变换特征的数据
流图,后者适用于具明显事物特征的数据流图。
2. 变换型数据流图是一个顺序结构,由输入、变换、输出三部分组成。工作过程分为:
取得数据、变换
数据、给出数据。
事务型数据流图是将它的输入流分离成许多发散的数据流,形成许多加工路径,并根
据输入的值选择
其中一个路径来执行。
3. 变换型数据流图设计步骤:(1)确定DFD的变换中心、逻辑输入和逻辑输出。(2)设
计软件结构的顶层和第一层:变换结构。(3)设计中、下层模块。(4)设计的优化。 4. 事务型数据流图设计步骤:(1)确定DFD的事务中心和加工路径。(2)设计软件结构
的顶层和第一层:事务结构。(3)设计中、下层模块、优化等工作,与变换型流程图设计一致。
五、 结构化设计和总体设计
1. 软件设计是应用各种各样的技术和原理,定义一个系统或部件的框架、组成、接口或
其他特征的过程或“该过程的结果”,是将软件需求变换成软件表示的过程。 2. 模块在程序中是数据说明、可执行语句等程序对象的集合,或是单独命名和编址的元
素,在软件体系结构中,模块是可组合、分解和更换的单元。基本属性有接口、功能、逻辑(反映内部特性)、状态。 5. 软件设计基本原理是:
抽象:即抽出事物本质的共同特性而暂不考虑细节和其它因素,能确定组成软件的过
16
程实体。
模块化:解决一个复杂问题时自顶向下逐层把软件系统划分为若干模块的过程。 信息隐藏:在设计和确定模块时,使一个模块内包含的信息,对于不需要这些信息的
其他模块来说,是不能访问的。定义和实施对模块过程细节和局部数据结构的存取限制。
模块独立性(最主要的原理):每个模块指完成系统要求的独立的子功能,且与其他模
块的联系最少且接口简单。
4. 软件设计基本任务: 软件系统结构设计、数据结构和数据库设计、网络系统设计、软
件总体设计文档、评审。
5. 结构化设计(SD)又叫面向数据流的设计,是以需求分析阶段产生的数据流图为基础,
按一定步骤映射成软件结构。
6. 结构化设计分为总体设计和详细设计,它们是全局和局部的关系。主要任务是在需求分析的基础上,
定义满足需求要的结构,即针对给定的问题,给出该问题的软件解决方案,确定“怎么做”的问题。
7. 总体设计阶段的工具:模块结构图、层次图、HIPO图。
8. 总体设计基本步骤:先将系统DFD图转化成初始的模块结构图,再基于“高内聚低耦
合”软件设计原则,通过模块化,将初始的模块结构图转化为最终的、可供详细设计使用的模块结构图(MSD)。
9. 根据数据流的特性,将数据流图分为变换型数据流图和事务型数据流图。
变换流指DFD具有明显的输入、变换、输出界面。事务流指DFD中输入流被分离成
许多数据流,形成
17
许多加工路径,并根据输入值选择其中一条路径来执行。
10. 模块结构图是软件系统的模块层次结构,反映整个系统的功能实现,用网状或树状结构
的图形表示。
形态特征:深度(模块的层数)、宽度(一层中最大的模块个数)、扇入(一个模块直接
上属模块的个数)、扇出(一个模块直接调用下属模块的个数)。
画图注意事项:同一名字的模块在结构图中只出现一次;调用关系只能从上到下;模块
调用次序一般从左到右。
11. 模块的控制域指这个模块本身以及所有直接或间接从属它的模块的集合。模块的作用域
是受该模块内一个判定所影响的所有模块的集合。当一个模块的作用域不在其控制域内,或把该模块移到上一层次,或把在作用域内但不在控制域内的模块移到控制域内,尽量使模块的作用域是其控制域的子集。
六、 耦合性和内聚性
1. 耦合性也叫块件关系,根据模块外部特征提出的,是对软件系统结构中各模块间相互联
系紧密程度的一种度量。按耦合程度由低到高分为:
? 无直接耦合:两个模块间无直接关系,分别从属不同模块的控制和调用,不传递任
何信息。
? 数据耦合:两个模块间有调用关系,传递简单数据值,相当于高级语言的值传递。 ? 标记耦合:两个模块间传递数据结构。 ? 控制耦合:传递控制变量,如开关、标志。 ? 公共耦合:传递在公共数据环境中的数据。
? 内容耦合:传递的是一个模块的内部数据,往往出现在汇编语言中。
18
2. 影响模块间耦合程度的最主要因素是模块间传递信息的复杂性,另外还受接口的复杂性
和调用方式的影响。模块间耦合性越强,联系越紧密,独立性越差。提高模块间独立性的措施有:
* 在耦合方式上降低模块间接口的复杂性:包括模块的接口方式、接口信息和参数个数。 * 在传递信息类型上尽量使用数据耦合,避免控制耦合,慎用或有控制地使用公共耦合。 3. 内聚性又叫块内联系,根据模块内部特征提出的指模块功能强度的度量,即一个模块内
部各个元素彼此结合的紧密程度的度量。按内聚程度由低到高分为: ? 偶然内聚:一个模块内的各处理元素间没有任何联系。
? 逻辑内聚:模块内执行的几个逻辑上相似的功能,通过参数确定该模块完成那一个
功能。
? 时间内聚:需要同时执行的动作组合在一起形成的模型。
? 通信内聚:都要在同一数据结构上操作,紧密相关于同一数据结构。
? 顺序内聚:紧密相关于同一功能,且必须按顺序完成,某成分的输入是另一成分的
输出。
? 功能内聚:共同完成同一功能,缺一不可,模块不可再分割。
3. 影响内聚程度的最主要因素是模块内各成分之间相关于同一功能的紧密程度。模块内聚
性越高,独立性越强,有利于软件重用。
七、 详细设计 1.
详细设计主要确定每个模块具体执行过程和内部特性,也称过程设计。结果是基本决定了最终程序代码的质量。 2.
结构图(SC图)是总体设计和详细设计衔接的图形工具,主要内容有:模块、模块
19
的控制关系、模块的信息传递。 3.
详细设计基本任务:为每个模块进行详细的算法设计;为模块内的数据结构进行设计;对数据库进行物理设计;其他设计;编写详细设计说明书(内容包括引言、软件结构、模块设计说明);评审(针对处理过程的算法和数据库的物理结构)。 4.
详细设计目标是逻辑上正确实现每个模块的功能,还应使设计出的处理过程通过结构化程序设计清晰易读,指导开发出易于理解、易于验证的程序。 5.
结构化程序设计是面向数据流的软件总体设计方法,主要强调的是程序的易读性。基本要点有:(1)采用自顶向下,逐步求精的程序设计方法。(2)使用三种基本控制结构(共同点是只有单入口和单出口)构造程序。(3)采用工作方式为主程序员组的组织形式,突出了主程序员的领导(包括一个住程序员、后备程序员、程序管理员,一些专家和其他技术人员)。 6.
详细设计的工具:图形(程序流程图、盒图N-S图、PAD图、IPO图)、表格(判定表)、语言(类程序设计语言PDL,也叫伪码)。 7.
流程图,是描述程序逻辑结构的工具。 优点是:直观清晰、易使用。
缺点是:(1)可随心所欲画出控制流程的流向,易造成非结构化的程序结构。(2)不
易反映逐步求精过程,往往反映最后结果。(3)不易表示数据结构。(4)对大型软件过于琐碎,不易阅读和修改。
结构化流程图由三种基本控制结构顺序组合和完整嵌套而成,不能相互交叉,克服流
程图最大缺陷。
8.
问题分析图(PAD图),描述的是算法,是由左往右展开的二维树形结构,控制流程为自上而下,从左到右执行。
20
优点是:(1)清晰反映程序层次结构(图中的竖线为程序的层次线)。(2)支持逐步
求精设计方法。
(3)易读易写,使用方便。(4)支持结构化程序设计原理。(5)可自动生成
程序,由软件
工具自动生成相应源代码。
9.
类程序设计语言PDL,是描述模块算法设计和处理细节的语言。分为内外两层,外层语法符合一般程序设计语言常用语法规则,内层语法用简单句子、短语、通用数学符号来描述程序应执行的功能。
可以表示的程序结构有:顺序结构(采用自然语言描述)、选择结构、循环结构、出
口结构、模块定义和调用、数据定义、输入/输出。
特点:(1)所有关键字有固定语法,以便提供结构化控制结构、数据说明和模块特征。
(2)描述处
理过程的说明性语言没有严格语法。(3)具有简单或复杂的数据说明机制。
(4)具有模
块定义和调用机制。
优点:(1)总体结构和一般程序完全相同。(2)提供的机制比图形全面,为保证详
细设计与编码的质量创造有利条件。(3)可作为注释嵌入源程序中一起作为程序的文档,并可同高级程序设计语言一样进行编辑、修改,有利于软件维护。(4)可自动生成程序代码,提高软件生产率。
八、 Jackson方法 1.
Jackson方法是以Jackson结构图(上下层间是组成关系)为描述工具,用三种基本
21
结构来表示,是面向数据结构的设计方法。不仅可以表示程序结构,还可表示数据结构。主要分为:
? JSP:用于开发规模较小的数据处理系统的设计。定义一组以数据结构为指导的映
射过程,根据
输入、输出的数据结构,按一定的规则映射成软件的过程描述,即程序结构。适用于详细设计阶段。
? JSD:主要以活动事件为中心,通过由一串活动顺序组合构成进程,建立系统模型,
最后实现该
模型。
2.
Jackson特点:能对结构进行自顶向下的分解,可表示层次结构;结构易读,形象直观;既能表示
数据结构也能表示程序结构等组成关系。
3.
Jackson设计步骤:
(1)分析并确定输入数据和输出数据的逻辑结构,并用Jackson结构图表示这些数据结构。
(2)找出输入数据结构和输出结构中有对应关系的数据单元(对应关系指数据单元在数
据内容、数量、顺序上有直接的因果关系,重复的次序和次数都相同才有对应关系)。
(3)按一定的规则由输入、输出的数据结构导出程序结构。 (4)列出基本操作和条件,并把它们分配到程序结构图的适当位置。 (5)用伪码写出程序。
4. 在Jackson方法中,如果输入数据和输出数据结构之间找不到对应关系,称为结构冲
22
突。
解决方法:引入中间数据结构或中间文件,将冲突部分分隔开来,建立多个程序结构,
再利用中间文件将它们联系起来,构成一个系统的整体。
第四章 面向对象方法
一、 面向对象方法学
1. 传统方法学的缺点:生产效率低、不能满足用户需要、软件复用程度低、软件仍然很
难维护。
产生问题的原因:结构化技术本身问题、预先定义的需求可能会过时、语言鸿沟、系统需求的模糊性。 2. 面向对象的基本概念:
对象:是问题域或实现域中某些事物的一个抽象,反映该事物在系统中需要保存的信
息和发挥作用,是一组属性和有权对这些属性进行操作的一组服务的封装体。它是封装的基本单位,也是类的实例化,具有很强的表达和描述能力。
类:是具有相同属性和服务的一组对象的集合,为属于该类的全部对象提供了统一的
抽象描述,其内部包括属性和服务。是对象的状态的抽象,用数据结构来描述类的属性。
继承:特殊类的对象拥有其一般类的全部属性和服务,称作特殊类对一般类的继承。
是子类自动共享父类的属性和操作的机制。
封装:把对象的属性服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。
23
消息:是对象间进行通信的构造。如通过执行对象的操作改变对象的属性。 连接:实例连接(反映对象间的静态联系)、消息连接(描述对象间的动态联系)描述
对象间的关系。
多态性:指允许不同类的对象对同一消息作出响应。多态性引用具有动态类型(程序
执行期间在实例间进行变化)和静态类型(在程序上下文中由实体说明决定)。
3.
面向对象程序设计语言和其他设计语言的主要差别是它具有继承性。面向对象开发方法子概念和表示上的一致性保证了分析和设计的平滑过渡。一个面向对象系统的体系结构通过它的成分对象和对象间的关系确定,具有设计稳定的优点。 4.
面向对象的模型分为:
对象模型:描述系统数据结构,是表示静态的、结构化的系统的“数据”性质。描述工
具是对象图。是核心模型。
建立模型时用到的符号:表示类的符号、表示对象的符号、表示继承关系的
符号、表示类和对象间其他关系的符号。
对象建模过程:确定类、准备数据字典、确定关联、确定属性、使用继承来
细化类、完善
对象模型。
动态模型:描述系统控制结构,是表示瞬时的、行为化的系统的“控制”性质,把脚本
表示成事件跟踪表,其中对象为表中的列。使用状态图(描述类中某个对象的行为,反映了状态和事件关系)做为描述工具,描述的系统属性是触发事件、事件序列、状态、事件和状态的组织。表示了对象的相互行为。
动态建模过程:准备脚本、确定事件、准备事件跟踪表、构造状态图。 功能模型:描述系统功能,由多张数据流图按层次结构组成,指出发生了什么。说明
24
了对象模型中操作和约束的含义、动态模型中动作的意义。
功能建模过程:确定输入值和输出值、建立数据流图。
5. 在面向对象方法中,信息隐蔽通过对象的封装性来实现。类结构分离了接口和实现,
从而支持了信息隐蔽。
6. 面向对象有三个基本要素:抽象、封装性(信息隐蔽)、共享性。面向对象技术在三个
级别上促进了共享:同一个类中的共享(如同一类中有相同的数据结构)、在同一个应用中的共享、在不同应用中的共享(如库类这种机制)。
7. 在确定属性时,所有修饰性名词词组是侯选定属性。在确定类时,所有名词是候选的
类。常用动词或动词词组来表示关联。与时间联系在一起的瞬时操作是动作,有时间间隔的操作是活动。
8. 在类的层次结构中,上层称作父类或超类,下层成为子类。
9. 面向对象的主要特征:对象惟一性(对象本身惟一的标识,通过这种标识可找到相应
对象)、分类性(具有一致的数据结构和行为的对象抽象成类)、继承性、多态性。
二、 面向对象分析
1. 面向对象分析就是抽取和整理用户需求并建立问题域精确模型的过程。目的是对客观
世界的系统进行建模。 2. 面向对象分析中的定义结构:
一般-特殊结构:也称分类结构,是“或”、“is a”的关系。 整体-部分结构:也称组装结构,是“与”、“has a”的关系。
3. 面向对象分析模型的作用:明确问题要求,为用户和开发人员提供明确需求、为用户
和开发人员提供一个协商基础、作为后继的设计和实现的
25
框架。
三、 面向对象设计
1. 重用也叫再用或复用,指同一事物不作修改或稍加改动就可多次重复使用。 软件复用的范围:数据复用、模块复用、结构复用、设计复用、规格说明复用。 软件复用技术:合成技术、生成技术、面向对象的软件复用技术。 2. 面向对象设计分为:
系统设计:内容包括:系统分解、确定并发性、处理及其任务分配、数据存储管理、
全局资源的处理、选择软件控制机制、人机交互接口设计。
对象设计:内容包括:获得操作、确定操作的目标对象、算法设计、优化设计、控制
的实现、调整继承、关联的设计。
3. 面向对象设计准则:模块化、抽象、信息隐蔽、低耦合、高内聚。 4. 面向对象设计中的三种内聚:操作内聚、类内聚、一般-具体内聚。
5. 面向对象的开发方法:Booch方法(原是面向Ada语言的,并处于面向对象开发方法
的奠基性地位)、Coad方法、OMT方法、OOSE方法。
6. 面向程序设计中提高重用性的准则:(1)提高方法的内聚。(2)减小方法的规模。(3)
保持方法的一致性。(4)把策略与实现分开。(5)全面覆盖。(6)尽量不使用全局信息。
7. 面向程序设计中提高扩充性的准则:(1)封装实现策略。(2)不要用一个方法遍历多
条关联链。(3)避免使用多分支语句。(4)精心确定公有方法。
8. 面向程序设计中提高健壮性的准则:(1)预防用户的操作错误。(2)检查参数的合法
性。(3)不要预先确定限制条件。(4)先测试后优化。
26
9. 保持设计结果清晰易读的主要因素:(1)用词一致。(2)使用已有的协议。(3)减少
消息模式的数目。(4)避免模糊的定义。
10. 面向对象软件的测试分为算法层、类层、模块层、系统层四个层次进行。
11. 面向对象设计的启发规则:(1)设计结果清晰易懂。(2)一般-具体结构的深度应适当。
(3)设计简单的类。(4)使用简单协议。(5)使用简单操作。(6)把设计变动减到最小。
设计简单的类应注意:(1)避免包含过多的属性。(2)有明确定义。(3)尽量简化对
象间的合作关系。(4)不要提供太多操作。
四、 形式化方法
1. 形式化规约的目标是无二义性、一致性和完整性。形式化规约语言由语法、语义、一组
关系组成。集合论是维也纳开发方法等形式化方法的基础。
语义指出语言如何表示系统需求。经典的语义定义方法有:指称语义、代数语义、操作语义方法。
2. 有限状态机是实时系统设计中的一种数学模型,由一个有限的状态集合、一个有限的输
入集合、一个变迁函数组成。
优点:简单易用,状态间的关系能直观看到。
缺点:任何时刻系统只能有一个状态,无法表示并发性,不能描述异步并发系统。
3. Petri网是在软件分析中,用一种系统的数学和图形的描述和分析的方法。使用图形工具,
可以表示系统结构和动态行为方面的信息。
4. Petri网理论认为,任何系统是由表示状态的元素和表示状态变化的元素组成。用位置表
示状态的元素,符号为“○”。用转移表示状态变化的元素,符号为“—”或 “|”。
27
5. Petri网的行为特征分析方法有可覆盖性树、矩阵方程求解、分层或简化三类。Petri网
到程序结构的转换方法:流程图方法、编程语言的方法、面向对象的程序设计方法。
6. 净室是一种以合理的成本开发高质量软件的基于理论、面向工作组的方法。净室过程强
调规约和设计上的严格性,净室软件工程使用盒结构规约的方法来遵从操作分析原则。
7. 净室方法未广泛使用的原因:(1)净室方法太理论、太数学化,一直难以在真实的软件
开发中使用。(2)不需要进行单元测试,与大多数软件开发方式背离。(3)软件开发产业的成熟度。
8. 客户/服务器模式的系统结构中的服务器:文件服务器、数据库服务器、事务服务器、组
件服务器。
五、 面向对象方法-UML
1. UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言,统一了Booch
方法、OMT方法、OOSE方法的表示方法,融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发全过程。
2. 为表达客观事物之间的关系,UML给出了以下基本术语:
关联:是类目之间的一种结构关系,是对一组具有相同结构、相同链的描述。其中链
是对象之间具有特定语义关系的抽象。
泛化:是一般性类目(或称超类或父类)和它的较为特殊型类目(称为子类)之间的一种关系。
细化:是类目间的语义关系,其中一个类目规约了保证另一个类目执行的契约。 依赖:是一种使用关系,用于描述一个类目使用另一类目的信息和服务。
28
它们的关系:关联、泛化和细化都是一类特定的依赖。
3. 为表达客观事物,UML给出的基本术语:类与对象、接口、协作、用况、主动类、构件、制品、节点。
4. 聚合是满足“一个类是另一个类的一部分”这一性质的关联,是关联的一种特殊形式。 5. 对象由对象名、对象属性和对象操作组成,用具有3个栏目的矩形表示,上栏目表示
对象名(加下划线)、中间栏目表示属性、下栏目表示操作。 6. 类图的构成成分:类、接口、关联、泛化和依赖关系等。 7. 状态图的构成成分:状态、转移及其相关的事件和动作、消息等。
8. 顺序图的构成成分:参与交互的对象、基本的交互方式(同步和异步)以及消息等。
六、 面向对象方法-RUP
1. RUP的特点:(1)以用况为驱动。(2)以体系结构为中心。(3)迭代、增量式开发。
第五章 软件测试
一、 软件质量与质量保证
1. 软件质量定义即3个一致性:与所确定的功能和性能需求、与所成文的开发标准、与
所有专业开发的软件所期望的隐含特性的一致性。
2. 影响软件质量的因素:可直接度量因素和只能间接度量的因素。
3. 软件质量保证是指确定、达到、维护所需的软件质量而进行的所有有计划、有系统的
29
管理活动。从产品计划和设计开始(必须加以保证),直到投入使用和售后服务的软件生存期的每一阶段的每一步骤。其工作重点放在过程管理上,对制造的每一道工序进行质量控制。
为提高软件质量和效率,主要任务:力争不重复劳动、掌握开发新软件方法、用户要
求定义、组织外部力量协助排除无效劳动、发挥每个开发者的能力、提高软件开发的工程能力、提高计划和管理质量。
4. 质量保证策略发展的三个时期:以检测为重、以过程管理为重、以新产品开发为重。 5. 质量度量模型:McCall质量度量模型、ISO质量度量模型(分为质量特征层、质量子
特征层、度量层)。
McCall质量度量模型有11个特性:
面向软件产品操作的特性有:正确性、可靠性、效率、可用性。 面向软件产品修改的特性有:可维护性、可测量性、适应性。 面向软件产品适应的特性有:可移植性、可重用性、可互操作性。
其中,正确性是指软件满足设计规格说明及用户预期目标的程度。可靠性是指软件按
设计要求,在规定时间和条件下不出故障,持续运行的时间。完整性是指对非授权人访问软件或数据行为的控制程度。可用性是指用户熟悉、使用及准备输入和解释输出所需工作量的大小。
6. 度量软件复杂度使用代码行度量法和基于程序控制流的McCabe度量法。
McCabe度量法一种基于程序控制流的复杂性度量法,也称为环路度量。先画出程序图,再计算环路数。公式为:V(G)=m-n+2p; 其中,V(G)是有向图G中环路数,m是图中G的弧度数,n是图中结点数,p是G中的强连通分量个数。
McCabe度量法的缺点:(1)不能区分不同种类的控制流复杂性;(2)简单IF语句与
30
循环语句、嵌套IF语句与简单CASE语句的复杂性同等看待;(3)把模块间接口当做简单分支处理;(4)一个具有1000行的顺序程序和一行语句的复杂性相同。 7. 软件复杂性度量参数:规模(总共指令数或源代码行数)、难度(由程序中出现的操作
数的数目所决定的量表示)、结构(与程序结构有关的度量来表示)、智能度(算法难易程度)。
8. 软件可靠性表明一个程序按用户要求和设计的目标,执行其功能的正确程序,指在给
定时间内,在规定环境下系统完成所指定功能的概率。使用硬件可靠的定量度量:MTFF(平均失效等待时间)和MTBF(平均失效间隔时间)。
9. 提高软件质量和可靠性的技术有:避开错误技术(在开发过程中不让差错潜入软件)
和容错技术。
容错软件是在一定程度上具容错能力的规定功能软件。设计过程为:(1)常规设计,尽量保证设计正确。(2)对可能出现的错误分类,确定容错范围。(3)按“成本-效率”最优原则,选择容错的冗余手段实现错误屏蔽(如关键程序和数据冗余存储和调用)。(4)分析或验证上述冗余结构的容错效果。
10. 冗余是所有对于实现系统规定功能来说多余的那部分资源,包括硬件、软件、信息、
时间,是实现容
错技术的主要手段。冗余分为四类:结构冗余(又分静态、动态、混合冗余)、信息冗余、时间冗余、冗余附加技术。
11. 软件生存期每个阶段都可能引入人为错误,若不及时纠正就会传播到开发后续阶段,
将引出更多错误,故要进行软件评审,以提高软件质量为目标。把“用户满意程度”理解为软件质量,包括设计质量(设计的规格说明书符合用户要求)和程序质量(程序要按照设计规格说明所规定的情况正确执行)。
31
设计质量的评审针对需求分析阶段产生的软件需求、规格说明书、数据需求说明,在
软件总体设计阶段产生的软件概要设计说明书。
程序质量的评审从开发者角度进行评审,直接和开发技术有关,着眼于软件本身的结
构、与运行环境的接口和变更带来的影响而进行的评审活动。
12. 提高程序效率的根本途径在于选择良好的设计方法、良好的数据结构算法,而不是
靠编程时对程序语句做调整。
二、 软件编码
1. 程序设计语言的共同特性:
心理特性:指影响程序员心理的语言性能。对通信质量有主要影响。表现形式为:
歧义性、简洁性、局部性、顺序性、传统性。
工程特性:指根据软件开发项目的需要,总体上考虑的软件特性。对软件开发的成
功与否有重要影响。表现形式为:可移植性、开发工具的可利用性、软件的可重用性、可维护性。它也是就程序设计语言的工程特性而言,对程序编码的要求。体现在源代码的可维护性等方面。
技术特性:指具体实现软件系统中所提供的语言特性。对软件工程各阶段都有一定
的影响,要根据项目特性选择相应特性的语言。
2. 选择程序设计语言要考虑的因素:项目的应用领域(是关键因素,如工程计算、人
工智能、数
据处理等)、软件开发方法、软件执行环境、算法和数据结构的复杂性、软件开发
人员的知识。
3. 程序设计风格指一个人编制程序时所表现出来的特点、习惯、逻辑思路等。良好的
32
程序设计风格
可以减少编码错误和读程序的时间,提高软件的开发效率。为了具有良好的设计风
格,应注意:
(1)源程序文档化;(2)数据说明;(3)语句构造;(4)输入和输出(受通信环
境、用户经验、
输入/输出设备等影响);(5)效率。
4. 几种常用的程序设计语言的特点和适用范围:
(1)Fortran语言:是世界第一个正式推广应用于科学计算的的程序设计语言。特
点是数据处理能力强,适用于科学工程计算。
(2)Pascal语言:是第一个体现结构化编程思想的程序设计语言。特点是具有很
强的数据和过程结构化能力、语言简明、数据类型丰富、程序结构严谨。适用于科学工程计算和系统软件。
(3)C语言:特点是功能很强、支持复杂的数据结构、可大量运用指针、具有丰
富灵活的操作运
算符及数据处理操作符,还具有汇编语言的某些特性,程序运行效率高。适用于科学工程计算和系统软件。
(4)4GL语言(又称为第4代语言):如FoxPro语言,特点是友好的用户界面,
兼有过程性和非
过程性双重特性、高效的程序代码、完备的数据库、应用程序
生成器。适
用于数据处理和数据库应用,快速原型模型开发软件。
(5)汇编语言:特点是面向机器,可完成一些高级语言无法完成的特殊功能,如
33
和外部设备间的
一些接口操作。适用于实时处理和系统软件。
5. 软件编码是将详细设计得到的处理过程的描述转换成基于某种计算机语言的程序。 6. 注释说明了程序的功能,分为:
序言性注释:包括模块的接口和功能、开发历史、数据的描述。 功能性注释:包括程序段和语句的功能、数据的状态。
7. 数据说明顺序的规范:常量说明、类型说明、全程量说明、局部量说明。
三、 软件维护
1. 软件维护的内容:
校正性维护:侧重确定和修改隐含在软件中的错误。约占21%。
适应性维护:侧重使软件系统适用计算机运行环境的不断变化。约占25%。 完善性维护:侧重使软件功能、性能适应用户业务和机构的发展变化。维护比重最
大,约占50%。
预防性维护:侧重提高软件可靠性和可维护性。维护比重最小,约占4%。
2.
软件维护特点:(1)软件开发过程对软件维护有较大影响:采用软件工程方法开发软件叫结构化
维护,每个阶段都有相应文档,软件维护容易。采用手工方法开发软件叫做非结构化维护,只有程序没有文档,维护工作困难。
(2)维护困难。体现在:难读懂别人的程序、一致性、开发和维护在人员和时间
上的差异、维护不是吸引人的工作。
(3)维护费用高。主要原因是维护的效率过低。
34
用于维护工作的活动分为:非生产性活动和生产性活动(如:分析评价、理解程序
代码功能、编写源代码、修改设计)。
3. 软件的可维护性是指软件能被理解、校正、适应和增加功能的容易程度。与软件质
量的可理解性、可测试性、可修改性、可靠性、可移植性、可适用性和效率有关。度量这7种特性的方法有:质量检查表、质量测试、质量标准。
4. 提高可维护性的方法有:(1)建立明确的软件质量目标。(2)利用先进的软件开发
技术和工具。(3)建立明确的质量保证工作。(4)选择可维护的程序设计语言。(5)改进程序文档。
5. 为有效进行软件维护,要事先开始组织工作,建立维护小组形式的组织机构,包括:
临时维护小组:非正式机构,执行一些特殊或临时的维护任务,采用“同事复审”或“同
行复审”等方法提高维护工作效率。
长期维护小组:由组长、副组长、维护负责人、维护程序员组成。
6. 维护的技术:面向维护的技术:在软件开发阶段用来减少错误、提高软件可维护性
的技术,涉及软件开发的所有阶段。
维护支援技术:在软件维护阶段用来提高维护作业效率和质量的技
术。包括信息收集、错误原因分析、软件分析理解、维护方案评价、代码文档修改、修改后确认、远距离维护。
7.
维护副作用是因修改软件而造成的错误或其他不希望出现的情况,分为: 编码副作:是在使用程序设计语言修改源代码可能引入的错误。
数据副作用:是在修改数据结构时可能造成软件设计与数据结构不匹配导致的错误。 文档副作用:是对可执行文件的修改没有反映在文档中的错误。
35
防止措施:(1)按模块把修改分组。(2)自顶向下地安排被修改模块的顺序。(3)
每一次修改一个模块。(4)对每个修改了的模块,在安排修改下一个模块前确定这个修改的副作用。
8. 软件维护流程:(1)制定维护申请报告。(2)审查用户填写的申请报告并批准。(3)
进行维护并作详细记录。(4)复审。
9. 维护阶段产生的文档主要有:维护申请报告、软件修改报告、软件问题报告。 10. 软件维护工作过程中,第一步是先确认维护类型。
四、 软件测试
1. 软件测试是为了发现软件中的错误而执行软件的过程,需要了解软件设计的功能、
处理过程和内部结构。目的是尽可能多地发现软件中存在的错误,将测试结果作为纠错的依据。分为:
静态测试:指被测试的程序不在机器运行,而是采用人工检测和计算机辅助静态分
析的手段对程序进行检测。
动态测试:指通过运行程序发现错误,测试方法主要有白盒法和黑盒法。 一个好的测试用例能发现至今尚未发现的错误,一个成功的测试是发现了至今尚未发现的错误。
2. 测试用例是为寻找程序中的错误精心设计的一组测试数据,由输入数据和预期的输
出数据组成。
3. 白盒测试是把对象看做一个打开的盒子,测试人员需了解程序的内部结构和处理过
程,以检查处理过程的细节为基础,对程序中尽可能多的逻辑路径进行测试,检验内部控制结构和数据结构是否出错,实际的运行状态与预期的状态是否一致。它是
36
一种结构测试,被测对象是源程序,以程序的内部逻辑为基础设计测试用例。
4. 逻辑覆盖是白盒法设计测试用例的技术,根据程序内部逻辑覆盖程度设计测试用
例。要求设计的测试用路覆盖程度高或覆盖最具代表性的路径。按逻辑覆盖程度不同,分为:
语句覆盖:设计足够的测试用例,是被测程序中每个语句至少执行一次。 判定覆盖:设计足够的测试用例,使被测程序中每个判定表达式至少获得一次“真”
或“假”值,从而使程序的每个分支都通过一次。也叫分支覆盖。
条件覆盖:设计足够的测试用例,使判定表达式中的每个条件的各种可能的值至少出现一次。
判定/条件覆盖:设计足够的测试用例,使得判定表达式中的每个条件的所有可能取
值至少出现一次,并使每个判定表达式所有可能的结果也至少出现一次。
条件组合覆盖:设计足够的测试用例,使得每个判定表达式中条件的各种可能的值
的组合都至少出现一次。
路径覆盖:设计足够的测试用例,覆盖被测程序中所有可能的路径。
它们的区别在于:逻辑覆盖程度不同、发现错误能力强弱不同、关注点不同、执行路径情况不同。
5. 黑盒测试是把测试对象看成一个黑盒子,测试人员完全不考虑程序的内部结构和处
理过程,只在软
件的接口处进行测试,依据需求规格说明书,检查程序是否满足功能要求,又称功能测试或称数据驱动测试。其测试用例设计技术包括等价类划分、边界值分析、错误推测和因果图。
37
等价类划分:只用输入信息设计测试用例。优点是用少量有代表性的例子代替大量测
试目标的系统的例子,提高测试效率。缺点是不注意选择某些高效的、能发现更多错误的测试用例,孤立考虑各个输入数据的测试功能,没考虑多个输入数据的组合引起的错误。
边界值分析:一般和等价类划分结合,将测试边界情况作为重点,考虑输入、输出数
据的边界情况。优点是边界情况检查比较高效,可查出更多错误。缺点是孤立考虑各个输入数据的测试功能,没有考虑多个输入数据的组合引起的错误。
错误推测:没有确定步骤,根据经验和知觉设计测试用例。
因果图:通过画因果图,把用自然语言描述的功能说明转换成判定表,最后为判定表
的每一列设计测试用例。优点是有效检测输入条件的各种组合可能引起的错误。
6. 用白盒法或黑盒法设计测试用例各有所长,关键是测试用例的选择。实际测试中,
先用黑盒法设计基本的测试用例,再用白盒法补充一些必要的测试用例。
7. 软件测试是一个规则的过程,包括测试设计、测试执行、测试结果比较等。 8. 单元测试:指对源程序中每一个程序单元进行测试,检查各个模块是否正确实现规
定的功能,从而发现模块在编码或算法中的错误。涉及编码和详细设计文档。
主要目标:检查各个模块是否正确实现规定功能,发现模块在编码中或
算法中的错误。
测试内容:集中于单个模块的功能和结构检测,包括模块接口、局部数
据结构、重要
38
执行路径、错误处理、边界检测。
测试方法:总使用白盒测试法,为被测模块设计驱动模块和桩模块。
9. 集成测试:指在单元测试基础上,将所有模块按照设计要求组装成一个完整的系统
进行的测试,也称组装测试或联合测试。需要考察模块间接口和各模块间的联系。主要用于发现设计阶段产生的错误,涉及详细设计文档和概要设计文档。
主要目标:检查和设计相关的软件体系结构的有关问题。
测试内容:集中于模块组合的功能和软件结构检测,主要包括模块组装
中可能出现的问题,即数据穿过接口可能丢失、一个模块可能破坏另一个模块的内容、子功能组装可能不等于主功能、全程数据结构问题、误差积累问题。
测试方法:渐增式测试:指逐个把未经过测试的模块组装到已经过测试
的模块上,进行集成测试。每加入一个新模块进行一次集成测试,重复此过程直到程序组装完毕。其组装模块的方法有:自顶向下结合(适用于顶层模块)和自底向上结合(适用于底层模块)。
非渐增式测试:指首先对每个模块分别进行单元测试,再把
所有模块按设计要求组装在一起进行测试。
10.
确认测试:指检查软件功能和性能是否与需求规格说明书中确定的指标相符合,又称有效性测试。
用于发现需求分析阶段产生的错误,涉及软件需求规格说明书和用户手
39
册。 主要目标:检查已实现的软件是否满足需求规格说明书中确定的各种需求。 测试内容:集中于论证软件需求的可追溯性,主要包括测试软件功能和性能是否满足于软件需求一致、测试软件配置的所有程序与文档是否正确完整而且一致。 测试方法:总是用黑盒测试法。 11. 软件的测试步骤: 模块单元设计信息 测试 其他系统元素 确认 通过 三种测试与软件开发各阶段间的关系图: 需求分析 概要设计 修改 详细设计 编码 确认测试 集成测试 单元测试 软件需求 单元集成测试 确认系统 测试 单元测试 已测模块 40 已集成的软件测试 确认的软件测试 可支付的软件
12.
调试指确定错误的原因和位置,并改正错误的过程,也叫纠错。由编制该源程序的程序员完成。调试技术分为:简单调试、归纳法调试、演绎法调试、回溯法调试。 回溯法:主要从程序产生的错误的地方入手。
归纳法:从测试结果发现的线索(特殊)入手,分析它们间的联系,导出错误原因
假设,再证明或否定这个假设(一般)。步骤分为:收集有关数据、组织数据、提出假设、证明假设。
演绎法:先列出所有可能的错误原因的假设,再利用测试数据排除不适当的假设,
最后测试数据验证余下的假设确实是出错的原因。步骤分为:列出所有可能的错误原因假设、排除不适当假设、精化余下假设、证明余下假设。
13.
软件测试应遵循的原则:
(1)用例由输入数据和预期的输出数据两部分组成,便于对照检查。 (2)用例不仅选用合理的输入数据,还要选择不合理的输入数据。 (3)除了检查程序是否做了该做的事,还要检查程序是否做了不该做的事。 (4)应制定测试计划并严格执行,排除随意性。
41
(5)长期保留测试用例。
(6)对发现错误较多的程序段,进行更深入的测试。 (7)程序员避免测试自己设计的程序。
第六章 软件生存周期过程与管理
一、 软件生存周期和模型
1. 软件生存周期指一个软件从提出开发要求开始直到该软件报废为止的整个时期。国家
标准“计算机软件开发规范”将其划分为八个阶段:可行性研究与计划、需求分析、总体设计、详细设计、实现、综合测试、确认测试、使用与维护(跨越时间最长)。 其中,软件结构的设计是总体设计关键的一步,直接影响到下一阶段详细设计与编码的工作。建立软件结构后,还应为每个模块写一份处理说明和接口说明。
2. 划分软件生存周期的基本原则:各阶段任务应尽可能相对独立,同一阶段各项任务的
性质尽可能相同。
划分的重要性:便于开发大规模软件时不同人员分工合作,降低整个软件的开发难度
并使软件开发过程有条不紊地进行,提高软件的可靠性和可维护性,从而提高软件的生产率。
3. 过程管理也叫生存周期模型管理过程,指为软件生存周期过程的定义、控制和改进提
供一个过程,包含过程建立、过程评估和过程改进三个活动,强调过程规划、过程检测、过程执行及过程调整。
4. 软件开发中的过程类包括3个过程组:软件实现过程组、软件支持过程组和软件复用
42
过程组。其中软件支持过程组支持软件实现过程组,而软件复用过程组队软件实现过程组有提升能力。
5. 在ISO/IEC 12207-2008中一般通过过程意图、期望的结果以及为达到过程结果需要
执行的活动和任务来描述一个过程。
6. 验证是通过提供的客观证据,证实规约的需求是否得以满足;确认是通过提供的客观
证据,证实有关特定期望的使用或应用的需求是否得以满足。验证用于发现需求中的错误,是需求阶段的任务,确认则是测试阶段的任务。
7. 确认测试计划在需求分析阶段制定,确认测试阶段完成。综合测试计划在总体设计阶
段制定,综合测试阶段完成。
8. 软件生存周期模型(软件开发模型)是一个包括软件产品开发、运行和维护中有关过
程、活动和任务的框架。也是按软件生存周期,描述软件开发过程中各种活动如何执行的过程,借鉴在其他工程领域活动中所使用的方法把软件开发变成可视过程而采用的一种模型。主要分为瀑布模型、增量模型、原型模型、螺旋模型、形式变换模型、再利用组装模型、喷泉模型、基于知识的模型。
9. 瀑布模型是将软件生存周期各个活动规定为依线性顺序连接的若干阶段的一种整体开
发模型,阶段活动有系统需求、软件需求、需求分析、设计、编码(占用人数最多)、测试、运行。它是最早提出、应用最广泛的模型。
软件开发结构化生命周期方法以瀑布模型为基础,将软件生命周期分为三大阶段:计
划阶段、开发阶段、运行阶段。
局限性:(1)本质是一种线性顺序模型,各阶段间存在严格顺序性和依赖性,强调预
先定义需求的重要性。(2)缺乏灵活性,不适合实际开发过程。(3)难以适应需求可变、模糊不定的软件系统开发。(4)用户和开发者难以沟通,用户
43
只有到开发结束才能看到整个软件系统。 测试和测试目标定义关系: 详细设计阶单元测试阶需求分析阶目标是其定义 指导 总体设计阶集成测试阶系统测试阶 10. 螺旋模型分为制定计划、风险分析、开发实施(基本和瀑布模型一致)、用户评估四个步骤。结合了瀑布模型和增量模型,吸收了软件工程“演化”的概念,适合大型软件的开发。 11. 喷泉模型是一种以用户需求为动力,以对象为驱动的模型,适合面向对象的开发方法。描述自顶向下,从抽象到具体顺序执行的阶段工作。 12. 基于知识的模型又叫智能模型,是把瀑布模型和专家系统结合在一起,利用专家系统来帮助软件人员进行开发工作。 13. 增量模型是以一系列的增量方式开发系统,是非整体的开发模型。增量方式包括: 增量开发:在项目开发周期内,以一定时间间隔开发部分工作软件。 增量提交:在项目开发周期内,以一定时间间隔增量方式向用户提交工作软件及相应文档。 14. 根据增量的方式和形式的不同,增量模型分为:渐增模型和原型模型。 44
渐增模型:瀑布模型的变种,分为:
增量构造模型:需求分析阶段和设计阶段按瀑布模型的整体开发,编码和测试阶段按
增量方式开发。
演化提交模型:项目开发各阶段都是增量方式。在强有力软件工具和环境支持下,通
过原型过程反复循环环境,直接得到软件系统。
15. 原型是指模拟某种产品的原始模型,开发期间可作为终端用户的教学环境。软件原型
是软件的一个早
期可运行版本,反映最终系统的部分重要性能。
原型作用是:(1)为软件系统提供明确的用户需求说明。(2)通过原型这种实现工具
证实设计的可行性。(3)应付开发过程中的问题和错误。(4)协议用户和开发者。
原型特征分类:(1)系统的界面形式。解决系统的人机交互界面的结构。(2)系统的
总体结构。确定系统的体系结构。(3)系统的主要处理功能和性能。实现系统的主要功能和性能。(4)数据库模式。确定系统的数据库结构。
16. 构造原型的开发环境:交互式系统、数据库管理系统、通用输入/输出软件、重用代码
库。
构造原型的技术:可执行的规格说明、基于脚本的设计、采用高级语言或专门语言、能重用软件。
17. 构造原型的要求:构造原型前明确运用原型目的确定考核、评价原型的内容,注意功
能性能的取舍。
主要考虑原型要体现的特性,忽略一切暂不关心的部分。若原型不满足需求说明,则根据明确的要求修改原型,若不满足用户需求,则修改和规定需求说明,重新构造原
45
型。
18. 构造原型的建议:⑴暂不考虑速度、空间等性能效率方面的要求。⑵暂不考虑错误恢
复和处理。⑶
可降低可靠性和软件质量标准。⑷原型界面部分要设计得简单易学,最好能与最终系统的界面相容。 ⑸根据不同的软件类型和应用领域,可使用不同风格的高级语言来构造原型。
19. 原型开发步骤:快速分析、构造原型、运行原型、评价原型、修改。由于运用原型的
目的和方式不
同,在使用原型时应采取抛弃策略或附加策略。原型的开发和使用过程叫原型生存期。 20. 原型化方法是用户和设计者间执行的一种自外向内型的交互过程,适用于需求不确定
性高的系统。
可容易确定系统性能、各项主要系统服务的可应用性,确认系统作为产品的结果和系统设计的可行性。对软件设计和开发人员要求很高。
21. 快速原型模型在原型基础上逐渐完成整个系统的开发工作,在研究需求分析阶段的方
法技术中产生。
基本思想是:先用相对少的成本、较短周期开发一个简单、但可运行的软件原型向用
户演示或让用户试用,以便尽早澄清并检验一些主要的设计策略,在此基础上再开发实际的软件系统。
按原型的不同作用分为:
探索型原型:原型用于开发的需求分析阶段,目的是弄清用户需求,确定所期望特性,
并探索各种方案可行性。针对目标模糊、用户和开发者对项目都缺乏经验的情况,通过对原型的开发明确用户需求。
46
实验型原型:原型用于设计阶段,考核实现方案是否合适,能否实现。
演化型原型:原型思想扩展到软件开发全过程,用原型过程代替全部开发阶段,尽早
向用户提供提交一个或包括系统框架或主要功能的原型系统,得到用户认可后,将原型系统不断扩充演化为最终的软件系统。
二、 软件项目管理与计划
1. 软件项目管理是软件生命周期一切活动的管理。具体内容包括对开发人员(包括项目负
责人、系统分析员、高级程序员、初级程序员、资料员和其他辅助人员)、组织机构、用户、文档资料等方面的管理。
2. 软件项目计划是软件开发的第一步,是由系统分析员、用户共同经过可行性研究和计划
阶段后制定的,但一般在需求分析阶段后才定稿。主要有研究(软件项目的主要功能性能和系统界面)和估算(项目开发所需经费和所要用的资源以及开发进度)两个任务。内容包括:范围、资源、进度安排、成本估算、培训计划。
3. 产品管理包括版本管理和配置管理。软件配置管理(SCM)用于整个软件工程过程,
是一组管理整个软件生存期各阶段中变更的活动,能协调软件开发,使混乱减少到最小。主要目标是:标识变更、控制变更、确保变更正确地实现、报告有关变更。内容包括: 基线:是软件生存期中各开发阶段的一个特点,作用是把开发各阶段工作的划分更加明
确化,使本来连续的工作在这些点上断开,以便于检查与肯定阶段成果,作为项目的一个检查点。
软件配置项(SCI):是软件工程中产生的信息项,是配置管理的基本单位。
版本控制和变更控制:版本用来定义软件配置项的演化阶段,版本控制要考虑系统具体
版本进行描述和生成。
47
变更控制是指软件工程过程中某一阶段的变更,均要引起软件配置的变更,必须严格加以控制和管理,通过变更管理,保持修改信息,并把精确、清晰的信息传递到软件工程过程的下一步骤。包括建立控制点、报告与审查制度,它的“检出”和“登入”处理实现了存取控制(管理各用户存取和修改一个特定软件配置对象的权限)和同步控制(确保由不同用户所执行的并发变更)。
4. 在软件项目管理中,控制包括:进度控制、人员控制、经费控制、质量控制。 5. 根据软件工程标准定制的机构与适用的范围,软件工程标准化分为五个等级:
国际标准:由国际标准化组织ISO制定和公布。
国家标准:由政府或国家级的机构制定或批准,用GB标识。主要有NSI、BS、IN、JS等。
行业标准:由行业机构、学术团体或国防机构制定的适合某个行业的标准。主要有IEEE、
GIB、MIL_S、DOD_STD等。
企业规范:大型公司或企业所指定的适用于本部门的规范。 项目规范:某一项组织为该项目专用的软件工程规范。
重要性体现在:在开发项目各个部分以及开发阶段间存在许多联系和衔接问题,如何
把这些错综复杂关系协调好,需要一系列的统一的约束和规定。
6. 成本估算实在软件项目开发之前,主要方法有:
自顶向下估算方法:参照以前完成的项目所耗费的总成本来推算将要开发的软件总成
本,然后把它们按阶段、步骤和工作单元进行分配。优点是估算工作量小、速度快;缺点是不清楚低级别上技术性困难,使成本增加。
自底向上估算方法:将待开发的软件细化,分别估算每个子任务所需开发工作量,再将
48
它们加起来,得到软件的总开发工作量。优点是对每部分的估算工作交给负责该部分工作的人员做,估算较为准确;缺点是其估算往往缺少与软件开发有关的系统级工作量,估算往往偏低。
差别估算方法:将开发项目和一个或多个已完成的类似项目比较,找出若干不同之处,
并估算每个不同处对成本的影响,导出开发项目总成本。缺点是不易明确“差别”的界限;优点是提高估算的准确度。
7. 成本估算模型分为COCOMO估算模型和Putnam成本估算经验模型。前者是一种结构
性成本模型,最精确、最易于使用的成本估算方法之一,分为基本(是一个静态单变量模型)、中级(是一个静态多变量模型)、详细COCOMO模型。后者是一种动态多变量模型,是假设在软件开发的整个生存期中工作量的分布。
8. 风险分析实际上是贯穿在软件工程中的一系列风险管理步骤,包括风险的识别、估计、
管理策略、解决、监督。
9. 软件工程的分解是从横向和纵向的,即空间和时间两个方面进行。
第七章 作图综合练习
一、 结构化方法作图
1. 某单位住房分配方案如下:所有住户50平方米以内每平方米1000元,超过50平方
米后:在本人住
房标准面积以内每平方米1500米,其中住房标准为:教授105平方米,副教授90平方米,讲师75平方米;标准面积外每平方米4000元。请用判定表和判定树表示各
49
条件组合与费用之间的关系。 2. 某网站发帖子系统有如下功能:
(1) 记录发帖内容:访客在表单中输入文字,系统进行检查,无误后将内容存入文
件。
(2) 显示帖子内容:读出文件,按一定格式显示在屏幕上。 请根据要求画出该系统的数据流程图,并将其转换成软件结构图。
3. 某校教务系统具备以下功能,输入用户ID号及口令后,经验证进入教务管理系统,
可进行如下功 能的处理:
(1) 查询成绩:查询成绩以及从名次表中得到名次信息。 (2) 学籍管理:根据学生总成绩排出名次信息。 (3) 成绩处理:处理单科成绩并输入成绩表中。 就以上系统功能画出0层,1层的DFD图。
4. 某商场在“五一”期间,顾客购物时收费有4种情况:普通顾客一次购物累计少于100
元,按A类标准收费(不打折),一次购物累计多于或等于100元,按B类标准收费(打9折);会员顾客一次购物累计少于1000元,按C类标准打折(打8折),一次购物累计等于或多于1000元,按D类标准收费(打7折)。请使用流程图、PAD图、PDL来设计收费算法。
5. 一个正文文件由若干记录组成,每个记录是一个字符串,要求统计每个记录中空格
字符的个数及文件中空格字符的总个数。要求输出数据格式是每复制一行字符串后,另起一行打印出这个字符串中的空格数,最后打印出文件空格的总个数,用Jackson方法设计该程序的程序结构。
50