一、如何编写可测试的代码:
1、公共的API就是契约(public api are contracts):为了保证程序向后兼容能力,永远不要修改public方法的签名。
2、减少依赖(reduce dependcy):将初始化新对象的方法和提供业务逻辑的方法隔离开。例子:
class Vehicle {
Driver d = new Driver();
boolean hasDriver = true;
private void setHasDriver(boolean hasDriver) {
this.hasDriver = hasDriver;
}
}
重构为:
class Vehicle {
Driver d;
boolean hasDriver = true;
Vehicle(Driver d) {
this.d = d;
}
private void setHasDriver(boolean hasDriver) {
this.hasDriver = hasDriver;
}
}
3、创建简单的构造函数(create simple constructor)
4、遵循最少知识的原则(follow the principle of least knowledge):一个类应该仅仅知道他需要知道的事情
例子:
class Car {
private Driver driver;
Car(Context context) {
this.driver = context.getDriver();
}
}类Car仅仅需要Driver类,但是却通过Context类获得这个类。所以重构为:
Car(Driver driver) {
this.driver = driver;
}
5、避免隐藏的依赖和全局变量
6、谨慎使用单例模式(singleton)
7、选用普通的方法(Favor generic method):谨慎使用static方法,因为static方法无法使用多态
8、选用组合而不是集成
9、需用多态而不是条件判断
二、测试驱动开发(TDD)
1、调整开发周期:从传统的code,test(repeat),commit调整为test,code(repeat),commit。
Test代码作为API的第一个客户,通过Test代码验证功能设计,优化程序架构。代码实现以后测试也通过,可以保证代码按照约定完成了实现。
2、TDD两部曲:
在写新代码前先写失败的自动测试代码
消除复制
浙公网安备 33010602011771号