第一章 软件工程学概述
软件危机
是指在计算机软件的开发和维护过程中所遇到的一系列严重问题
危机产生的原因
1 与软件本身特点有关
2 和软件开发和维护的方法不正确有关
软件是程序、数据及相关文档的完整集合
解决软件危机
1 首先应当对计算机软件有一个正确的认识
2 必须充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目
3 推广使用在实践中总结出来的开发软件的成功的技术和方法,并且研究探索更好更有效的技术和方法,尽快消除在计算机系统早期发展阶段形成的一些错误概念和做法。
4 应该开发和使用正确的更好的软件工具
总结 :既要有技术措施,还要有必要的组织管理措施。
软件工程
概括的说,软件工程是指导计算机软件开发和维护的一门工程学科。
软件工程是
① 把系统的、规范的、可度量的途径应用于软件开发、运行、维护过程,也就是把工程应用于软件;
② 研究 ① 中提到的途径
本质特性
1 软件工程关注于大型程序的构造
2 软件工程的中心课题是控制复杂性
3 软件经常变化
4 开发软件的效率非常重要
5 和谐的合作是开发软件的关键
6 软件必须有效地支持它的用户
7 在软件工程领域中经常由具有一种文化背景的人替具有另一种文化背景的人创造产品
基本原理
1 用分阶段的生命周期计划严格管理
2 坚持进行阶段评审
3 实行严格的产品控制
4 采用现代程序设计技术
5 结果应能清楚的审查
6 开发小组的人员应该少而精
7 承认不断改进软件工程实践的必要性
软件工程方法学
软件工程包括技术和管理俩方面的内容
通常把在软件生命周期全过程中使用的一整套技术方法的集合称为方法学
三要素: 方法、工具、过程
最广泛的 : 传统方法学和面向对象的方法学
软件生命周期
由软件定义、软件开发和运行维护(也叫软件维护)三个时期组成
八个阶段
软件定义:
1 问题定义
2 可行性研究
3 需求分析
软件开发:
4 总体设计
5 详细设计
6 编码和单元测试
7 综合测试
软件运行维护:
8 软件维护
软件过程
瀑布模型特点 :
1 阶段间具有顺序性和依赖性
2 推迟实现的观点
3 质量保证的观点
Rational统一过程(RUP)
四个阶段:初始阶段、精化阶段、构建阶段、移交阶段
第二章 可行性研究
目的:就是用最小的代价在尽可能短的时间内确定问题是否能够解决
三个方面研究每种解法的可行性
1 技术可行性
2 经济可行性
3 操作可行性
可行性研究过程
1 复查系统规模和目标
2 研究目前正在使用的系统
3 导出新系统的高层逻辑模型
4 进一步定义问题
5 导出和评价供选择的解法
6 推荐行动方针
7 草拟开发计划
8 书写文档提交审查
数据流图*
四成分: 源点和终点、处理、数据存储和数据流
数据字典
定义数据的方法 : 对数据自顶向下的分解
成本估计
1 代码行技术
2 任务分解技术
3 自动估计成本技术
第三章 需求分析
动机: 为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。
需求分析的任务
1 确定对系统的综合要求
1 功能需求
2 性能需求
3 可靠性和可用性需求
4 出错处理需求
5 接口需求
6 约束
7 逆向需求
8 将来可能提出的要求
2 分析系统的数据要求
3 导出系统的逻辑模型
4 修正系统开发计划
简易的应用规格说明技术
提倡用户与开发者密切合作,共同标识问题,提出解决方案要素,商讨不同方案并指定基本需求。
典型过程
1 首先进行初步的访谈,通过用户对基本问题的回答,初步确定待解决的问题的范围和解决方案。
2 然后开发者和用户分别写出”产品需求“。
3 选定会议的时间和地点,并选举一个负责主持会议的协调人。
4 邀请开发者和用户双方组织的代表出席会议,在开会前预先把写好的产品需求分发给每位与会者。
E-R图
成分: 实体 、 关系、 属性
状态转换图
成分 : 状态 、 事件 、 符号
第五章 总体设计
基本目的: 回答”概括的说,系统应该如何实现“这个问题。
另一项任务: 设计软件的结构,也就是确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。
设计过程
1 系统设计阶段 -> 确定系统的具体实现方案
2 结构设计阶段 -> 确定软件结构
步骤
1 设想供选择的方案
2 选取合理的方案
3 推荐最佳方案
4 功能分解
5 设计软件结构
6 设计数据库
7 制定测试计划
8 书写文档
9 审查和复审
设计原理
1 模块化
2 抽象
3 逐步求精
4 信息隐藏和局部化
5 模块独立(低耦合 高内聚)
面向数据流的设计方法
目标: 给出设计软件结构的一个系统化的途径
1 变换流
2 事务流
数据流图
第六章 详细设计
//根据程序画出程序流程图和盒图
程序流程图
盒图
//PAD图(了解)
判定表格
判定树
过程设计语言(PDL)
//Jackson图
//了解McCabe方法
第七章 实现
实现:把编码和测试统称为实现
测试方法
测试步骤
1 模块测试
2 子系统测试
3 系统测试
4 验收测试
5 平行运行
集成测试
非渐增式测试
一下子把所有模块放在一起,并把庞大的程序作为一个整体来测试。(麻烦,不建议采取)
渐增式测试
把程序划分出小段来构造和测试。
Alpha和Beta测试
alpha测试:内测
beta测试:公测
白盒测试
控制结构测试 //环形复杂度
独立路径
黑盒测试
边界值分析
软件可靠性
定义:软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件可用性
定义:软件可用性是程序在给定时间点,按照规格说明书的规定,成功的运行的概率。
第八章 维护
决定在软件可维护性的因素
1 可理解性
2 可测试性
3 可修改性
4 可移植性
5 可重用性
提高软件可维护性的措施
1 良好的设计
2 完整准确易读易理解的文档资料
3 一系列严格的复审和测试
第九章 面向对象方法学引论
模型
定义:为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。是一种思考工具。可以把知识规范的表示出来。
目的:可以帮助人们思考问题、定义术语、在选择术语时做出适当对的假设,并且有助于保持定义和假设的一致性。
oop(面向对象)方法学的优点
1 与人类习惯的思维方法一致
2 稳定性好
3 可重用性好
4 较易开发大型软件产品
5 可维护性好
类图
*对象模型
对象模型表示静态的、结构化的系统的“数据”性质,它是对模拟客观世界实体的对象以及对象彼此间的关系的映射。描述了系统的静态结构。
目的
为建立动态模型和功能模型提供实质性的框架。
*UML
UML中的六种箭头的含义
1 实线空心三角->继承(泛化)
2 虚线空心三角->实现(类与接口的关系)
实现类指向接口
3 虚线实心三角->依赖(即一个类的实现需要另一个类的协助)
A需要B协助,则A指向B
4 实线实心三角->关联(即一个类知晓另一个类)
A知晓B,则A指向B
5 空心菱形->has A(聚合)
菱形在包含一侧
6 实心菱形->组合(部分和整体)(contains A)
菱形在整体一侧
动态模型
动态模型表示瞬时的、行为化的系统的“控制”性质;它规定了对象模型中的对象的合法变化序列。
功能模型
功能模型表示变化的系统的“功能”性质;它指明了系统应该做什么,因此更直接的反映了用户对目标系统的需求。
第十章 面向对象分析
面向对象建模得到的模型包含系统的三个要素
1 静态结构(对象模型)
极具价值;几乎每一个问题都要抽离出对象模型
2 交互次序(动态模型)
涉及到交互作用和时序时很重要
3 数据交换(功能模型)
解决运算量很大的问题时;涉及到在重要的功能模型
对象模型的五个层次(大型系统)
1 主题层 [找出类或者对象]
2 类与对象层 (UML的类)[识别结构]
3 结构层 (类或者对象之间的关系)[识别主题]
4 属性层 [定义属性]
5 服务层 [定义服务]
建立对象模型*
对象模型的五个层次;上述
建立步骤:
1 确定对象类和关联
2 对于大型复杂问题还需要进一步划分出若干个主题
3 然后给类和关联增添属性
4 利用合适的继承关系进一步合并和组织类
而对类中操作的最后确定;则需要等到建立了动态模型和功能模型之后。因为这俩个子模型更准确的描述了对类中提供的服务的需求。
步骤:
1 确定类和对象
2 确定关联
3 划分主题
4 确定属性
5 识别继承关系
6 反复修改
第十一章 面向对象设计
类的耦合
类构件的特点和重用
特点:
1 模块独立性强
2 具有高度可塑性
3 接口清晰、简明、可靠
重用:
1 实例重用
2 继承重用
3 多态重用
面向对象设计的准则
1 模块化
2 抽象
3 信息隐藏
4 弱耦合
5 强内聚
6 可重用
四大组成部分
1 问题域子系统
2 人机交互子系统
3 任务管理子系统
4 数据管理子系统
结构化程序设计的特点
1 尽可能少用goto语句
2 每个代码块都是单进单出
3 使用控制结构
4 自顶向下逐步求精
第十二章 面向对象实现
俩项工作
1 把面向对象设计结果翻译成用某种程序设计语言书写的面向对象程序
2 测试并调试面向对象的程序
测试类的方法
1 随机测试
功能随机排序测试
2 划分测试
基于状态的划分测试
基于属性的划分测试
基于功能的划分测试
3 基于故障的测试
集成测试方法
多类测试
随机测试方法
划分测试方法
从动态模型导出测试用例