测试驱动开发的读书笔记(四)
测试驱动开发常用模式:
1、命令:表示把计算作为一个对象而不是消息来调用(用于编写测试)
例如:
interface Runnable
public abstract void run(); //命令
2、值对象(value object):通过创建其值,一经创建便永远不改变的对象来避免别名问题(用于编写测试)
别名的例子:
假设有一个Rectangle对象,根据rectangle计算出它的面积;后来有人向我要rectangle,我就把它给了他们;
但是几分钟后,这个rectangle对象已经在不知情的情况下改变了,以前我计算出来的面积却过时了。
作者倾向的解决方案是优先考虑是const的对象(不是引用或者指针哦),这样用户要保存该对象的话,是需要自己分配和拷贝。
3、空对象(null object):表示一种对象计算的基本情形(用于重构)
例子:
inspired by java.io.File
public boolean setReadOnly()
{
SecurityManager guard = System.getSecurityManager();
if (guard != null)
guard.canWrite(path);
return fileSystem.setReadOnly(this);
}
修改后:
增加新类LaxSecurity,为了防止有人漏检查了guard,而导致异常
LaxSecurity
public void canWrite(String path){}
SecurityManager
public static SecurityManager getSecurityManager()
{
return security == null? new LaxSecurity() : security;
}
public boolean setReadOnly()
{
SecurityManager security = System.getSecurityManager();
security .canWrite(path);
return fileSystem.setReadOnly(this);
}
4、模板方法(Template method):使用可以通过继承来具体化得抽象方法来表示计算序列中不变的内容(用于重构)
5、插入式对象(pluggable object):通过调用另一个具有两种或两种以上实现的对象来表示变化的内容(用于重构)
我不太喜欢书里的例子,觉得有点重构过头了,增加了新的类,也意味着增加了复杂度
6、插入式选择器(pluggable selector):通过动态调用不同实例的不同方法来避免不必要的子类(用于重构)
7、工厂方法(factory method):通过调用方法而不是构造函数来创建对象(用于重构和编写测试),其实也就是引入了一条间接层
8、冒名顶替(Imposter):通过引入现有协议的另一种实现来引入变化(用于重构和编写测试)
9、递归组合(composite):使用一个对象来表示一组对象的行为的组合(用于重构和编写测试)
10、收集参数:来回传递用来汇集源于不同对象的计算结果的参数(用于重构和编写测试)
另外提到一些重构的技巧,大致思维是:
把类似的变成完全一致的,然后去掉一个;或者反向思维想想最后要变成什么,依据这个来处理
个人观点:
由于我熟悉的部分是C++(java了解一些),但是该书里的很多例子是针对java;个人觉得有部分方法对于c++是有待考量的。
我也有点明白为什么TDD会在java的世界得以流行开来。为了追求同时具有清晰和可测试性的代码,可以不断地重构、提取接口和方法,可以动不动就new和类的值传递,这些都是c++程序员不太容易接受的。这种做法很容易会导致性能的下降,甚至一降就是百分之几。但是Java不在乎这些,语言的特点影响了同一种方法实施的难度!
而且也很容易出现抽象过度的情况!
相关链接:
测试驱动开发的读书笔记(一):http://www.cnblogs.com/xwj-pandababy/articles/2128880.html
测试驱动开发的读书笔记(二):http://www.cnblogs.com/xwj-pandababy/articles/2130958.html
测试驱动开发的读书笔记(三):http://www.cnblogs.com/xwj-pandababy/articles/2133841.html
测试驱动开发的读书笔记(四):http://www.cnblogs.com/xwj-pandababy/articles/2133929.html
测试驱动开发的读书笔记(五):http://www.cnblogs.com/xwj-pandababy/articles/2134644.html