@laofang
2016-03-15T11:27:40.000000Z
字数 4331
阅读 1726
软工
- 开发成本和进度的估计常常很不准确
- 用户对已完成的软件系统很不满意
- 软件质量不可靠
- 软件常常是不可维护的
- 软件成本比例逐年上升
- 软件产品供不应求
- 软件规模加大, 复杂性提高, 性能增强
- 软件是逻辑产品:缺乏可见性,不会"用坏",软件的产品成本主要体现在软件的开发和维护上
- 缺乏系统的开发 维护大型软件项目的技术手段和管理方法
- 用户和软甲开发人员的理解鸿沟
- 消除"软件就是程序"的错误观念
- 软件是程序 数据 及相关文档的完整集合. 文档是开发,使用和维护程序所需要的图文资料
- 成功的软件开发技术和方法
- 软件工具和软件工程的支撑环境
软件工程师指指导计算机开发和维护的一门工程学科, 采用工程学的概念, 原理, 技术和方法来开发和维护软件, 把经过时间考验而证明正确的管理技术和当前能够得到的做好的技术方法结合起来以经济的开发出高质量的软件并有效的维护它
软件工程的中心课题是控制复杂性 和谐地合作是开发软件的关键
三个要素
- 软件工具
- 软件方法
- 软件过程
软件生命周期:
软件生命周期就是软件产品或系统一系列相关活动的全周期
- 软件定义
问题定义
可行性研究
需求分析- 软件开发
总体设计
详细设计
编码和单元测试
综合测试- 软件维护
软件生命周期模型规定了把生命周期划分成哪些阶段及各个阶段的执行顺序, 因此也称为过程模型
瀑布模型
优点: 文档驱动的有序方法 缺点: 交付产品可能不符合客户的要求
快速原型模型
优点: 确保交付的产品符合客户的要求 缺点: 还没有证明无懈可击
增量模型
优点: 增大投资的早期回报 缺点: 要求开放的结构, 可能退化为建造修补模型
螺旋模型
优点: 结合上述所有模型的特性 缺点: 只能用于大型的内部软件产品, 开发者必须精通风险分析和风险排除
1. 准确地回答"系统必须做什么"
2. 分析 软件需求和书写软件需求规格说明书
- 用户解决问题或达到目标所需要的条件或者能力
- 系统或系统部件要满足合同,标准,规范或者其他正式文档所需具有的条件或能力
- 反映上述两个定义中所描述的条件或能力的文档说明
需求层次:
- 业务需求
- 用户需求
- 功能和非功能需求
具体任务:
- 确定对系统的综合需求
- 分析系统的数据需求
- 导出系统的逻辑模型
- 修正系统的开发计划
数据流图:
- 口: 数据原点/数据终点
- →: 数据流
- |二: 数据存储
- O: 加工/处理
- 通过描绘系统的状态及引起的状态转换事件, 来表示系统的行为
1. 概括的说, 系统应该如何实现
2. 系统划分
即确定组成系统的程序, 文件, 数据库, 人工过程和文档等
3. 设计软件的结构:
即确定每个程序是由哪些模块组成,以及这些模块之间的关系
模块化
c(p1 + p2) > c(p1) + c(p2)
E(p1 + p2) > E(p1) + E(p2)
抽象:
抽象就是抽出事务的本质特征而暂时不考虑他们的细节
逐步求精:
为了能集中精力解决主要问题而尽量推迟对问题细节的考虑
信息隐藏和局部化
信息隐藏原理:
应该这样设计和确定模块, 使得一个模块内包含的信息对于不需要这些信息的模块来说, 是不能访问的
局部化:
把一些关系密切的软件元素物理地放得彼此靠近
每一个模块完成一个相对独立的子功能, 并且与其他模块间的接口简单
模块独立性的衡量标准
模块内聚
偶然性内聚
逻辑性内聚
时间性内聚
过程性内聚
通信性内聚
顺序内聚
功能性内聚
信息性内聚
模块耦合
内容耦合
共用耦合
控制耦合
印记耦合
数据耦合
设计师力争做到低耦合. 应该采取的设计原则是: 尽量使用数据耦合, 少用控制耦合和特征耦合, 限制共用耦合的范围, 完全不用内容耦合. 设计时力争做到高内聚, 并且能够辨认出低内聚的模块, 空过修改设计提高模块的内聚程度
启发规则:
改进软件结构, 提高模块第理性
模块规模应适中
深度, 宽度, 扇出 扇入 都应适当
模块作用域应该在控制域之内
作用域:
受该模块内一个判定影响的所有模块的集合
控制域:
模块本身及所有直接或者简介从属于他的模块的计划
力争降低模块接口的复杂程度
设计单入口单出口的模块
模块功能应该可以预测
结构图:
描述软件系统的模块层次结构, 清楚的反映出程序中各模块之间的 调用关系 和 数据传递
面向数据流的设计方法:
两种思想: dfd -> 结构图
两种信息流类型: 变换流, 事务流
变换流到软件结构图的转换
任务:
不是具体的编写程序, 而是设计程序的蓝图
结构程序设计
结构化定理:
任何单入口单出口的程序都可以由 顺序 选择 和 循环 三种基本结构实现
过程设计的工具(重点是画图)
程序流程图
盒图
pad图
判定表
编码风格
编码风格的作用就是使代码容易解读
风格良好的代码更容易月的和理解, 错误更少
使用一致和有意义的标识符名
用缩进显示程序结构
用加括号的方式排除二义性
避免大量使用循环嵌套和条件嵌套
当心运算符的副作用
吧数定义成常量
利用sizeof()计算对象大小
清晰的代码, 而非最巧妙的代码
程序的注释:
序言性注释和功能性注释
对一段程序进行注释而不是每个语句
使用数据结束标记eof, bof 不要指定数据的数目来判断文件的结束
测试的目的即使在软件投入生产性运行之前, 尽可能多地发现软件中的错误 调试的目的是诊断并改正错误, 由程序员完成
- 对软件规格说明,设计和编码的最后复审
- 开发总工作量的40%以上
- 测试是为了发现程序中的错误而执行程序的过程
好的测试方案是极可能发现迄今为止没有发现的错误的测试方案成功的测试是发现了迄今为止尚未发现的 错误的测试- 测试只能查出程序中的错误, 而不能证明程序中没有错误
- pareto原理:
80%的错误是20%的模块造成的- 从小规模测试逐步到大规模测试
- 穷举测试是不可能的
- 为了达到最佳测试效果, 应该有独立的第三方从事测试工作
- 白盒测试 (结构测试 逻辑驱动测试)
- 黑盒测试 (功能测试 数据驱动测试)
模块测试(单元测试)
在这个测试步骤中所发下的往往是编码详细设计的错误
集成测试
子系统测试
模块放在一起形成一子系统来测试
着重测试模块的接口
系统测试
经过测试的子系统装配成一个完整的系统来测试
发现的 往往是软件设计中的错误, 也可能发现需求说明中的错误
验收测试:
它的目标是严重软件的有效性(如果软件的功能和性能如同客户合理期待的那样, 软件就是有效的)
用户积极参与, 可能主要使用实际数据进行测试
发现的往往是软件需求说明书中的错误
回归测试
重新执行已经做过测试的某个子集, 以保证变化没有带来非预期性的副作用
alpha测试
在开发者的指导下, 由用户在开发场所进行
beta测试
多个用户在实际使用环境下进行测试
非渐增式:
先分别测试每个模块,再把所有的模块按设计要求放在一起结合成所要求的程序 .
先进行单元测试, 再进行集成测试
渐增式:
自顶向下
优点
错误隔离
较早发现主要设计错误
缺点
可复用模块得不到充分测试
自底向上
优点:
错误隔离
可复用模块得到充分的测试
错误:
主要设计错误发现迟
三明治式
优点:
错误隔离
较早发现主要设计错误, 可复用模块得到充分测试
缺点:
没有缺点
定义:
以 程序内部逻辑结构为基础的设计用例的技术
类型:
语句覆盖
每个语句至少执行一次
判定覆盖:
每个判定的每条分支至少执行一次
条件覆盖
每个判定表达式中的每个条件都取到各种可能的结果
判定/条件覆盖
每个判定tf都走一遍, 每个判定的条件都取到值
条件组合覆盖:
每个判定表达式中条件的各种组合都至少出现一次
等价划分
1. 把程序的输入划分成若干个数据类, 每类中的一个典型值在测试中的作业与这一类中所有其他值的作用相同, 据此导出测试用例
2. 设计测试用例:设计一个新的测试方案以尽可能覆盖尚未被覆盖的等价类, 重复这一步骤知道所有有效等价类都被覆盖为止
3. 设计一个新的测试方案,使他覆盖一个且只有一个尚未被覆盖的无效等价类, 重复这一步骤直到所有无效等价类都被覆盖为止
- 所谓软件维护就是在软件已经交付使用之后, 为了改正错误或满足新的需要而修改软件的过程, 保证软件在一个相当长的时间能够正常运行
- 时间占比: 60%以上, 这个百分比还在持续上升.
改正性维护
诊断和改正错误的过程(17%-21%)
适应性维护
为了使用环境变化而进行的软件修改活动(18%-25%)
完善性维护
增加新功能或者修改已有的功能(50%- 60%)
预防性维护
维护人员理解改正改动或改进这个软件的难易程度
提高可维护性是支配软件工程方法学所有步骤的关键目标
决定软件可维护性的因素
可理解性
可修改行
可测试性
可移植性
可重用性
四个要点
1. 客观世界是由各种对象组成, 面向对象的软件系统是由对象组成的
2. 对象组成对象类, 类是具有相同的属性和行为的对象的集合, 每个对象定义了一组数据和一组方法
3. 按照子类与父类的关系, 对象类组成一个层次结构的系统, 子类集成父类的数据和方法
4. 对象之间彼此仅能通过传递消息相互联系
面向对象 = 对象 + 类 + 继承 + 消息通信
面向对象的 一些概念:
对象 类 消息 方法 属性 封装 集成 多态 函数重载
三种模型
对象模型
它是对模拟客观世界的对象以及对象彼此间的关系的映射, 描述系统的数据结构
动态模型
描述系统的控制结构
动能模型
描述系统的功能
建模图形工具
类图:
类图描述类以及类之间的静态关系:
关联
聚集
繁花
根据描述画图
状态图:
通过描绘对象的状态引起对象状态转换的事件来表示对象的行为,
根据时间跟踪图画图
用例图
描述的是外部行为者所理解的系统功能,. 系统,行为者, 用例及用例之间的关系
根据描述画图
事件跟踪图
根据描述画图
系统设计:
确定实现系统的策略和目标系统的高层结构
对象设计:
确定解空间中的类, 关联, 接口形式及实现服务的算法
模块化
抽象
信息隐藏
耦合
内聚
重用:
重用有两方面的含义:
1. 尽量使用自己已有的类
2. 如果确实需要创建新的类,则在设计这些类的协议时,应该考虑将来的可重用性
类构件的重用方式
实例重用
按照需要创建类的实例
用几个简单的对象作为类的成员创建出一个更加复杂的类
继承重用
为提高继承重用的效果, 关键是设计一合理的, 具有一定深度的类构件继承层次结构
多态重用
利用多态性不仅可以使对象的对外接口更加一般化, 从而降低了消息的复杂程度, 而且提供了一种简便可靠的软构建组合机制
转换接口:
类构件在重用时必须重新定义的服务的服务的集合
扩充接口:如果派生类中没有给出扩充接口的新算法, 将继承父类的算法
子系统的交互方式
客户-供应商关系
单向交互
平等伙伴关系
双向交互
设计关联:
实现关联的的具体策略
单向遍历
双向遍历
用属性实现两个方向的关联
用独立关联对象实现双向关联