演化架构与紧急设计: 测试驱动设计,第 2 部分
2009-11-05 00:00:00 来源:WEB开发网这段代码报告我的完全数算法工作正常,但是它非常慢。通过查看 calculateFactors() 方法(清单 7),我可以猜出原因。
清单 7. 最初的 getFactors() 方法public void calculateFactors() {
for (int i = 2; i < _number; i++)
if (isFactor(i))
addFactor(i);
}
清单 7 中出现的问题与 第 1 部分 中后测试版本中的问题相同:寻找因子的代码会一直循环到数字本身。可以通过成对地寻找因子来改进此代码,这样就只需要循环到数字的平方根,重构的版本见清单 8:
清单 8. calculateFactors() 方法的性能更好的重构版本public void calculateFactors() {
for (int i = 2; i < sqrt(_number) + 1; i++)
if (isFactor(i))
addFactor(i);
}
public void addFactor(int factor) {
_factors.add(factor);
_factors.add(_number / factor);
}
这与在后测试版本中做过的重构相似(见 第 1 部分),但是这一次要修改两个不同的方法。这里的修改更简单,因为我已经把 addFactors() 功能放在一个单独的方法中了,而且这个版本使用 Set 抽象,这样就不需要通过测试确保没有出现在后测试版本中曾经出现的重复。
优化的指导原则应该总是先确保它正确,然后加快它的运行速度。全面的单元测试集能够轻松地检查行为是否正确,让开发人员能够专心地优化代码,而不必担心是否会破坏代码的正常行为。
最后,完成了完全数查找程序的测试驱动版本;完整的类见清单 9:
更多精彩
赞助商链接