软件工程

第一章、 概述

解决软件危机的途径

 1)正确认识软件的概念。
 2)充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合共同完成的工程项目。
 3)充分吸取和借鉴人类长期以来从事各种工程项目所积累的行之有效的原理、概念、技术和方法,特别要吸取几十年来人类从事计算机软硬件研究和开发的经验教训。
 4)推广使用在实践中总结出来的开发软件的成功技术和方法,并研究探索更有效的技术和方法;
 5)开发和使用更好的软件工具;
 6)良好的组织管理措施。

什么是软件?

软件是计算机系统中与硬件相互依存的另一部分,它是包括程序,数据及其相关文档的完整集合。
程序是按事先设计的功能和性能要求执行的指令序列。
数据是使程序能正常操纵信息的数据结构。
文档是与程序开发,维护和使用有关的图文材料。
软件=程序+数据+文档

软件工程方法学的3要素:方法、工具和过程。

方法是完成软件开发的各项任务的技术方法,回答“怎样做”的问题;
工具是为运用方法而提供的自动或半自动的软件工程支撑环境;
过程是为了获得高质量的软件所需完成的一系列任务的框架,它规定了完成各项任务的工作步骤。

面向对象(程序设计)的三大特征:封装、继承、多态

面向对象方法学——强调主动地多次反复迭代

面向对象方法:把数据和行为看成同等重要,它是一种以数据为主线,把数据和对数据的操作紧密地结合起来的方法。

面向对象方法学4个要点:
对象(object):是对数据和操作的封装。
类(class):类是对具有相同数据和相同操作的对象的定义。
继承:按照父类与子类的关系,把若干个相关类组成一个层次结构的系统。
消息:对象彼此间仅能通过发送消息互相联系。

面向对象方法学的优点

 面向对象方法学的尽量模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。
 面向对象方法学开发软件的过程,是一个主动地多次反复迭代的演化过程,保证了在各项开发活动之间的平滑过渡。
 促进了软件重用。最终的软件产品由许多较小的、基本上独立的对象组成,每个对象相当于一个微型程序,而且大多数对象都与现实世界中的实体相对应,降低了复杂性,提高了可理解性,简化了开发和维护工作。

软件过程模型

瀑布模型
 前一阶段的工作完成之后,才能开始后一阶段的工作;
 前一阶段的输出文档就是后一阶段的输入文档。
 每个阶段都必须完成规定的文档,是“文档驱动”的模型
快速原型模型
 是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集。
增量模型
 增量模型把软件产品作为一系列的增量构件来设计、编码、集成和测试。每个构件由多个相互作用的模块构成,并且能够完成特定的功能。
螺旋模型
 可以把它看作在每个阶段之前都增加了风险分析过程的快速原型模型。

Rational统一过程

 Rational统一过程(Rational Unified Process, RUP)是由Rational软件公司推出的一种完整而完美的软件过程。
 RUP是一种迭代的,以架构为中心的,用例驱动的软件开发方法。强调用迭代和渐增的方式开发软件。
 RUP是一种具有明确定义和结构的软件工程过程。
 RUP被广泛应用在不同工业领域中的

1.敏捷过程

具有高效、快速响应变化的开发过程。其核心价值观是:
 (1)个体和交互胜过过程和工具;
 (2)可以工作的软件胜过面面俱到的文档;
 (3)客户合作胜过合同谈判;
 (4)响应变化胜过遵循计划。

2.极限编程

敏捷过程中最著名的一种,指把好的开发实践运用到极致,多应用于软件需求模糊的场合。使得敏捷过程能够较好地适应商业竞争环境下对小型项目提出的有限资源和有限开发时间的约束。

第二章、 可行性研究

系统流程图

• 是描绘系统的工具。
• 用图形符号以黑盒子形式描绘组成系统的每个部件(程序,文档,数据库,人工过程等)。
• 表达的是数据在系统各部件之间流动的情况。

数据流图 (DFD)

• 它描绘 数据 从输入移动到输出的过程中 所经受的变换。
• 它描绘 数据 在软件中 流动和被处理的 逻辑过程。
可行性研究阶段,数据流图与数据字典共同构成系统的逻辑模型。

数据字典

是关于数据的信息的集合,也就是对数据流图中包含的所有元素的定义的集合。
数据字典应该对下列元素进行定义:
• 1)数据流;
• 2)数据元素(数据流分量);
• 3)数据存储;
• 4)处理。

第三章、 需求分析

 数据字典:是分析模型的核心,它描述软件使用或产生的所有数据对象。
 实体-联系图:描绘数据对象及数据对象之间的关系,是用于建立数据模型的图形。
 数据流图:描绘当数据在软件系统中移动时被变换的逻辑过程,指明系统具有的变换数据的功能,因此,数据流图是建立功能模型的基础。
 状态转换图(简称为状态图):描绘了系统的各种行为模式(称为“状态”)和在不同状态间转换的方式。状态转换图是行为建模的基础。

ER图

包含了实体(即数据对象)、关系和属性等3种基本成分,通常用矩形框代表实体,用连接相关实体的菱形框表示关系,用椭圆形或圆角矩形表示实体(或关系)的属性,并用直线把实体(或关系)与其属性连接起来。

范式

通常用“范式(normal forms)”定义消除数据冗余的程度。第一范式(1 NF)数据冗余程度最大,第五范式(5 NF)数据冗余程度最小。(为了消除数据冗余,关系数据库必须满足的规则)
 第一范式,每个属性值都必须是原子值,即仅仅是一个简单值而不含内部结构。
 第二范式,满足第一范式条件,而且每个非关键字属性都由整个关键字决定(而不是由关键字的一部分来决定)。
 第三范式,符合第二范式的条件,每个非关键字属性都仅由关键字决定,而且一个非关键字属性值不依赖于另一个非关键字属性值。

状态转换图

通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。(状态、事件、符号)

层次方框图

采用用树形结构,用一系列的矩形框 描绘数据的层次结构。
 顶层是一个单独的矩形框,代表完整的数据结构;
 下面的各层矩形框代表这个数据的子集;
 最底层的框代表 组成这个数据的 实际数据元素(不能再分割的元素)。

第四章、 形式化说明技术

什么是形式化方法(FormalMethod)

 广义:将离散数学的方法用于解决软件工程领域的问题;主要包括建立精确的数学模型以及对模型的分析。
 狭义:运用形式化语言,进行形式化的规格描述、模型推理和验证的方法。
常用的形式化方法
 较严格的形式化方法(语法和语义都严谨):有穷状态机、Petri网、Z语言………
 半形式化方法(语法和语义都不太严谨):系统流程图、数据流图、数据字典、ER图、数据库范式、状态转换图、层次方框图、Warnier图、IPO图、IPO表………

一个有穷状态机包括下述5个部分

状态集J、输入集K、由当前状态和当前输入确定下一个状态(次态)的转换函数T、初始态S和终态集F。

Petri网包含4种元素

 一个有穷位置集P(Place):圆形
 一个有穷转换集T(Transition):线性/矩形
 输入函数I(Input)
 输出函数O(Output)
用于确定系统中隐含的定时问题的一种有效技术是Petri网

Z语言

Z语言是将事物的状态和行为用数学符号形式化表达的语言,为编写计算机程序和验证计算机程序的正确性提供依据,是软件工程中编码之前的规格说明语言。
在Z中有两种语言:数学语言和模式语言。数学语言用来描述系统的各种特征、对象及其之间的关系。模式语言是一种半图形化的语言,它用来构造、组织形式化说明的描述、整理、封装信息块并对其命名以便可以重用这些信息块。

用描述的、最简单的形式化规格说明含有下述4个部分
 给定的集合、数据类型及常数;
 状态定义;
 初始状态;
 操作。

第五章、 总体设计

模块独立程度的两个定性标准度量

 耦合衡量不同模块彼此间互相依赖(连接)的紧密程度。耦合要低,即每个模块和其他模块之间的关系要简单;
 内聚衡量一个模块内部各个元素彼此结合的紧密程度。内聚要高,每个模块完成一个相对独立的特定子功能。

模块

模块是由边界元素限定的相邻程序元素的序列,而且有一个总体标识符代表它。
例如,过程、函数、子程序和宏等都可作为模块。面向对象范型中的对象是模块,对象内的方法也是模块。
模块化:就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
为什么要模块化?
 模块化是为了使一个复杂的大型程序能被人的智力所管理,软件应该具备的惟一属性。
 如果一个大型程序仅由一个模块组成,它将很难被人所理解。
模块化的作用
 采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。
 模块化使软件容易测试和调试,因而有助于提高软件的可靠性。
 模块化能够提高软件的可修改性。
 模块化也有助于软件开发工程的组织管理。

耦合:非直接耦合(完全独立)、数据耦合、控制耦合、特征耦合、外部耦合、公共耦合、内容耦合
尽量使用数据耦合, 少用控制耦合和特征耦合,限制外部耦合和公共耦合的范围, 完全不用内容耦合。
在这里插入图片描述

内聚:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚
在这里插入图片描述

层次图(H图)

层次图用来描绘软件的层次结构。很适于在自顶向下设计软件的过程中使用。
层次图和层次方框图的区别
在这里插入图片描述

第六章、 详细设计

过程设计的工具:程序流程图、N-S图、PAD图、判定树、判定表

在这里插入图片描述

第七章、实现

黑盒测试法(功能测试)

如果已经知道产品应该具有的功能,可以通过测试来检验是否每个功能都能正常使用。
把程序看成一个黑盒子,完全不考虑程序的内部结构和处理过程。

  1. 在程序的接口进行的测试;
  2. 只检查程序功能是否能按规格说明书的规定正常使用;
  3. 程序是否能适当地接收输入数据并产生正确地输出数据;
    4)程序运行过程中能否保持外部信息(数据库或文件)的完整性。
    黑盒测试一般有以下四种方法结合起来使用。
    等价类划分 边界值分析 错误推测 因果图法

白盒测试法(结构测试)

如果知道产品内部工作过程,可以通过测试来检验产品内部动作是否按照规格说明书的规定进行正常进行。
将程序看成,装在一个透明的盒子,完全知道程序的结构和算法
① 按照程序内部的逻辑测试程序,
② 检测程序中的主要执行通路是否按要求正确工作。

大型软件系统的测试基本上由5个步骤进行。

模块测试、子系统测试、系统测试、验收测试、平行运行

1. 模块测试(单元测试)
软件系统中每个模块完成一个相对独立的子功能。因此,可以把每个模块作为一个单独的实体来测试。
测试重点1. 模块接口 主要检查数据能否正确地通过模块。2. 局部数据结构3. 重要执行通路4. 出错处理通路5. 边界条件
2. 子系统测试
子系统测试是把经过单元测试的模块放在一起形成一个子系统来测试。 [“成绩管理”子系统]
3. 系统测试
把经过测试的子系统装配成一个完整的系统来测试。 [教务管理系统]
4. 验收测试(确认测试)
把软件系统作为单一的实体进行测试,测试内容与系统测试基本类似。
5 . 平行运行(试运行)
关系重大的软件产品在验收测试后,往往并不立即投入生产性运行,而是要再经过一段平行运行时间的考验。

集成测试:单元测试的基础上,将所有模块按照设计要求组装成一个完整的系统进行的测试

调试

在测试中发现错误之后,诊断和改正错误的过程。
一般有下列3种调试途径:
 蛮干法
 回溯法
 原因排除法

第八章、维护

所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
可分为4项活动:
 改正性维护
 适应性维护
 完善性维护
 预防性维护

第九章、面向对象方法学引论

对象
1)定义1:对象是具有相同状态的一组操作的集合。
2)定义2:对象是对属性值和操作的封装。
对象的特点
1)以数据为中心;2)对象是主动的; 3)实现了数据封装; 4)本质上具有并行性; 5)模块独立性好。

类(Class)
类就是对具有相同数据和相同操作的一组相似对象的定义。
实例(Instance)
实例就是由某个特定的类所描述的一个具体的对象。
消息(Message)
消息就是用来请求对象执行某个处理或回答某些信息的要求。
消息既可以是数据流,也可以是控制流。
方法(Method)
方法,是对象所能执行的操作。也就是类中所定义的服务。
属性(Attribute)
属性,是类中定义的数据。它是对客观世界实体所具有性质的抽象,类的每个实例都有自己的属性。
封装(encapsulation)
封装就是信息隐藏,通过封装对外界隐藏了对象的实现细节。
继承(Inheritance)
继承,是指能够直接获得已有的性质和特征,而不必重复定义它们。
多态性(Polymorphism)
多态性,指子类对象可以象父类对象那样使用,同样的消息既可以发送给父类对象,也可以发送给子类对象。
重载(Overloading)
有两种重载:
1)函数重载
指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。
2)运算符重载
指同一运算符可以施加于不同类型的操作数上面。当被操作数类型不同时,运算符的含义是不同的。

第十一章、面向对象设计

代码重用(代码复用机制如何实现):

通常把它理解为调用库中的模块。代码重用的几种形式:
 源代码剪贴
 源代码包含
 继承

面向对象设计的准则

1.模块化 2.抽象 3.信息隐藏 4.弱耦合 5.强内聚 6.可重用

启发规则

1.设计结果应该清晰易懂
2.一般-特殊结构的深度应适当
3. 设计简单的类
4. 使用简单的协议
5. 使用简单的服务
6. 把设计变动减至最小

弱耦合

耦合指不同对象之间相互关联的紧密程度。
一般说来,对象之间的耦合可分为两大类:
交互耦合
如果对象之间的耦合通过消息连接来实现,则这种耦合就是交互耦合。
交互耦合应尽可能松散:尽量降低消息连接的复杂程度;尽量减少消息中的参数个数,降低参数的复杂程度;减少对象发送(或接收)的消息数。
继承耦合
与交互耦合相反,应该提高继承耦合程度。
继承是一般化类与特殊类之间耦合的一种形式。通过继承关系结合起来的基类和派生类,构成了系统中粒度更大的模块。彼此之间应该越紧密越好。

强内聚

内聚衡量一个模块内各个元素彼此结合的紧密程度。
内聚定义为:设计中使用的一个构件内的各个元素,对完成一个定义明确的目的所做出的贡献程度。
在设计时应该力求做到高内聚。

在面向对象设计中存在下述3种内聚:
服务内聚:一个服务应该完成一个且仅完成一个功能。
类内聚:一个类应该只有一个用途,它的属性和服务应该是高内聚的。
一般-特殊内聚:设计出的一般-特殊结构,应该符合多数人的概念,应该是对相应的领域知识的正确抽取。

可重用

软件重用是提高软件开发生产率和目标系统质量的重要途径。
重用基本上从设计阶段开始。

重用有两方面的含义:
 一是尽量使用已有的类(包括开发环境提供的类库,及以往开发类似系统时创建的类),
 二是如果确实需要创建新类,则在设计这些新类的协议时,应该考虑将来的可重复使用性。

类构件的重用方式

实例重用
由于类的封装性,使用者无须了解实现细节就可以使用适当的构造函数,按照需要创建类的实例。这是最基本的重用方式。
继承重用
当已有的类构件不能通过实例重用方式满足当前系统的需求时,利用继承机制从已有类派生出符合需要的子类,是安全地修改已有的类构件,获得可在当前系统中使用的类构件的有效手段。
多态重用
利用多态性不仅可以使对象的对外接口更加一般化,从而降低了消息连接的复杂程度,而且还提供了一种简便可靠的软构件组合机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值