演化架构与紧急设计: 测试驱动设计,第 1 部分
2009-11-05 00:00:00 来源:WEB开发网在编写单元测试时在方法名称中使用下划线是我的一个编程怪癖。当然,Java 标准中规定方法名称可以是大小写混合的。但是我一直保持测试方法名称不同于 普通方法名称。测试方法名称应当指出正在测试的是什么方法,因此这些名称是很长的描述性名称,在测试失败时,您就知道哪些方法出现了问题。但是,读取较长的大小写混合名称十分困难,尤其是在包含几十个或几百个测试的单元测试运行程序中,因为大多数测试名称都以相似值为开头,并且只在快到末尾时才有所不同。在我做过的所有项目中,我强烈建议使用下划线(仅在测试名称中)以提高可读性。
这段代码正确地报告了完全数,但是由于反向测试的原因,代码运行得非常慢,因为我需要检查大量数字。单元测试会引发性能问题,这使得我重新审视代码以查看是否可以进行一些改进。目前,我把循环集中在数字本身以获得因子。但是我必须这样做吗?如果我可以成对获得因子的话就不需要。所有因子都是成对的(例如,如果目标数字为 28,当我找到因子 2 时,我也可以获得 14)。如果我可以成对获得因子,那么我只需要循环到该数字的平方根。为此,我改进了算法并将代码重构为清单 3:
清单 3. 算法的改进版本public class PerfectNumberFinder2 {
public static boolean isPerfect(int number) {
// get factors
List<Integer> factors = new ArrayList<Integer>();
factors.add(1);
factors.add(number);
for (int i = 2; i <= sqrt(number); i++)
if (number % i == 0) {
factors.add(i);
}
// sum factors
int sum = 0;
for (int n : factors)
sum += n;
// decide if it's perfect
return sum - number == number;
}
}
更多精彩
赞助商链接