软件构造知识点理解与总结:
目录
- 软件构造:开发高质量的软件系统
- 软件构造的多维度视图和质量目标
- 软件测试与测试优先的编程
- 软件构造过程与配置管理
- 数据类型与类型检验
- 设计规约
- 抽象数据类型(ADT)
- 面向对象的编程(OOP)
- ADT和OOP中的“等价性”
- 面向复用的软件构造技术
- 面向可维护性的构造技术
- 面向可复用性和可维护性的设计模式
- 面向正确性与健壮性的软件构造
0.软件构造:开发高质量的软件系统
设计目标:编程的“视野”
设计原则:编程的“标尺”
设计模式:编程的“经验”
1.软件构造的多维度视图和质量目标
1.软件构造的多维度视图
按阶段划分:构造时/运行时视图
按动态性划分:时刻/阶段(形态)视图
按构造对象的层次划分:代码(逻辑)/构件(物理)视图
2.阶段划分、各阶段活动
3.软件质量指标
(1)外部指标(影响用户)
①正确性
按照预先定义的“规约”执行,至高无上的质量指标。
需要在软件系统的每一层保证自己的正确性,同时假设其下层是正确的。
通过测试和调试、防御式编程、形式化方法等手段保证正确性
②健壮性
针对异常情况(取决于spec的范畴)的处理,出现异常时不要“崩溃”。
出现规约定义之外的情形的时候,软件要做出恰当的反应,是对正确性的补充。
未被specification覆盖的情况即为“异常情况”
③可扩展性
对软件的规约进行修改,是否足够容易?
两种原则:简约主义设计,分离主义设计
④可复用性
发现共性,一次开发,多 次使用
不要不断重复自己写过的东西,不要重复造轮子
⑤兼容性
不同的软件系统之间相互可容易的集成
需要保证设计的同构性:
-标准统一的文件格式
-标准统一的数据结构
-标准统一的用户接口
-标准统一的访问协议
⑥性能
性能是软件系统对硬件资源尽可能少地提出要求的能力,例如处理器时间、内部和外部存储器占用的空间、通信设备中使用的带宽。
性能毫无意义,除非有足够的正确性
对性能的关注要与其他质量属性进行折中
过度的优化导致软件不再适应变化和复用
⑦可移植性
软件可方便的在不同的技术环境(硬件、操作系统)之间移植’
⑧易用性
容易学、安装、操作、监控
给用户提供详细的指南
结构简单,了解用户。
⑨功能性
功能性是系统提供的可能性的程度。
程序设计中一种不适宜的趋 势,即软件开发者增加越来越多的功能,企图跟上竞争,其结果是程 序极为复杂、不灵活、占用过多的磁盘空间
每增加一小点功能,都确保其他质量属性 不受到损失
⑩及时性
软件系统在用户需要时或之前发布的能力。
(2)内部指标(影响软件本身和它的开发者,外部质量取决于内部质量)
源代码相关因素,如代码行数(loc)、循环复杂性等
体系结构相关因素,如耦合、内聚等
可读性
可理解性
清晰度
大小
(3)指标折中
正确的软件开发过程中,开发者应该将不同质量因素之间如何做出折中的设计决策和标准明确的写下来
虽然需要折中,但“正确性”绝不能与其他质量因素折中。
最重要的几个质量因素:正确性、健壮性(可靠),复用性、可扩展性(模块化)
2.软件测试与测试优先的编程
§ 认可“测试”的价值,搞清楚“测试优先”的哲理
§ 学会用等价划分和边界值分析方法为模块设计测试用例
§ 可用工具度量一组测试用例对代码的“覆盖度”
§ 各种各样的测试,都有些初步了解
大纲:
(1)软件测试
(2)测试用例
(3)测试优先的编程/测试驱动开发(TDD)
(4)单元测试
(5)使用JUnit进行自动化单元测试
(6)黑盒测试
——等价类划分
——边界值分析
(7)白盒测试
(8)覆盖度
(9)集成测试
(10)回归测试
(11)在程序中文档化测试策略
黑盒测试用例的设计
– 等价类划分、边界值分析
以注释的形式撰写测试策略
JUnit测试用例写法
测试覆盖度
什么是测试?
(1)软件测试是提高软件质量的重要手段
发现bugs, 确认是否达到可用级别(用户需求)
关注系统的某一侧面的质量特性
(2)即使是最好的测试,也无法达到100%的无错误
(3)每 kloc(1000 行代码)的一些典型残留缺陷率(软件发布后遗留的错误):
——1-10 个缺陷/kloc:典型的行业软件。
——0.1-1 缺陷/kloc:高质量验证。 Java 库可能达到这种正确性水平。
——0.01-0.1 缺陷/kloc:最好的安全关键验证。NASA 和 Praxis 这样的公司可以达到这个水平。
(4)这对于大型系统来说可能令人沮丧。 例如,如果你已经发布了 100 万行典型的行业源代码(1缺陷/kloc),这意味着您错过了 1000 个错误!
(5)测试跟其他活动的目标相反:破坏、证错、“负能量”
(6)再好的测试也无法证明系统里不存在错误
(7)什么是好的测试:
——能发现错误
——不冗余
——最佳特性,多种测试方案中最好的
——别太复杂也别太简单
测试:发现是否存在错误
调试:识别错误根源,消除错误
==白盒测试:==对程序内部代码结构的测试
==黑盒测试:==对程序外部表现出来的行为的测试
什么是测试用例:
test case = {test inputs + execution conditions+ expected results}
测试用例:输入+执行条件+期望结果
好的测试用例的特点:
(1)最可能发现错误
(2)不重复、不冗余
(3)最有效
(4)既不简单也不复杂
测试优先的编程:
定义:在编写代码之前先编写测试。
为什么要进行测试优先的编程:
(1)尽早并经常进行测试,使程序快速出错。
(2)不要把测试留到最后,当有一堆未验证的代码,将测试留到最后只会使调试时间更长,因为错误可能在代码的任何地方。
(3)“测试代码”比写代码更有成就感
过程:
(1)先写spec
(2)再写符合spec的测试用例
(3)写代码、执行测试、有问题再改、再执行测试用例,直到通过
Unit Testing 单元测试:
定义:针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试
黑盒测试:
定义:用于检查代码的功能,不关心内部实现细节
等价类划分
边界值
白盒测试
代码覆盖