1. 程序是人们为了完成特定的功能而编制的一组指令集,它由计算机的语言描述,并且能在计算机系统上执行。而软件不仅包括程序,还包括程序的处理对象——数据,以及与程序开发、维护和使用有关的图文资料(文档).
  2. 图 1 软件的分类
  1. 软件危机的原因:人们对软件产品认识的不足以及对软件开发的内在规律理解的偏差是软件危机出现的本质原因。
  1. 软件工程的概念:IEEE对软件工程的定义为:
    将系统化、严格约束的、可量化的方法应用于软件的开发、运行和维护,即将工程化应用于软件。同时还包括这里所述方法(系统化、严格约束的、可量化的方法)的研究。
    具体说来,软件工程是以借鉴传统工程的原则、方法,以提高质量,降低成本为目的指导计算机软件开发和维护的工程学科。它是一种层次化的技术。
    软件工程:用来开发软件的工程化的方法
  1. 软件工程以关注质量为目标,其中过程、方法和工具是软件工程的3个要素。
  1. 软件工程研究的内容主要包括以下两个部分:
    软件开发技术:主要研究软件开发方法、软件开发过程、软件开发工具和环境。
    软件开发过程管理:主要研究软件工程经济学和软件管理学。
  1. 常见的软件开发方法包括:
    ①结构化方法
    ②面向数据结构方法
    ③面向对象方法
    ④形式化方法
  1. 软件的诞生和生命周期是一个过程,我们总体上称这个过程为软件过程。
  1. 软件生命周期的概念
    软件产品的生命周期是指从设计该产品的构想开始,到软件需求的确定、软件设计、软件实现、产品测试与验收、投入使用以及产品版本的不断更新,到最终该产品被市场淘汰的全过程。
  1. 问题的定义→…………→退出市场
    图 2 软件的生命周期
  1. 软件开发模型
    ①瀑布模型
    ②快速原型模型
    ③增量模型
    ④螺旋模型
    ⑤喷泉模型
    ⑥基于组件的开发模型
    ⑦统一软件开发过程模型
    ⑧敏捷模型
    ⑨极限编程
  1. 图 3 螺旋模型

13.

图 4 统一软件开发过程模型

  1. 可行性研究需要从多个方面进行评估,主要包括:
    战略可行性
    操作可行性
    计划可行性
    技术可行性
    社会可行性
    市场可行性
    经济可行性
    风险可行性
  1. 需求分析4步骤:需求获取、分析建模、需求描述、需求验证
  1. 结构化分析方法是一种面向数据流的需求分析方法,它主要适用于数据处理领域问题
  1. 结构化分析模型
    此模型的核心是“数据字典”,它描述软件使用或产生的所有数据对象。围绕着这个核心有3种不同的图:
    “数据流图”指出当数据在软件系统中移动时怎样被变换,以及描绘变换数据流的功能和子功能,用于功能建模
    “实体-关系图”(E-R图)描绘数据对象之间的关系,用于数据建模
    “状态转换图”指明了作为外部事件结果的系统行为,用于行为建模
  1. 软件设计在软件开发中处于核心地位。
  1. 软件设计的原则:模块化、抽象、逐步求精、信息隐藏、复用性设计、灵活性设计
  1. 软件设计的分类:
     从活动任务来看,软件设计是对软件需求进行:数据设计、体系结构设计、接口设计、构件设计和部署设计。
    数据设计创建在高抽象级别上表示的数据模型和信息模型。然后,数据模型被精化为越来越多和实现相关的特定表示,即基于计算机的系统能够处理的表示。
    体系结构设计为我们提供软件的整体视图,定义了软件系统各主要成份之间的关系。
    接口设计告诉我们信息如何流入和流出系统以及被定义为体系结构一部分的构件之间是如何通信的。
    构件设计完整的描述了每个软件构件的内部细节,为所有本地数据对象定义数据结构,为所有在构件内发生的处理定义算法细节,并定义允许访问所有构件操作的接口。
    部署设计指明软件功能和子系统如何在支持软件的物理计算环境内分布。
     从工程管理角度来看,软件设计分为概要设计(总体设计)和详细设计。前期进行概要设计,得到软件系统的基本框架。后期进行详细设计,明确系统内部的实现细节。
    概要设计确定软件的结构以及各组成部分之间的相互关系。它以需求规格说明书为基础,概要地说明软件系统的实现方案,包括:
    目标系统的总体架构
    每个模块的功能描述、数据接口描述及模块之间的调用关系
    数据库、数据定义和数据结构等
    其中,目标系统的总体架构为软件系统提供了一个结构、行为和属性的高级抽象,由构成系统的元素的描述、这些元素之间的相互作用、指导元素集成的模式以及这些模式的约束组成。
  1. 数据库结构设计包括:概念结构设计、逻辑结构设计和物理结构设计。

22.

图 5 结构化设计与结构化分析的关系

  1. 面向对象的基本概念
    (1) 一种使用对象(它将属性与操作封装为一体)、消息传送、类、继承、多态和动态绑定来开发问题域模型之解的范型。
    (2) 一种基于对象、类、实例和继承等概念的技术。
    (3) 用对象作为建模的原子。
  1. 名词解释
     对象:现实世界中各种各样的实体。其中,内部状态称为属性,运动规律称为方法和属性。
     类:具有相似内部状态和运动规律的实体集合。
     消息:对象之间的相互联系和相互作用的方式。包括发送消息的对象,接收消息的对象,消息传递办法,消息内容,反馈。
     类的特性:抽象、继承、封装、多态、重载
     包:各种各样的不同系统。系统称为包。
     包的接口类:系统通过设立接口界面类或对象来与其他系统进行交互。其他系统只看到这个接口界面类或对象,即接口类。
  1. 统一建模语言(Unified Modeling Language,UML)是一种通用的可视化建模语言,可以用来描述、可视化、构造和文档化软件密集型系统的各种工件。它记录了与被构建系统的有关的决策和理解,可用于对系统的理解、设计、浏览、配置、维护以及控制系统的信息。这种建模语言已经得到了广泛的支持和应用,并且已被ISO组织发布为国际标准。
  1. UML的图
    UML的主要内容可以由下列5类图(共9种图形)来定义。
     用例图:用例是对系统提供的功能的描述。从用户的角度描述系统功能,并指出各个功能的参与者。
     静态图:描述系统静态结构。
     类图:定义系统中的类。表示类之间的关系,如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。类图描述静态关系,系统整个生命周期有效。
     对象图:类图的实例。使用与类图相同的标识。不同点在于对象图显示类的多个对象实例,而不是实际的类。一个对象图是类图的实例。
     包图:包或类组成。表示包与包之间的关系。用于表述系统之间的分层结构。
     行为图:描述系统的动态模型和组成对象间的交互关系。其中状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件。
     交互图:描述对象间的交互关系。
     顺序图:显示对象之间的动态合作关系,强调对象间的消息发送顺序,并显示对象间的交互。
     协作图:描述对象间的协作关系,显示对象间的动态合作关系。显示对象以及它们之间关系。
     实现图:提供关于系统实现方面的信息。
     构件图:描述代码构件的物理结构及各构建之间的依赖关系。
     部署图:定义系统中软硬件的物理体系结构。
  1. UML“4+1”视图
    UML用模型来描述系统的静态特征结构及动态特征行为,从不同的角度为系统建模,形成不同的视图。每个视图代表完整系统描述中的一个对象,表示这个系统中的一个特定的方面,每个视图都由一组图组成,每张图强调系统中某一方面的信息。
    为了更好地表现同一事物的不同方面,我们经常采用不同的视图,每个视图从一个角度看待和描述问题;在UML中,存在“4+1”视图。
     用例视图:描述项目干系人的需求,所有其他视图都是从用例视图派生而来,该视图把系统的基本需求捕获为用例并提供构造其他视图的基础。
     逻辑视图:描述系统功能和词汇。作为类和对象的集合,重点是展示对象和类是如何组成系统、实现所需系统行为的。

图 6 UML”4+1”视图

  1. 用例图中的关系
  1. 属性和操作的可见性
    符号 种类 语义
  • Public公有的 可供其它类使用

Protected受保护的 其子类可以使用

  • Private私有的 只有本类的操作才能使用
    ~ Package包的 只有在同一包中声明的类才能使用

30.
 多重性(multiplicity)(用于表示关联中角色的多重性)
 多重性表示可以有多少个对象参与该类关联
 非负整数的子集表示
 表示没有实例的关联,一般不用

 二元关联指两个类之间的关联。多元关联指一对多或多对多的关联。三元关联使用菱形符号连接关联类。
三元关联
 聚合关系( aggregation )
聚合是一种特殊的关联关系,指明一个聚集(整体)和组成部分之间的关系,即它表示关联的双方是整体与部分的关系,从整体这一端来看,它表示:has a…(即:表示我有…,我拥有…)这层含义。

示例:飞机场与飞机的关系,一个飞机场可以聚集多架飞机,如果飞机场不存在了,那么飞机是可以存在的,因此它们之间就是整体与部分的关系。聚合关系表明两者之间的关系没有那么紧密。

 组合关系( contains-a关系)
组合是一种强聚合,部分和整体的生命周期是一致的。其中,部分不可以单独存在,即:整体消失了,部分也随之消失。
组合的特点:
整体和部分的关系,个体唯一属于一个整体。
组合关系中的“整体”控制着“部分”的生存期。
组合是一种特殊的聚合关系,又称强聚合。

示例:一个窗口包含有若干个按钮和菜单,在创建窗口的同时,这些按钮和菜单就被同时创建出来了,如果窗口关闭了,那么这些按钮和菜单也就不存在了,所以窗口与按钮和菜单是一种组合关系。窗口与按钮和菜单的生命周期一致,要么同时创建要么同时销毁。

 关联类(association class):可根据需要进行设计
关联本身也可以有特性,通过建立关联类可以进一步描述关联的属性、操作和其他信息。
通过虚线与关联连接。

 依赖关系
描述了一个类的变化对依赖于它的类产生影响的情况。如果修改元素X的定义可能会导致对另一个元素Y的定义修改,则称元素Y依赖元素X。
依赖关系主要体现在以下几种情况:
一个类向另一个类发送消息,即一种调用关系,一个类调用了另一个类的方法
一个类是另一个类的数据成员类型
一个类是另一个类的操作的参数类型
依赖主要体现在使用(调用)上,即元素A使用元素B所提供的功能,如果没有元素B所提供的功能,那么元素A是无法完成工作的,如果此时元素B修改了其中的某个方法,那么直接就会影响到元素A的工作。由此可见,依赖关系是强耦合关系中的一种。

 泛化(extends)
在面向对象中泛化一般称为继承关系,存在于父类与子类、父接口与子接口之间。泛化表示的是:kind of…,即表示是一种…东西。

 实现(implements)
对应于类和接口之间的关系,表示一个类实现一个或多个接口。

示例:2种常用表示法

  1. 顺序图
    顺序图描述了一组对象的交互方式,它表示完成某项行为的对象和这些对象之间传递消息的时间顺序。顺序图由对象(参与者的实例也是对象)、生命线、控制焦点、消息等组成。生命线是一条垂直的虚线,表示对象的存在时间;控制焦点是一个细长的矩形,表示对象执行一个操作所经历的时间段;消息是作用于控制焦点上的一条水平带箭头的实现,表示消息的传递。

32.

图 7 面向对象的需求分析的示意图

  1. 在面向对象的分析中,通常需要建立3种形式的模型,它们分别是:
     描述系统数据结构的对象模型
     描述系统控制结构的动态模型
     描述系统功能的功能模型
    这3种模型都涉及数据、控制、操作等共同的概念,只不过每种模型描述的侧重点不同。一个典型的软件系统通常包括的内容为:它使用数据结构(对象模型),执行操作(动态模型),并且完成数据值的变化(功能模型)。
  1. 根据建模的侧重点的不同,可以将软件体系结构的模型分为结构模型、框架模型、动态模型、过程模型和功能模型5种。
  1. 调用∕返回风格
    各个构件通过调用其他构件和获得返回参数来进行交互,配合完成功能。包括主程序/子程序、面向对象风格、层次结构。
  1. MVC(模型-视图-控制器)
    MVC强调将用户的输入、数据模型和数据表示方式分开设计,一个交互式应用系统由模型、视图、控制器3部分组成,分别对应内部数据、数据表示和输入/输出控制部分。

图 8 MVC模型处理流程图
系统拦截到用户请求,根据相应规则(多数采用路由技术),将用户请求交给控制器,控制器决定哪个模型来处理用户的请求;模型根据业务逻辑处理完毕后将结果返回给控制器;然后控制器将数据提交给视图;视图把数据组装之后,呈现给用户。其中,模型处理所有的业务逻辑和规则,视图只负责显示数据,控制器负责用户的请求,这样将业务和表现层分离,以便业务代码可以被用于任何相似的业务中,视图代码也可以根据需要随意替换。

  1. Java EE体系结构框架
    MVC是很多现代体系结构框架的基础,主要应用于企业和电子商务系统中。Java EE的核心体系结构就是在MVC框架的基础上进行扩展得到的,如图所示。Java EE模型是分层结构,中间是3层(表示层、业务层和集成层)包含应用构件,客户层和资源层处于应用的外围。

图 9 J2EE的核心体系结构框架

  1. 面向对象设计的原则
    模块化
    抽象化
    信息隐藏
    低耦合
    高内聚
    复用性
  1. 系统设计的步骤
  1. 典型的面向对象设计模型
  1. 软件测试是发现软件中错误和缺陷的主要手段。为了保证软件产品的质量,软件开发人员通过软件测试发现产品中存在的问题,并对其进行及时的修改。可以说,软件测试的过程就是发现并改正软件缺陷的过程。

42.

图 10 V模型示意图

图 11 W模型示意图

43.

图 12 软件测试的分类

  1. 例:
    Dim x,y As Integer
    Dim z As Double
    IF(x>0 AND y>0) THEN
    z=z/x
    END IF
    IF(x>1 OR z>1) THEN
    z=z+1
    END IF
    z=y+z

对代码进行逻辑覆盖测试的第一步就是绘制出代码的程序流程图。