目录
3.2 极限编程(Extreme Programming,XP)
一、软件工程概述
软件 = 程序 + 数据 + 文档
软件工程:将系统化、规范化、可量化的⼯程原则和⽅法应⽤于软件的开发、运⾏、维护及对其中⽅法的理论研究。其主要目标是⾼效开发⾼质量的软件,降低开发成本。
软件工程知识体系:
软件工程开发方法:
- 传统方法(结构化方法):
- 静态思想,顺序开发,分而治之
- 缺少灵活性,开发难成功,成功难维护
- 面向对象方法
- 动态思想,抽象实体为对象,对象内封装静态属性与动态方法
- 概念、逻辑相协调,逻辑结构稳定
- 主动多次迭代
- 对象可重用
二、软件开发过程
1、软件生命周期模型
4种类型:顺序式、迭代式、增量式、敏捷式
3个时期,6个阶段:软件定义(可行性分析与开发计划、需求分析)、软件开发(软件设计、编码)、运行维护(软件测试、软件维护)
2、传统生命周期模型
2.1 瀑布模型(顺序式)
计划驱动模型,适合规模较大的系统开发或者分布式的开发模式
- 文档驱动(静态开发)、推迟实现(充分认识后才开始编码)、质量保证(各阶段结束前评审)
- 用户只在开发早期和开发结束后接触软件、被动式救火、缺乏灵活性
2.2 快速原型模型
适合于全新系统开发,可以借助原型使⽤户了解到开发的⽅向是否正确的开发模式,适合于⼯期⽐较紧张的项目
- 快速构建软件原型 -> 开发者用户沟通反馈 -> 改进原型
- 可以尝试运用未来系统中需要的新技术
- 技术和工具不一定实际需要、质量较差
2.3 增量模型
每个阶段只交付满足用户需求的可运行产品的子集,第一个增量只实现基本需求的核心产品。
- 必须具备开放式体系结构、容易退化为“边做边改”,失去整体性
2.4 螺旋模型
⼀种将瀑布模型和快速原型模型结合起来,强调风险分析,特别适合大型复杂的系统开发的开发模式
2.5 喷泉模型(面向对象的生命周期模型)
更多迭代与增量,各阶段相互重叠、多次反复,可以嵌入子生存期
3、敏捷生命周期模型
基本特点:增量交付、迭代开发
先实现必要的用户案例,体现出软件的价值,然后在后续版本中对功能进行细化,使得软件产品的所有功能都能达到相同的用户体验水平
用例:通过系统完成的有价值的目标(用例不是功能,“-”减法是一个功能,“2-1”是一个用例)
3.1 优势*
解决了传统模型解决不了的问题(初期需求笼统、无法处理细节,外部环境、互联网时代需求变化快)
3.2 极限编程(Extreme Programming,XP)
主要目的:降低需求变化的成本
3.3 Scrum
更注重软件开发的系统化过程
需求积压(Product Backlog)
冲刺(Sprint)周期
回顾会议(Sprint Retrospective)
3.4 DevOps 过程
开发(Development)和运维(Operations),强调“个体和交互胜过流程和工具”
提倡开发和运维高度协同,追求自动化和可持续交互,促进各部门的沟通、协作、整合
三、需求分析
1、系统涉众
2、用例图与用例规约
2.1 用例图**
名称 | 作用 | 表示方法 |
用例 | 用户的任务 | 椭圆 |
涉众(角色) | 参与任务的人或系统 | 人形符号 |
<<Include>>:包含关系,表示一种依赖。必要的附加用例依赖于主用例,不是简单的逻辑分解。
(如:“更改密码”和“下单”依赖于“登录程序”)
<<Extend>>:扩展关系,在某些情况下想特殊表达的意愿,使用折角矩形声明该特殊情况
(如:“心率分析”扩展出的“报警功能”,当心率低于某阈值时触发)
十、软件测试
1、测试分类
V模型:
测试粒度:
- 白盒测试
- 逻辑覆盖测试法:语句覆盖、分⽀覆盖、条件覆盖、条件组合覆盖
- 控制(路径)结构测试法:基本路径测试、条件测试、数据流测试、循环测试
- 黑盒测试
- 等价类划分
- 边界值分析
- 错误猜测法
- 因果图法:检测输入条件的各种组合可能会引起的错误
2、测试度量
2.1 控制流图与环形复杂度
控制流图:使用带圈数字表示程序流程图
环形复杂度(McCabe)
V(G)= 边数 - 节点数 + 2 = 闭合区域数 + 1
2.2 方法内聚缺乏度(LCOM*)
用于衡量方法内聚性,m为方法数,a为实例变量数,μ(Aj)为访问j变量的方法数
0≤LCOM*≤1
LCOM = 0 :每个实例变量再任意方法中都使用过,高内聚
LCOM = 1 :每个实例变量只2在一个不同的方法中被使用,低内聚