一.面向对象实现
- 把面向对象设计结果翻译成面向对象程序
- 测试并调试面向对象的程序
二.程序设计语言
所有语言都可完成面向对象实现,但效果不同。
使用非面向对象语言编写面向对象程序,则必须由程序员自己把面向对象概念映射到目标程序中。
1.将来能够占主导地位 —— 产品有生命力
2.可重用性(基本特点和主要优点)
3.类库和开发环境
- 考虑类库中提供有价值类
- 开发环境中提供基本软件工具和类库编辑工具及浏览工具
4.其他因素
培训服务;技术支持;开发工具、开发平台、发行平台;对机器性能和内存需求;集成已有软件容易程度
三.程序设计风格(结构化程序设计依然要遵守)
1.提高可重用性
- 提高方法的内聚: 方法只完成单个功能,涉及多个不相关功能时,需要分解。
- 减小方法的规模:当方法规模过大,需要分解
- 保持方法的一致性:功能相似方法有一致名字、参数特征(包括参数个数、类型和次序)、返回值类型、使用条件及出错条件等
- 把策略与实现分开
策略方法:负责做出决策,提供变元,管理全局资源
实现方法:负责完成具体操作
实现方法相对独立,可在其它系统中重用,将二者分开。
- 全面覆盖:应针对所有组合写方法、对空值、极限值、界外值做出响应
- 尽量不用全局信息:降低方法与外界耦合程度
- 利用继承机制:实现共享和提高重用程度的主要途径
(1)调用子过程:把公共代码分离出来,构成一个公用方法。
(2)分解因子
从不同类相似方法分解出不同的代码, 余下作为公用方法中公共代码。把分解出的因子作为名字相同算法不同的方法,在不同 类中定义。
(3)使用委托(不存在一般特殊的关系时~)
(4)代码封装在类中:把被重用的代码封装在类中
2.提高可扩充性(从用心一定程度也可以提高可扩充性)
- 封装实现策略: 应把类的实现策略(包括数据结构、算法等)封装起来,对外提供公有接口。
- 不要用一个方法遍历多条关联链:一个方法应只包含对象模型中有限内容。否则导致方法过分复杂,不易理解和修改扩充。
- 避免使用多分支语句: 增添新类时会修改原有的代码,合理利用多态性机制(根据类的性质自动选择行为)。
- 精心确定公有方法:公有方法是向公众公布的接口。
3.提高健壮性(鲁棒性)
- 预防用户操作错误: 任何输入(错误),给出提示信息,再次接收用户输入。
- 检查参数合法性(尤其是公有方法)
- 不预先确定限制条件:使用动态内存分配机制,创建未预先设定限制条件数据结构。
- 先测试后优化(性能大于优化)
四.面向对象测试策略
1.单元测试
单元:封装的类和对象
对程序内部具体单一功能模块测试,如程序用C++实现,主要对类成员函数测试。
传统的测试方法都可使用,等价类划分、边值分析、逻辑覆盖法、基本路径法。
2.集成测试
在面向对象的软件中不存在层次的控制结构,传统的自顶向下或自底向上的集成策略就没有意义了。
此外,由于构成类的各个成分彼此间存在直接或间接的交互,一次集成一个操作到类中(传统的渐增式集成方法)通常是不现实的
面向对象软件的集成测试主要有下述两种不同的策略:
- 基于线程的集成测试:把响应系统的一个输入或一个事件所需类集成起来。
- 基于使用的集成测试:先测独立类,测完后测独立类下一层类(依赖类),到测完。
3.确认测试(黑盒法)
测用户可见动作,可识别系统输出。
根据动态模型和描述系统行为的脚本设计确认测试用例。
4.测试用例的设计
与传统软件测试(测试用例的设计由软件的输入、处理、输出视图或单个模块的算法细节驱动)不同,面向对象测试关注于设计适当的操作序列以检查类的状态。
(1)测试类的方法
随机测试
划分测试(类似等价类划分)
- 基于状态的划分:设计测试用例,以分别测试改变状态的操作和不改变状态的操作。
- 基于属性的划分:根据类操作属性—— 使用该属性,修改属性,不操作该属性。
- 基于功能的划分
基于故障测试 :错误推测法,如边界或输入输出为零等。
(2)集成测试方法
多类测试:测类间协作,同样可采用随机测试和划分测试。
- 随机测试
- 划分测试
从动态模型导出测试用例:测试用例涵盖所有状态。