演化架构与紧急设计: 测试驱动设计,第 1 部分
2009-11-05 00:00:00 来源:WEB开发网现在,我将试着实现返回给定参数的因子数组的方法,如清单 11 中所示:
清单 11. getFactors() 方法的第一步public int[] getFactors() {
List<Integer> factors = new ArrayList<Integer>();
factors.add(1);
factors.add(_number);
for (int i = 2; i < _number; i++) {
if (isFactor(i))
factors.add(i);
}
int[] intListOfFactors = new int[factors.size()];
int i = 0;
for (Integer f : factors)
intListOfFactors[i++] = f.intValue();
return intListOfFactors;
}
这段代码允许测试通过,但是再考虑一下,它十分糟糕!在使用测试研究实现代码的方法时有时会出现这种情况。这段代码中哪些部分非常糟糕?首先,它非常长而且复杂,并且它也有 “不止一件事” 的问题。我的本能指引我返回 int[],但是它给底部的代码增加了很多复杂度而没有给我带来任何好处。开始过多地考虑怎样做才能使将来可能调用此方法的方法更方便,将令您遭遇危险的处境。您需要一个非常有说服力的理由才能在此接合点添加复杂的内容,而我还没有那样的理由。查看这段代码,我发现 factors 也应当作为类的内部状态而存在,使我可以分解该方法的功能。
测试显现的有益特性之一是真正内聚的方法。Kent Beck 在十分有影响力的 Smalltalk Best Practice Patterns 一书中提到了这一点。在该书中,Kent 定义了一种名为组合方法(composed method)的模式。组合方法模式将定义三条主要语句:
更多精彩
赞助商链接