软件工程

一些重要的知识点…

Posted by YZune on April 30, 2018

软件危机的根本原因是什么?

软件危机的根本原因是软件本身的复杂性。它主要包括以下两点:1. 开发结构的逐渐复杂性;2. 软件技术的发展复杂性。

软件工程的定义是什么,如何理解定义中的三个核心要素?

软件工程的定义是:1. 将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件中;2. 在(1)中所述方法的研究。

软件工程的三个核心要素是:方法、工具和过程模型。

  • 方法:方法是一种把人的思维和行动结构化的明确方式。软件工程方法为软件开发提供了“如何做”的技术。它包括了多方面的任务:需求分析、设计、编程、测试和支持。软件工程方法依赖于一组基本原则,这些原则控制了每一个技术区域且包含建模活动和其他描述技术。目前主流的软件开发方法有两类:结构化方法和面向对象方法。
  • 工具:工具为软件工程方法提供了自动的或半自动的软件支持环境。目前,已经推出了许多软件工具,这些软件工具集成起来,建立起称之为计算机辅助软件工程的软件开发支撑系统。软件工具通常由工具、工具接口和工具用户接口三部分组成。
  • 过程模型:过程则是将软件工程的方法和工具综合起来以达到合理、及时地进行计算机软件开发的目的。过程定义了方法使用的顺序、要求交付的文档资料、为保证质量和协调变化所需要的管理、及软件开发各个阶段完成的里程碑。基于普遍认可的原理“好的过程决定好的结果”,过程是软件工程领域研究的重点。

软件工程包括了哪些内容?

内容大致分为10个领域:软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程、软件工程工具和方法、软件质量。

软件开发过程模型中的瀑布模型、增量模型和螺旋模型分别有哪些特点?适用于什么样的系统开发?

瀑布模型

又称线性模型或生存周期模型。将软件生命周期划分为软件计划、需求分析和定义、软件设计、软件实现、软件测试、软件运行和维护这6个阶段,规定了它们自上而下、相互衔接的固定次序,如同瀑布流水逐级下落。

特点:

  1. 前一项活动的工作成果作为后一项活动的输入。
  2. 以这个输入为工作依据实施该项活动应完成的内容。
  3. 给出该项活动的工作成果,并作为输出传给下一项活动。
  4. 评审该项活动的实施,如评审通过,则继续下一项活动,否则返回之前的活动。

适用于:

  1. 用户的需求非常清楚全面,且在开发过程中没有或很少变化。
  2. 开发人员对软件的应用领域很熟悉。
  3. 用户的使用环境非常稳定。
  4. 开发工作对用户参与的要求很低。
增量模型

特点:

  1. 增量模型是迭代和演进的过程,灵活性高。
  2. 增量模型把软件产品分解成一系列的增量构件,在增量开发迭代中逐步加入。
  3. 每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
  4. 早先完成的增量可以为后期的增量提供服务。

适用于:

  1. 项目既定期限前人力不足。
  2. 进行已有产品升级或新版本开发。
  3. 对完成期限有严格要求。
  4. 开发人员对所开发的领域比较熟悉而且已有原型系统。
螺旋模型

特点:

  1. 将瀑布模型与演化模型结合起来,并且加入两种模型均忽略了的风险分析。
  2. 螺旋模型沿着螺线旋转,自内向外每旋转一圈便开发出更完善的一个新版本。
  3. 支持用户需求的动态变化,方便用户参与软件开发的所有关键决策,有助于提高目标软件的适应能力。
  4. 方便项目管理人员及时调整管理决策,从而降低软件开发的风险。

适用于:

  1. 螺旋模型只适合于大规模的软件项目。

什么是软件生命周期?

经典的软件工程思想将软件开发分为5个基本阶段:需求分析、系统设计、系统实现、测试、维护。

如何理解软件需求分析与设计在软件工程中的地位?

分析和设计在软件工程中的重要性体现在其发生在软件系统的定义阶段。

其中需求分析阶段为整个软件开发项目的顺利进行和成功打下良好的基础,而设计阶段则为软件程序的编写打下良好的基础。

这两个阶段若做好,可以从根本上减少整个软件开发过程中耗费的时间及相应的开发成本;反之,如果对系统的需求分析阶段不重视,所开发的软件无法准确反映用户的需求甚至发生错误,所带来的损失将是不可估量的。

结构化分析模型分为哪三个部分?

核心是数据字典。

  1. 数据对象描述:实体-关系图
  2. 加工规格说明:数据流图
  3. 控制规格说明:状态-迁移图

数据流图的作用是什么?其基本图形要素有哪几个?

数据流图在功能模型中用来表达系统内数据的运动情况。 作用有:

  1. 便于用户表达功能需求和数据需求及其联系。
  2. 便于两类人员共同理解现行系统和规划系统的框架。
  3. 清晰表达数据流的情况。
  4. 有利于系统建模。

其基本图形要素有四个,圆圈表示数据加工,矩形表示外部实体,箭头表示数据流,双横线表示数据存储。

如何理解分层的数据流图中“父图与子图的平衡”?

上一层数据流图(父图)里面的某个加工被分解为下一层数据流图(子图)里的多个数据加工时,其所有的输入数据流、输出数据流应该完全被继承到子图中,保持父图与子图的完全一致。

如何理解结构化设计方法中的“模块独立性”?

SC图的作用是什么?SC图中的模块分为哪几种?

软件结构图是结构化设计中划分模块的重要工具,用来表达软件的组成模块及其调用关系。其中的模块分为以下四种:

  1. 传入模块:从下属模块取得数据,进行某些处理后将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。
  2. 传出模块:从上级模块获得数据,进行某些处理后将其传送给下级模块。它传送的数据流叫做逻辑输出数据流。
  3. 变换模块:从上级模块取得数据,进行特定的处理后将其转换成其他形式,再传送回上级模块。
  4. 协调模块:对所有下属模块进行协调和管理的模块。

模块化设计的原则有哪些?

  1. 在选择模块化设计的次序时,必须在一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。
  2. 使用“黑盒”技术:在设计当前模块时,先把该模块的所有下层模块定义成“黑盒”,在设计中利用它们暂时不考虑其内部结构和实现。上一步定义的“黑盒”在下一步就可以对它们进行设计和加工。最后,全部“黑盒”的内容和结构应该完全被确定。
  3. 在设计下层模块时,应该考虑模块的耦合和内聚问题,尽可能做到高内聚低耦合,以提高初始结构图的质量。
  4. 划分模块时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设立中间层次。

面向对象的核心概念:对象+类+继承+消息传递,封装,多态和动态绑定。

对象

对象是系统中用来描述客观事物的,具有明确语义边界的实体,是构成系统的基本单位,有一组属性和一组对属性进行的操作组成。属性一般定义为私有的,只能通过执行对象的操作来改变;操作又称为方法或服务,它描述了对象执行的功能,通过消息传递,还可为其他对象所用。复杂的对象可由相对比较简单的对象以某种方法层层组合、构造而成。

把具有相同特征和行为的对象归在一起定义,类的概念由此产生。类将一组数据的属性和数据上的一组合法操作抽象封装。在一个类中,每个对象都是类的实例,它们都可以使用类中定义的方法。类定义了各个实例所共有的结构,描述了数据结构、算法和外部接口。使用类的构造方法,可以在创建该类的实例时初始化这个实例的状态。

继承

客观事物既有共性,也有特性。如果某几个类之间具有共性的东西,就可以抽取出来放在一个父类中,而将各个类所特有的东西放在子类中分别描述,则可建立起子类对父类的继承。继承是在已有类的基础上,再考虑抽象过程中被舍弃的一部分对象的特性,形成一个新的类,这个类具有前一个类的全部特性,是前一个类的子集,这种层次结构即为继承结构。

消息

消息是面向对象系统中实现对象间交互的手段,是要求某个对象执行某个操作的规格说明,是对象之间相互请求或相互协作的途径。消息的使用类似于结构化方法中的函数调用,消息中指定了某一个实例、一个操作名和一个参数表(可能是空的),向对象实施各种操作,就是访问一个或多个在对象中定义的各种方法。

封装

封装是指隐藏对象的属性和操作,并将其组合成一个独立的对象,仅对外公开接口,用户只能看到对象封装接口上的信息,不能直接访问对象的属性。对象内部的操作才能访问和修改对象的属性。封装是一种信息隐蔽技术,其目的是增强安全性,使对象生产者和使用者分离,即定义与实现分离。信息隐蔽技术是软件设计模块化、软件复用和软件维护的基础。封装的特征是具有清楚的边界、一个接口和受保护的内部实现。面向对象中的类和对象的概念很好地体现了封装的思想。

多态和动态绑定

多态是指同一个名称的操作或属性在多个不同类中出现,即多个类中定义同一个操作名或属性名,但实现不同。多态性就是指同一个消息被不同对象接收的时候可产生不同的执行结果。一个典型的例子就是类中定义的属性和操作由子类继承后可以具有不同的数据类型和行为动作。

多态性支持“同一接口,多种方法”的面向对象原则,使得高层代码在低层多次复用,简化了软件的结构设计,增加了数据处理的灵活性,提高了软件的可复用性和可扩充性。

动态绑定是一种多态性方法,又称为运行时绑定,它允许程序推迟调用正确的方法,直到程序开始运行。程序在运行以前就已经确定好动作,但只有在运行时才能完成过程调用和目标代码的连接。即在程序运行过程中,接受消息的对象根据所属类,动态选定类中定义的操作,将请求操作与实现方法绑定。这个方法大大提高了程序设计的灵活性,提高了软件开发的效率。

多态性的实现有两种:

  1. 利用继承关系,把所有数据类型当做一个抽象数据类型的子类型。
  2. 利用模板机制,把所有可能的数据类型用一个参数化的数据类型来代替。

OOA和OOD的步骤。

OOA面向对象分析

OOA是一个反复迭代渐增的过程,包括以下步骤:

  1. 标识场景、用例,构造需求模型。
  2. 构造系统对象的静态模型。
  3. 构造系统对象的动态模型。
  4. 构造系统对象的功能模型。
  5. 步骤1~4反复迭代后,利用用例/场景来评审分析模型。
OOD面向对象设计

面向对象设计分为两个阶段:系统对象设计阶段和系统体系结构设计阶段。

系统对象设计:建立系统整体结构并确认接口
  1. 设计对象接口:加入接口有利于建立对象结构与对象交互,因此能更充分地展现对象的静态、动态关系。其描述方法有协议描述和实现描述两种。
  2. 设计算法和数据结构:利用用例图、对象图、对象交互图等为对象的属性和操作设计数据结构和实现算法。
  3. 确认子系统:一个子系统可以通过它所提供的服务来标识,所以建立系统整体结构图,以系统整体结构图描述各个子系统之间的相互服务关系。
  4. 确定子系统之间的通信:子系统间可能通过建立客户机/服务器连接进行通信,也可能通过端对端连接进行通信,因此需要确定子系统之间的交互方式。
系统体系结构设计:选择系统环境与设计体系结构
  1. 任务管理设计:主要包括从主结构设计、分布式结构设计、增加协调者和资源管理。通过对对象动态模型的分析来决定采用哪种设计方式。
  2. 数据管理设计:包括数据结构设计和数据管理设计。
  3. 人机界面设计:人机界面强调用户对系统的命令以及系统如何向用户提供信息,主要包括窗口、菜单和报告的设计。

面向对象方法主要优点

  1. 稳定性好:较小的需求变化不会导致大的系统结构的改变。
  2. 易于理解:面向对象的模型对现实映射更直观,更有对应关系。
  3. 适应性强:能更好地适应用户需求的变化。
  4. 利用面向对象技术开发的系统具有更高的可靠性。

UML体系结构中的5种视图的作用?

总描述:每个视图都是某个特定方面对于整个系统描述的一个投影,结合起来可以完整描述整个系统,其中用例视图是描述系统功能的核心和其他视图的出发点。

作用:指导需求分析、系统设计、系统实现、测试和维护的软件开发过程。

  1. 用例视图:描述系统的功能需求,找出用例和行为者。
  2. 逻辑视图:描述如何实现系统内部的功能。
  3. 构件视图:描述系统代码的构件组织、实现模块以及它们之间的依赖关系。
  4. 进程视图:描述系统并发性,并处理这些线程的通信和同步。
  5. 部署视图:描述系统的物理设备部署。

UML中的三大类九种图的定义和作用。

UML - Unified Modeling Language - 统一建模语言

UML三种基本构造块
  1. 事物:事物是整个模型的基础,其中结构事物通常是模型的静态部分,可用来对概念或物理元素建模;行为事物是模型的动态部分,是跨越时间和空间的行为;分组事物有效地组织模型,使模型结构化;注释事物则是为了让模型更易于理解,被用来描述和说明模型元素等。
  2. 关系:有4种关系,分别是依赖、关联、泛化和实现,用来说明多个模型元素在语义上的相关性以及形成更进一步的语义定义。
  3. 图:从系统的不同侧面描述软件系统。
九种图
  1. 用例图:描述用户对系统的需求。UML侧重从最终用户的角度来理解软件系统的需求,用例图具体描述相关用户、用户如何使用这个系统、系统和用户以及系统和外部系统之间的交互过程,以便使系统的用户更容易理解这些元素的用途,也便于软件开发人员最终实现这些元素。
  2. 类图:类图是描述类、接口以及它们之间关系的图,用来定义系统中各个类的静态结构。类图通过系统中的类以及各个类之间的关系描述系统的静态视图。
  3. 对象图:对象图展示了一组对象及它们间的关系。用对象图说明类图中所反映的事物实例的数据结构和静态快照,表达了系统的静态设计视图或静态过程视图。
  4. 时序图:展现了一组对象和由这组对象收发的消息,用于按时间顺序对控制流建模,说明系统的动态视图。
  5. 协作图:展现了一组对象,这组对象间的连接以及这组对象收发的消息。它强调收发消息的对象的结构组织,按组织结构对控制流建模。
  6. 状态图:展示了一个特定对象所有可能状态以及由于各种事件的发生而引起的状态间的转移。一个状态图描述了一个状态机,用状态图说明系统的动态视图。它对于接口、类或协作的行为建模尤为重要,可用它描述用况实例的生命周期。
  7. 活动图:活动图是一种特殊的状态图,描述需要做的活动、执行这些活动的顺序以及工作流。它对于系统的功能建模特别重要,强调对象间的控制流程。
  8. 构件图:构件图展现了一组构件之间的组织和依赖,用于对原代码、可执行的发布、物理数据库和可调整的系统建模。
  9. 部署图:展现了对运行时处理节点以及其中构件的部署。它描述系统硬件的物理拓扑结构,以及在此结构上执行的软件。用部署图说明系统结构的静态部署视图,即说明分布、交付和安装的物理系统。

UML中的公共机制和扩展机制

为了使UML整个模型更加一致,UML定义了4种公共机制:

  1. 规格说明:提供对构造块的语法或语义的文字描述,是非图形的描述,还有可能是额外的描述。
  2. 修饰:把建模的表述可视化,使之容易理解。
  3. 通用划分:两种划分:一是类和对象的划分,即把表述者和被表述者分开;二是接口和实现的分离,即把实施对象和实施过程分开。
  4. 扩展机制:UML仅提供蓝本,允许派生出新事物,增加新规则,并可对新规则进行描述。

UML的扩展机制包括构造型、标记值和约束。

RUP的特点和二维组织框架

RUP的定义(特点)

RUP是用例驱动的,以体系结构为核心的,以质量控制和风险管理为目标的,迭代的、增量的开发过程。

RUP的二维组织框架
  1. 过程的第一维(横轴)表明过程的生存期,它反映了过程被激活时的动态情况,用周期、阶段、迭代和里程碑表示。
  2. 过程的第二维(纵轴)表明过程的静态状况,通过过程构件、活动、工作流、制品和工作人员描述过程。
RUP的组织形式
  1. 工作流:业务建模、需求、分析和设计、实现、测试、部署、配置和变更管理、项目管理、环境。
  2. 阶段:初始、细化、构造、移交。

用例之间可能有哪些关系?举例说明。

用例之间存在的关系主要分为三种:包含、扩展、泛化。

  1. 包含关系:包含关系中,基本用例包含另一个用例的行为功能,如果没有后者它将是不完整的,它依赖于被包含部分才有意义。
  2. 扩展关系:一个用例的对话流程中,可能会根据条件插入执行另一个用例以使用其功能,这个被插入的用例可以定义为基础用例的增量扩展即扩展用例,这样在描述基本动作序列的基本用例和描述可选动作序列的扩展用例之间就建立了扩展关系。扩展用例是可选的,在一定条件下才会执行。
  3. 泛化关系:泛化关系即继承关系,若一个用例可以被特别列举为一个或多个子用例,这就称为用例泛化。

掌握用例图的画法和对用例的描述

用例图的规格说明
  • 用例名称:加载电子信息。
  • 用例简述:监督员登录电子投票系统后,加载电子信息并审核电子信息以启动投票。
  • 行为者:监督员。
  • 前置条件:监督员以管理员身份登录系统,审核信息完毕后再次成功验证身份。
  • 后置条件:成功启动投票。
  • 基本事件流:
    1. 输入验证码确认监督员身份。
    2. 审核竞选信息。
    3. 再次输入验证码。
    4. 启动投票
  • 备选事件流
    1. 输入验证码错误,提示重新输入。
    2. 审核信息发现有误,监督员向系统提出“重载数据”请求,重载数据。
    3. 输入验证码错误,提示重新输入。
  • 异常事件流:检测到无法识别的标识符或系统故障,操作失败,允许监督员重新输入或登录。