软件的定义 软件=程序+数据+文档
软件危机的定义:在计算机软件开发和维护过程中所遇到的一系列严重问题 特点:周期长、成本高、质量差、维护难
软件生存周期:计算机系统工程、需求分析、设计、编码、测试、运行、维护
特征
缺点
需求不明确
或需求经常变化
的软件开发。开发早期存在的问题往往要到交付使用时才发现
,维护代价大可以在获取了一组基本的需求后,通过快速分析构造出该软件的一个初始可运行版本,称之谓**
原型
**
演化模型的开发过程就是从构造初始的原型出发,逐步将其演化成最终软件产品的过程
每个线性序列产生软件的一个可发布的增量版本
,后一个版本是对前一版本的修改和补充
增量模型融合了瀑布模型
的基本成分
和演化模型
的迭代特征
。
增量模型特别适用于:
增量模型能有计划地管理技术风险,如早期增量版本中避免采用尚未成熟的技术。
原型方法从软件工程师与客户的交流开始,其目的是定义软件的总体目标,标识需求。然后快速制订原型开发的计划,确定原型的目标和范围,采用快速设计的方式对其建模,并构建原型。
被开发的原型应交付给客户试用,并
收集客户的反馈意见
,这些反馈意见可在下一轮迭代中对原型进行改进
。在前一个原型需要改进,或者需要扩展其范围的时候,进入下一轮原型的迭代开发。
是瀑布模型和演化模型的结合,并增加了风险分析
四个象限:
制定计划:确定软件目标,选定实施方案,弄清项目开发的限制条件。
风险分析:评价所选的方案,识别风险,消除风险。
工程实施:实施软件开发,验证工作产品。
客户评估:评价开发工作,提出修正建议。
螺旋模型指引的软件项目开发沿着螺线自内向外旋转
,每旋转一圈,表示开发出一个更为完善
的新软件版本。
喷泉模型是一种支持面向对象
开发的模型。
体现迭代
和无间隙
特征。
利用预先包装好的软件构件
(包括组织内部开发的构件和现存商品化构件COTS)来构造应用系统。
形式化方法(formal methods)是建立在严格数学基础上
的一种软件开发方法。软件开发的全过程中,从需求分析、规约、设计、编程、系统集成、测试、文档生成、直至维护各个阶段,凡是采用严格的数学语言,具有精确的数学语义的方法,都称为形式化方法
所谓基于计算机的系统是指:通过处理信息来完成某些预定义目标而组织在一起的元素的集合。
组成基于计算机系统的元素主要有:软件、硬件、人员、数据库、文档和规程
开发一个基于计算机的系统通常都受到资源(人力、财力、设备等)和时间上的限制,可行性分析主要从
经济
、技术
、法律
等方面分析所给出的解决方案是否可行,能否在规定的资源和时间的约束下完成。
研究系统开发过程中可能涉及到的合同、侵权、责任以及各种与法律相抵触的问题
本书将软件需求工程细分为:
需求获取
、需求分析与协商
、系统建模
、需求规约
、需求验证
和需求管理
六个阶段。
建立顺畅的通信途径
访谈与调查
观察用户操作流程
组成联合小组
用况(Use Case)
是软件工程或系统工程中对系统如何反应外界请求的描述,是一种通过用户的使用场景
来获取需求的技术。每个用况提供了一个或多个场景
,该场景说明了系统是如何和最终用户或其它系统互动,也就是谁可以用系统做什么,从而获得一个明确的业务目标。
执行者
(Actor) 。参与者希望系统作的每件事将成为一个用况
1。软件需求分析解决“做什么”的问题,软件设计过程则解决“
怎么做
”的问题
高内聚低耦合
内聚:
耦合:
实体-关系图
状态转换图
数据流图
Data Flow Diagram(简称
DFD
):描述输入数据流
到输出数据流
的变换(即加工)过程,用于对系统的功能建模
,基本元素包括:
存在于软件系统之外的人员或组织,表示软件系统输入数据的来源
和输出数据的去向
,因此也称为源点
和终点
。
例如,对一个考务处理系统而言:
考生向系统提供报名单(输入数据流),所以考生是考试系统(软件)的一个源。
考务处理系统要将考试成绩的统计分析表(输出数据流)传递给考试中心,所以考试中心是该系统的一个宿。
源或宿用相同的图形符号表示:
当数据流从该符号流出时表示是源。
当数据流流向该符号时表示是宿。
当两者皆有时表示既是源又是宿。
加工:描述输入数据流到输出数据流的变换
:
每个加工用一个定义明确的名字标识。
至少有一个输入数据流和一个输出流。
可以有多个输入数据流和多个输出数据流。
文件:保存数据信息的外部单元
。
每个文件用一个定义明确的名字标识。
由加工进行读写。
DFD中称为文件,在具体实现时可以用文件系统实现,也可以用数据库系统实现。
每个数据流用由一组固定成分的数据组成
,并拥有一个定义明确的名字标识。
如:运动会管理系统中,报名单(数据流)由队名、姓名、性别、参赛项目等数据组成。
数据流的流向:
从一个加工流向另一个加工。
从加工流向文件(写文件)。
从文件流向加工(读文件)。
从源流向加工。
从加工流向宿。
描述一个加工的多个数据流之间的关系:
星号(*
):表示数据流之间存在“与
”关系。
所有输入数据流同时存在时,才能进行加工处理。
或者加工处理的结果是同时产生所有输出数据流。
加号(+
):表示数据流之间存在“或
”关系。
至少存在一个输入数据流时,才能进行加工处理。
或者加工处理的结果至少产生一个输出数据流。
异或(⊕
):表示数据流之间存在“异或”(互斥
)关系。
必须存在且仅存在一个输入数据流时,才能进行加工处理。
或者加工处理的结果产生且仅产生一个输出数据流。
根据
自顶向下
逐层分解的思想将数据流图画成层次结构。
每个层次画在独立的数据流图中,加工个数
可大致控制在“7加减2
”的范围中。
顶层图
只有代表整个软件系统的1个加工
,描述了软件系统与外界(源或宿)
之间的数据流。P73图5.5加工经分解
后的图称为0层图
(只有1张)。P75图5.8底层图
,其中所有的加工不再分解成新的子图。顶层图
只有一个代表整个软件系统的加工
,该加工不必编号
。0层图
中的加工编号
分别为1,2,3,…
。子图号
:若父图中的加工号x
分解成某一子图,则该子图号记为“图x”
。父图中的加工号为x
的加工分解成某一子图
,则该子图中的加工编号分别为x.1、x.2、x.3…
。P76图5.9和图5.10示例——资格和水平考试的考务处理系统
功能需求
部分数据流的组成
确定源或宿
:考生、阅卷站和考试中心。
顶层图唯一的加工
:软件系统(考务处理系统)。
确定数据流
:系统的输入/输出信息:
输入数据流2:报名单(来自考生)、成绩清单(来自阅卷站)、合格标准(来自考试中心)。
输出数据流:准考证(送往考生)、考生名单(送往阅卷站)、考生通知书(送往考生)、统计分析表(送往考试中心)。
额外的输出流(考虑系统的健壮性)3:不合格报名单(返回给考生),错误成绩清单(返回给阅卷站)。
顶层图通常没有文件
。
确定加工
:确定父图中某加工分解而成的子加工。
确定数据流
确定文件
以备后用
,则可以将这些数据组成一个新的文件。如:图5.8中“考生名册”。只进行写
。确定源和宿
加工看作一个小系统
,该加工的输入/输出数据流就是这个假设的小系统的输入/输出数据流。采用画0层图的方法
,画出该加工的子图。画系统的输入和输出。
画系统内部。
画加工内部。
重复第3步,直至每个尚未分解的加工都足够简单(即不必再分解)。
源宿
、数据流
、系统
进而画出顶层图
分解成不同的加工
、继承顶层图的数据流
、源与宿不用画出来、文件可以画出,画出0层图数据流图与数据字典是密不可分的,两者结合起来构成软件的逻辑模型(分析模型)。
数据字典由字典条目组成,每个条目描述DFD中的一个元素。
数据字典条目包括:数据流、文件、数据项(组成数据流和文件的数据)、加工、源或宿
。
加工逻辑的详细说明可以用“小说明”来描述。
数据流条目的描述内容
数据流组成
:描述数据流由哪些数据项组成。数据流组成是数据流条目的核心
,它列出组成该数据流的各数据项,例如:注册请求=用户名+密码
注册结果=[注册成功|用户名已被使用|密码长度不足]
登录结果=[登录成功|用户不存在|密码错误]
登录信息=用户名+密码
报名课程 = 用户id号+课程id号
修改个人信息 = 用户id号+个人信息的各个字段
查询课程信息 = 课程名称
查询课程信息结果 = 课程的相关信息
课程增删信息 = 课程名称 + [增加课程信息|删除课程信息|修改课程信息]
增删课程 = 课程名称 + 管理员id号
课程评价 = 课程名称 + 用户名称 + 用户评价信息
加工名:处理登录请求
输入流:登录信息
输出流:登录结果
加工逻辑:根据输入的登录信息,访问用户信息文件,与存储的用户信息进行比对,然后返回登录是否成功。
加工名:处理注册请求
输入流:注册请求
输出流:注册结果
加工逻辑:根据输入的注册信息,访问用户信息文件,与存储的用户信息进行比对,然后返回注册是否成功。
面向对象 = 对象(object) + 分类(classification) + 继承(inheritance) + 通过消息的通信(communication with messages)
面向对象分析的一般步骤如下:
获取客户对系统的需求
(用况建模):包括标识场景(scenario)和用况(use case,也称用例),以及建造需求模型。
执行者
用基本的需求为指南,来选择类和对象
(静态建模)(包括属性和操作)。
定义类的结构和层次
。
建造对象—关系模型
。
建造对象—行为模型
(动态建模)。
利用用况/场景来复审分析模型。
基本概念:
- 每个
视图(View)
是整个系统描述的一个投影,说明了系统的一个特殊侧面。- 若干个不同的视图就可以完整描述所建造的系统。
- 视图是由若干幅
图(Diagram)
组成的一种抽象。- 一幅图包含了系统某个特殊方面的信息,阐明了系统的一个特定部分或方面。
- 一幅图由若干个
模型元素
组成,模型元素表示图中的概念,如:类、对象、用况、节点、接口、包、注释、构件
等。- 用于表示模型元素之间相互连接的关系也是模型元素,如:
关联、泛化、依赖、实现
等。
创建用况模型的步骤包括:
矩形框代表系统
**确定执行者
执行者是指与系统交互的人或其他系统
。确定用况
执行者启动
的(initiated),用况是一个类型
,而不是实例
,用况的实例称为场景
(scenario)定义用况间的关系
1. 识别执行者
2. 识别用况
3. 需求描述:
4. 针对登录用况给出执行规约如下:
用况名 | 登录 |
---|---|
用况描述 | 学生(管理员)输入用户名(邮箱)和密码进行登录 系统返回登录的结果 |
执行者 | 学生或者管理员 |
基本路径 (用户行为左 对齐,系统动作 向右缩进) |
提交登录请求 展示登录界面 填写登录的信息(邮箱,密码等); if 信息不符合填写的基本要求 then 要求用户重新输入; else 等待用户确认登录; end if; 确认登录; 获取用户名、密码; 根据用户名查询数据库; if 无法查到用户名 then 返回用户不存在; else 比较查到的密码与输入是否相符; if 密码相符 then 返回登录成功; else 返回密码错误; end if end if; 接收反馈信息,查看是否登录成功 |
类和对象模型的基本模型元素有
类
、对象
以及它们之间的关系
。系统中的类和对象模型描述了系统的静态结构
,在UML中用类图和对象图来表示。类图由系统中使用的类以及它们之间的关系组成。类之间的关系有
关联、依赖、泛化、实现
等。类图是一种静态模型,它是其他图的基础。一个系统可以有多张类图,一个类也可出现在几张类图中。对象图是类图的一个实例,它描述某一时刻类图中类的特定实例以及这些实例之间的特定链接。对象图使用了与类图相同的符号,
只是在对象名下附加下划线,对象名后可接以冒号和类名
,即:object-name:class-name
删除外部执行者,没有出现在用况图中,没有属性的对象
UML中用
状态机图
、活动图
、顺序图
、通信图和协作图来建立动态模型
状态机图通常是对类描述的补充,它说明该类的
对象所有可能的状态
,以及哪些事件将导致状态的改变
。状态机图描述了对象的动态行为
,是一种对象生存周期的模型。
1)列出对象具有的所有状态。
状态分为起始状态
、结束状态
和中间状态
。一张状态机图可以有一个起始状态和若干个(可以为0)结束状态。
2)标识导致状态转换的事件。
当一个对象接收到某个事件
时,会导致从一个状态转换到另一个状态,称为状态迁移
(transition)。
3)为状态和迁移定义状态变量和动作。
在状态迁移和/或处于某个状态
中时,都可能需要执行一些相应的动
作,综合这些动作,使得对象完成相应的功能。
状态:
一个状态由状态名
、状态变量
和活动
三部分组成。
状态变量
是状态机图所显示的类的属性
,也可以是临时变量
。
活动部分列出了处于该状态时要执行的事件和动作
。
有三个标准事件:entry,exit和do
Entry和exit事件用于指明进入
和退出
该状态时的特定动作
。
do事件用于指明处于该状态中时执行的动作
。
状态迁移:
特殊形式的状态机
,用于对计算流程和工作流建模。活动图的状态表示计算过程中所处的各种状态。动作状态
,用圆角矩形表示
,动作状态之间的迁移用箭头表示
,迁移上可以附加警戒条件、发送子句和动作表达式。泳道
,泳道名放在矩形区的顶端。通常根据责任把活动组织到不同的泳道中
,它能清楚地表明动作在哪里执行(在哪个对象中),或者表明一个组织的哪部分工作(一个动作)被执行。一个动作迁移可以分解成二个或多个导致并行动作的迁移
,若干个来自并行活动的迁移也可以合并成一个迁移
。值得注意的是,在合并之前并行迁移上的活动必须全部完成。在活动图中用黑体线来表示迁移的分解和合并。对象
,对象用对象符号(矩形)
表示,它可作为活动的输入或输出(用虚线箭头连接),也可展示一个对象受一特定动作的影响(用动作和对象之间的虚线表示)。编程风格主要包括:
尽可能少
的测试用例来发现尽可能多
的错误。最有可能
发现软件错误的测试用例,同时避免
使用发现错误效果相同的测试用例。白盒测试
和黑盒测试
,也称白箱测试和黑箱测试。
- 白盒测试(又称为
结构测试
)把测试对象看作一个透明的盒子
,测试人员根据程序内部的逻辑结构及有关信息设计测试用例
,检查程序中所有逻辑路径是否都按预定的要求正确地工作。- 白盒测试主要用于对模块的测试,包括:
- 程序模块中的
所有独立路径
至少执行一次。- 对
所有逻辑判定
的取值(“真”与“假”)都至少测试一次。- 在上下边界及可操作范围内运行
所有循环
。- 测试
内部数据结构
的有效性等。
一种测试策略就是将测试分为单元测试
、集成测试
、确认测试
和系统测试
。
单元测试
是针对程序中的模块或构件,主要揭露编码阶段产生的错误。
集成测试
针对集成的软件系统,主要揭露设计阶段产生的错误。
确认测试
是根据软件需求规约对集成的软件进行确认,主要揭露不符合需求规约的错误。
对于基于计算机系统中的软件,还需将它集成到基于计算机系统中,并进行系统测试
,以揭露不符合系统工程中对软件要求的错误。
描述软件开发各阶段
与测试策略
之间的对应关系
最小单元
(软件构件或模块)进行测试。白盒测试
,并且多个构件或模块可以并行进行测试。单元测试的内容:
集成测试 也称组装测试、联合测试
即每一个针对执行者的功能都是一个用例(用况)如登录 ↩︎
相对于我们开发的系统而言,这里是指“考务处理系统” ↩︎
考虑到了出错的问题 ↩︎