软件工程系统概论
作者:互联网
软件工程系统概论
概念理解
第一章
-
软件包括程序,数据及其相关文档的完整集合。即软件=程序+数据+文档
-
软件产品是一种逻辑产品。程序是按事先设计的功能和性能要求执行的指令序列。数据是使程序能正常操纵信息的数据结构。文档是与程序开发,维护和使用有关的图文材料。
-
软件危机上世纪六十年代末,主要表现:软件的发展速度远远滞后于硬件的发展速度,开发周期长、成本高、质量差、维护困难。许多软件项目不能满足客户的要求,超出预算和时间安排。
-
软件工程是指导计算机软件开发和维护的工程学科[目标、原则、活动]
-
解决软件危机 三要素:方法、过程和工具。采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好技术结合起来,经济地开发出高质量的软件并有效地维护它。软件模型:设计、实现、部署。
-
软件的六个质量特性:功能性指所实现的功能达到它的设计规范和满足用户需求的程度;可靠性指在规定的时间和条件下,软件能够正常维持其工作的能力;可使用性指为了使用该软件所需要的能力;效率指在规定的条件下用软件实现某种功能所需要的计算机资源的有效性;可维护性指当环境改变或软件运行发生故障时,使其恢复正常运行所做努力的程度;可移植性指软件从某一环境转移到另一环境时所做努力的程度。
-
软件生命周期或软件生存期:软件孕育、诞生、成长、成熟和衰亡的生存过程,由软件定义[确定软件系统的工程需求:可行性研究和需求分析]、软件开发[概要设计、详细设计、实现、组装测试、验收测试]组成,软件开发原则:抽象、信息隐蔽、模块化和运行维护[最久 费用最多]。每个时期又可划分为若干个阶段。
-
结构化方法称为生命周期方法学或结构化范型。将软件生命周期的全过程依次划分为若干个阶段,采用结构化技术来完成每个阶段的任务。特点:强调自顶向下顺序地完成软件开发的各阶段任务;在适应需求方面不够灵活;结构化方法要么面向行为,要么面向数据,缺乏使两者有机结合的机制。面向对象方法是将数据和对数据的操作紧密地结合起来的方法,出发点和基本原则是尽量模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类认识问题和解决问题的方法和过程。软件开发过程是多次反复迭代的演化过程。面向对象方法在概念和表示方法上的一致性,保证了各项开发活动之间的平滑过渡。对于大型、复杂及交互性比较强的系统,使用面向对象方法更有优势。形式化方法是基于形式化数学变换的软件开发方法,将系统的规格说明转换为可执行的程序。过程:需求定义-形式化的格式说明-形式化变换-集成和系统测试。
第二章
-
瀑布模型特点:阶段间具有顺序性和依赖性。两含义:必须等前一阶段的工作完成,才能开始后一阶段的工作;前一阶段的输出文档就是后一阶段的输入文档。流程:需求分析(验证)-规格说明(验证)-设计(验证)-编码(测试)-综合测试-维护。优点:可强迫开发人员采用规范化的方法。严格规定了每个阶段必须提交的文档。要求每个阶段交出的所有产品都必须是经过验证的。缺点:瀑布模型完全依赖于书面规格说明,可能导致最终开发出的软件产品不能真正满足用户的需要,缺乏灵活性。只适用于项目开始时需求已确定的情况。
-
快速原型模型的优点:有助于满足用户的真实需求。原型系统已经通过与用户的交互而得到验证,据此产生的规格说明文档能够正确地描述用户需求。软件产品的开发基本上是按线性顺序进行。因为规格说明文档正确地描述了用户需求,因此在开发过程的后续阶段不会因为发现规格说明文档的错误而进行较大的返工。开发人员通过建立原型系统已经学到东西,因此在设计和编码阶段发生错误的可能性也比较小,减少了在后续阶段需要改正前面阶段所犯错误的可能性。快速原型的突出特点是快速,开发人员应该尽快地建造出原型系统,加速软件开发过程,节约软件开发成本。原型的用途是获知用户的真正需求,一旦需求确定了,原型可以抛弃,也可以在原型的基础上进行开发。
-
增量构件开发:每个增量构件应当实现某种系统功能,因此增量构件的开发可以采用瀑布模型的方式。优点:能在较短时间内向用户提交可完成有用的工作产品,即从第1个构件交付之日起,用户就能做有用的工作。优先级最高的服务首先交付。因此最重要的系统服务将接受最多的测试。
-
螺旋模型[支持多种软件开发方法,瀑布+增量]4项活动,螺线上的每一个循环可划分为4个象限,表达了4个方面的活动:目标设定-定义在该阶段的目标,弄清对过程和产品的限制条件,制订详细的管理计划,识别项目风险,可能还要计划与这些风险有关的对策;风险估计与弱化-针对每一个风险进行详细分析,设想弱化风险的步骤;开发与验证-评价风险之后选择系统开发模型;计划-评价开发工作,确定是否继续进行螺线的下一个循环,继续则计划项目的下一个阶段的工作。优点:对可选方案和约束条件的强调有利于已有软件的重用,也有助于把软件质量作为软件开发的一个重要目标。减少了过多测试或测试不足所带来的风险。在螺旋模型中维护只是模型的另一个周期,因而在维护和开发之间并没有本质区别。缺点:螺旋模型是风险驱动的,要求软件开发人员必须具有丰富的风险评估经验和这方面的专门知识,否则将出现真正的风险:当项目实际上正在走向灾难时,开发人员可能还以为一切正常。
-
喷泉模型是典型的面向对象生命周期模型,以用户的需求为动力,以对象来驱动。喷泉一词体现了迭代和无间隙特性。
-
统一过程六个核心工作流:业务建模工作流:用商业用例为商业过程建立文档;需求工作流:描述系统应该做什么,确保开发人员构建正确的系统,需明确系统的功能需求和非功能需求(约束);分析和设计工作流:说明如何做,结果是分析模型和设计模型;实现工作流:用分层的方式组织代码的结构,用构件的形式来实现类,对构件进行单元测试,将构件集成到可执行的系统中;测试工作流:验证对象之间的交互、是否所有的构件都集成了、是否正确实现了所有需求、查错并改正;部署工作流:制作软件的外部版本、软件打包、分发、为用户提供帮助和支持。
-
统一过程4个阶段:初始阶段:主要关注项目计划和风险评估,确定是否值得开发目标信息系统;细化阶段:关心定义系统的总体框架,目标:细化初始需求(用况)、细化体系结构、监控风险并细化它们的优先级、细化业务案例以及制订项目管理计划;构造阶段:是建立系统,构造信息系统的第1个具有操作质量的版本,以能够交付给客户进行,测试的版本结束,有时称为测试版本;移交阶段:包含测试时期,以发布完整的系统而终止,确保信息系统真正满足客户的需求。
第三章
-
需求分析阶段的工作:获取需求、分析需求、定义需求、验证需求。结构化分析方法是一种建模技术,用DFD描述系统的功能。
-
模型分类:功能模型:按照软件内部数据传递、变换的关系,自顶向下逐层分解,直到找到满足功能要求的所有可实现的软件,用数据流图[细化:功能分解;图元个数:7±2;圆圈:数据处理]描述。数据模型:使用实体—关系建模技术(即E-R图:包含数据对象(实体)、描述数据对象的属性及数据对象彼此间相互连接的关系)。数据对象(用矩形表示)、属性(用椭圆或圆角矩形表示)、关系(1:1、1:m、m:n)。行为模型:状态转换图(简称状态图)通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为状态转换图。初态[一个]用实心圆,终态[多个]用牛眼图形,中间态用圆角矩形。
-
[定义数据流图中各成分含义]数据字典以词条方式定义在数据模型、功能模型和行为模型中出现的数据对象及控制信息的特性,给出它们的准确定义,包括数据流、加工、数据文件、数据元素,以及数据源点、数据汇点等,它是3种分析模型黏合在一起的“黏合剂”,是分析模型的“核心”。
-
数据流是数据结构在系统内传播的路径,数据流词条包括:数据流名数据流名(要求与数据流图中该图形元素的名字一致)、简述(简要介绍它产生的原因和结果)、组成(数据流的数据结构)、来源(数据流来自哪个加工或作为哪个数据源的外部实体)、去向(数据流流向哪个加工或作为哪个数据汇点的外部实体)、流通量(单位时间数据的流通量)、峰值(流通量的极限值)。
-
数据字典中描述数据结构的方式有:定义式(清晰、准确、无二义性来描述数据结构)、Warnier图(用树形结构来描绘数据结构)。决策表组成:左上部分条件茬、左下部分动作茬、右上部分条件项、右下部分动作项。决策树(用来表达加工逻辑的一种工具,有时比决策表更直观)。
第四章
-
结构化程序设计的基本控制结构:顺序、选择、重复[单入单出]。
-
软件设计5原则:分而治之。(软件的体系结构设计、模块化设计,模块分解并不是越小越好,模块的作用范围应在其控制范围内)。模块独立性(软件系统中每个模块只涉及软件要求的具体子功能,而软件系统中其他的模块接口是简单的),度量准则:模块间的耦合和模块的内聚。耦合——模块之间的相对独立性(互相连接的紧密程序)的度量。内聚——模块功能强度(一个模块内部各个元素彼此结合的紧密程序)的度量。模块间的连接越紧密,联系越多,耦合性越高,其模块独立性就越弱。一个模块内部各个元素之间的联系越紧密,它的内聚性越高[偶然性内聚最低,功能内聚最高]。模块独立性比较强的模块应是高内聚低耦合[原则|信息隐蔽]的模块。提高抽象层次:进行软件设计时应尽量提高软件的抽象层次,按抽象级别从高到低进行软件设计。将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化。复用性设计:复用是指同一事物不做修改或稍加修改就可以多次重复使用。软件复用:将复用的思想用于软件开发,软件的重用部分称为软构件。灵活性设计:保证软件灵活性设计的关键是抽象,一个系统的任何代码、逻缉、概念在这个系统中都是唯一的,不存在重复的代码。
-
[理想]结构图是精确表达模块结构的图形表示工具:模块的调用关系和接口:结构图中,两个模块间用单向箭头连。箭头从调用模块指向被调用模块。模块间的信息传递:当一模块调用另一模块时,调用模块把数据或控制信息传送给被调用模块,使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块。条件调用:当模块A有条件地调用模块B时,在模块A的箭头尾部标一个菱形符号;循环调用:当模块A反复调用模块C和模块D时,在调用箭头尾部标一个弧形符号。结构图的形态特征:上级模块调用下级模块,存在主从关系。
-
典型的数据流类型:变换型数据流、事务型数据流[只接收一个输入,局部]。变换型数据处理问题:[取得数据C(输入)→变换数据CD(中心变换)→给出数据D(输出)]
第五章
-
面向对象=对象+类+继承+消息通信(Coad和Yourdon给出)。面向对象程序的基本组成单位是类。程序在运行时由类生成对象。对象之间通过发送消息进行通信,互相协作完成相应的功能。
-
对象是面向对象程序的核心,包含现实世界物体特征的抽象实体,是一些属性及服务的封装体,反映了系统为之保存信息和与它交互的能力。
-
类:可以将现实生活中的对象经过抽象,映射为程序中的对象。对象在程序中是通过一种抽象数据类型(类)来描述的。 让计算机创建对象,必须先提供对象的定义,即先定义对象所属的类。
-
类的重用:继承、实例、多态重用。
-
封装:面向对象的封装特性与其抽象特性密切相关。是一种信息隐蔽技术,利用抽象数据类型将数据和基于数据的操作封装在一起。用户只能看到对象的封装界面信息,看不到对象的内部细节。封装三定义:清楚的边界,所有对象的内部信息被限定在这个边界内;接口,对象向外界提供的方法,外界可以通过这些方法与对象进行交互;受保护的内部实现,软件对象功能的实现细节,不能从类外访问。通常封装规定了程序如何使用对象的数据,控制用户对类的修改和数据访问权限。一般会禁止直接访问对象的数据,只能通过接口访问对象。
-
继承:一种联结类的层次模型,为类的重用提供了方便,提供了明确表述不同类之间共性的方法。新类从现有类中派生的过程,称为类继承。公共类称为超类、父类、祖先或基类,而从其继承的类称为子类、后代或导出类。
-
多态:为请求提供服务的对象不同可以得到不同的行为。在运行时对类进行实例化,并调用与实例化对象相应的方法,称为动态绑定、后期绑定或运行时绑定。若方法的调用是在编译时确定的,称为静态绑定、前期绑定或编译时绑定。通过在子类中覆盖父类的方法实现多态。不同类的对象可以响应同名的消息(方法)来完成特定的功能,但具体的实现方法可以不同。
-
消息通信:消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。发送给一个对象的消息定义了一个方法名和一个参数表(可空),并指定某一个对象。一个对象接收到消息,则调用消息中指定的方法,并将形式参数与参数表中相应的值结合起来。
-
UML(统一建模语言):最广泛。六大特点:统一标准;面向对象;可视化,表达能力强大;独立于过程;容易掌握使用;与编程语言的关系。
-
UML的事物:事物是对模型中最具代表性成分的抽象,可分为结构事物、行为事物、分组事物和注释事物4类。
-
UML关系:依赖关系:依赖是两个事物之间的语义关系,一个事物发生变化会影响到另一事物,用一个虚线箭头表示,方向从源事物指向目标事物,表示源事物依赖于目标事物。关联关系:关联是一种结构关系,描述了两个或多个类的实例之间的连接关系,是一种特殊的依赖。分为普通关联、限定关联、关联类,聚合与复合。普通关联最常见,只要类与类之间存在连接关系就可以用普通关联表示。普通关联又分为二元关联和多元关联。二元关联描述两个类之间的关联,在中间用一条直线来表示,线上可写上关联名。限定关联通常用在一对多或多对多的关联关系中,可以把模型中的多重性从一对多变成一对一,或将多对多简化成多对一。在类图中把限定词放在关联关系末端的一个小方框内。在关联关系比较简单的情况下,关联关系的语义用其名字来概括。但在某些情况下,要对关联关系的语义做详细的定义、存储和访问,为此可以建立关联类,用来描述关联的属性。关联中的每个链与关联类的一个实例相联系。关联类通过一条虚线与关联连接。聚合也称为聚集,是一种特殊的关联。描述了整体和部分之间的结构关系。两种特殊的聚合关系:共享聚合和复合聚合。若在聚合关系中处于部分方的实例可同时参与多个处于整体方实例的构成,则该聚合称为共享聚合。若部分类完全隶属于整体类,部分类需要与整体类共存,若整体类不存在了,部分类也会随之消失或失去存在价值,这种聚合称为复合聚合。泛化关系:普通泛化与继承基本相同。但在泛化关系中常遇到抽象类(没有具体对象的类)。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。
-
UML规范定义了6种类型的图:用例图、类图[可视化地表达系统的静态结构模型]、交互图、状态图、活动图、实现图。
第六章
-
确定业务参与者:将重点放在如何使用系统,而不是如何构造系统上,有助于进一步明确系统的范围和边界。当系统比较庞大和复杂时,通过明确参与者,可以确定系统需求,有助于保证系统需求的完整性。
-
确定业务需求用例:参与者的特定任务、 从系统中创建、存储、改变、移动或读取信息、通知系统有关突发性的、外部的改变、 支持或维护系统的用例、覆盖所有功能需求。
-
创建用例图:若干个参与者和用例,以及它们间的关系构成的图形表示。系统通常都有一个总体视图,若其过于复杂,则创建多个用例图(通常围绕参与者创建),每个用例图关注系统的某一方面。
-
确定类与对象(3步骤):找出候选的类与对象:类与对象是对问题域中有意义的事物的抽象,既可能是可见的物理实体,也可能是抽象的概念。可以将客观事物分为五类:可感知的物理实体、人或组织的角色、应该记忆的事件、两个或多个对象的相互作用(交易或接触)、需要说明的概念。
-
筛选出正确的类与对象:严格考察每个候选对象,去掉不正确或不必要的,仅保留确实应该记录其信息或需要其提供服务的类与对象。筛选时主要依据六个标准:冗余:两个类表达了同样的信息,保留最富于描述力的。无关:仅把与本问题密切相关的类与对象纳入系统中。笼统:保留有更明确具体的名词对应它们所暗示的事务。属性:类应具有多个属性,仅有一个属性的类可表示为其他类的属性。操作:在需求中有些词既可以作为名词,也可以作为动词,应慎重考虑它们在本问题中的含义,以决定把它们作为类还是类中的操作。实现:应该去掉仅和实现有关的候选的类与对象。区分实体类、边界类和控制类:在类分析时首先从问题域的实体类入手,如果在建立分析对象模型时区分实体类、边界类和控制类,将有助于理解系统。实体类:系统将跟踪的持久信息;边界类:参与者与系统之间的交互;控制类负责用例的实现。
-
确定关联:两个或多个对象之间的相互依赖、相互作用的关系。标识关联的6启发式准则:检查指示状态的动词或动词短语,识别动作的主体和客体,从角色寻找关联;准确地命名关联和角色;尽量使用常用的修饰词标识出名字空间和关键属性;应消除导出其他关联的关联;在一组关联被稳定之前先不必考虑实例之间的多重性;过多的关联使得一个模型不可读。
-
确定属性:应仅考虑与具体应用直接相关的属性,不考虑那些超出所要解决的问题范围的属性。在分析过程中应先找出最重要的属性,再逐渐把其余属性增添进去。在分析阶段不要考虑那些纯粹用于实现的属性。
-
确定服务:在标识每个对象中必须封装的服务时要注意两种服务:简单的服务:每一个对象都应具备的服务,包括:建立和初始化一个新对象,建立或切断对象之间的关联,存取对象的属性值,释放或删除一个对象。这些在分析时是隐含的,图中不标出,但实现类和对象时有定义。复杂的服务:分为:计算服务:利用对象的属性值计算,以实现某种功能;监控服务:处理对外部系统的输入∕输出,外部设备的控制和数据的存取。顺序图:创建顺序图的对象和消息
第八章
-
面向对象设计准则:模块化:传统的面向过程方法中的模块通常是函数、过程及子程序等,而面向对象方法中的模块则是类、对象、接口、构件等。在面向过程的方法中,数据及在数据上的处理是分离的;而在面向对象方法中,数据及其上的处理是封装在一起的,具有更好的独立性,也能够更好地支持复用。抽象:面向对象方法支持过程抽象和数据抽象。类就是一种抽象数据类型。类的抽象分为规格说明抽象及参数化抽象。类对外开放的公共接口构成了类的规格说明,即协议。它规定了外部可以使用的服务,使用者无需知道这些服务的具体实现算法,这类抽象称为规格说明抽象。参数化抽象:当描述类的规格说明时并不具体指定所要操作的数据类型,而是将数据类型作为参数。信息隐藏:在面向对象方法中,通过对象的封装性实现。对于类的用户来说,属性的表示方法和操作的实现算法都应该是隐藏的,性能最好的是数据耦合。弱耦合:耦合:一个软件结构内不同模块之间互连的紧密程度。在面向对象方法中,对象是最基本的模块,耦合主要指不同对象之间相互关联的紧密程度。强内聚:内聚衡量一个模块内各个元素彼此结合的紧密程度。
-
在面向对象设计中存在3种内聚:服务内聚:一个服务应该完成一个且仅完成一个功能;类内聚:设计类的原则是一个类应该只有一个用途,它的属性和服务应该是高内聚的。类的属性和服务应该全都是完成该类对象的任务所必需的,其中不包含无用的属性或服务。如果某个类有多个用途,通常把它分解成多个专用的类。一般—特殊内聚:设计出的一般—特殊结构,应该是对相应的领域知识的正确抽取。可重用性:软件能再次用于其他相关应用的程度。软件重用是提高软件开发生产率和目标系统质量的重要途径。重用基本上从设计阶段开始。重用的含义:尽量使用已有的类(开发环境提供的类库及以往开发类似系统时创建的类)。如确实需创建新类,则在设计新类的协议时,应考虑将来的可重复使用性。
第九章
-
程序设计风格:标识符的命名:标识符包括模块名、变量名、常量名、标号名、子程序名以及数据区名、缓冲区名等。应选精练的意义明确的名字,简化程序语句,易理解。
-
程序的注释:注释行的数量占到整个源程序的1/3到1/2。 注释分为序言性注释和功能性注释。序言性注释通常置于每个程序模块的开头部分,是程序的整体说明,具有引导作用。序言性注释:要逐项列出:程序标题、有关本模块功能和目的说明、主要算法、接口说明(调用形式,参数描述,子程序清单)、有关数据描述(重要的变量及其用途,约束或限制条件,及其他有关信息)、模块位置(在哪个源文件中或隶属于哪个软件包)、开发简历(模块设计者,复审者,复审日期,修改日期、有关说明)功能性注释:嵌在源程序体中,描述其后的语句或程序段。
-
视觉组织—空格、空行和移行:空格:突出运算的优先性,避免运算错误。空行:用于自然的程序段之间。移行:也叫向右缩格。对于选择、循环语句,把其中的程序段语句向右做阶梯式移行。
-
编码规范:涉及版面、注释、标识符命名、变量使用、代码可测性、程序效率、质量保证、代码编译、单元测试、程序版本与维护。
第十章
- 软件测试:软件投入生产性运行前,对软件需求分析、设计规格说明和编码的最终复审,是软件质量控制的关键步骤,为了发现错误。白盒测试:对软件的过程性细节做细致检查,又称为结构测试或逻辑驱动测试。把测试对象看做一个打开的盒子或透明的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。黑盒测试:又称为功能测试数据驱动测试,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。
- 白盒测试的测试用例设计:逻辑覆盖:以程序内部的逻辑结构为基础的设计测试用例的技术。根据覆盖测试的目标分为:语句覆盖、判定覆盖、判定—条件覆盖、条件组合覆盖、路径覆盖。语句覆盖:设计若干个测试用例,运行被测程序,使得每一可执行语句至少执行一次。判定覆盖:运行被测程序,使得程序中每个判断的取真分支和取假分支至少经历一次。判定覆盖又称为分支覆盖。条件覆盖:运行被测程序,使得程序中每个判断的每个条件的可能取值至少执行一次。判定-条件覆盖:设计足够的测试用例,使得判断中每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次。条件组合覆盖:运行被测程序,使得每个判断的所有可能的条件取值组合至少执行一次。路径测试:设计足够的测试用例,覆盖程序中所有可能的路径。基本路径测试:利用程序环路复杂性计算的McCabe方法。适用于模块的详细设计及源程序,主要步骤:以详细设计或源代码作为基础导出程序的控制流图;计算得到的控制流图G的环路复杂性V(G);确定线性无关的基本路径集;生成测试用例,确保基本路径集中每条路径的执行。
- 黑盒测试的测试用例设计:等价类划分:划分等价类:有效等价类:对程序的规格说明来说,是合理的、有意义的输入数据构成的集合。利用它可以检验程序是否实现了规格说明预先规定的功能和性能。无效等价类:是不合理的、无意义的输入数据构成的集合。利用这一类测试用例检查程序中功能和性能的实现是否有不符合规格说明要求的地方。设计测试用例时,要同时考虑有效等价类和无效等价类的设计。选取测试用例:原则:为每一个等价类规定一个唯一的编号。设计一个新的测试用例使其尽可能多地覆盖尚未被覆盖的有效等价类,直到所有有效等价类都被覆盖为止。/使其仅覆盖一个尚未被覆盖的无效等价类,直到所有的无效等价类都被覆盖为止。边界值分析:对等价类划分方法的补充。大量的错误是发生在输入或输出范围的边界上,而不是在输入范围的内部。边界:于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。
- 软件测试过程:单元测试、组装测试、确认测试和系统测试。
大题
数据流图
标签:对象,程序,系统,关联,软件工程,模块,软件,概论 来源: https://www.cnblogs.com/aowei/p/16483204.html