演化架构与紧急设计: 测试驱动设计,第2部分 - 编程入门网
ssify negative numbers");
_number = number;
_factors = new HashSet<Integer>();
_factors.add(1);
_factors.add(_number);
}
private boolean isFactor(int factor) {
return _number % factor == 0;
}
public Set<Integer> getFactors() {
return _factors;
}
private void calculateFactors() {
for (int i = 2; i < sqrt(_number) + 1; i++)
if (isFactor(i))
addFactor(i);
}
private void addFactor(int factor) {
_factors.add(factor);
_factors.add(_number / factor);
}
private int sumOfFactors() {
int sum = 0;
for (int i : _factors)
sum += i;
return sum;
}
public boolean isPerfect() {
calculateFactors();
return sumOfFactors() - _number == _number;
}
}
演化架构与紧急设计: 测试驱动设计,第2部分(6)时间:2011-05-18 IBM Neal Ford可组合的方法 第 1 部分 中提到的测试驱动开发的好处之一是可组合性,也就是采用 Kent Beck 提出的组合方法模式。组合方法可以用许多内聚的方法构建软件。TDD 能够 促进这种做法,因为为了进行测试,必须把软件分解为小的功能块。组合方法生 成可重用的构建块,有助于产生更好的设计。 在 TDD 驱动的解决方案中,方法的数量和名称反映了这种思想。下面是 TDD 完全数分类程序的最终版本中的方法:
下面通过一个示例说明组合方法的好处。假设您已经编写了完全数查找程序的 TDD 版本,而您公司中的另一个开发组编写了完全数查找程序的后测试版本(第 1 部分 中有一个示例)。现在,您的用户慌慌张张地跑来说,“我们还必须判断 盈数和亏数!” 盈数 的因子的总和大于数字本身,而亏数 的因子的总和小于数 字本身。 在后测试版本中,所有逻辑都放在一个方法中,他们必须重写整个解决方案, 把盈数、亏数和完全数都涉及的代码分离出来。但是,对于 TDD 版本,只需要编 写两个新方法,见清单 10: 清单 10. 支持盈数和亏数
这两个方法所需的惟一任务是把 calculateFactors() 方法重构为类的构造函 数。(这对于 isPerfect() 方法没有害处,但是现在它在所有三个方法中重复出 现,因此应该重构)。 把代码编写成小的构建块会提高代码的可重用性,因此这是您应该遵守的主要 设计原则之一。使用测试有助于编写可组合的方法,能够改进设计。 演化架构与紧急设计: 测试驱动设计,第2部分(7)时间:2011-05-18 IBM Neal Ford度量代码质量 在 第 1 部分 开头,我指出代码的 TDD 版本比后测试版本更好。我已经给出 了许多证据,但是能够进行客观的证明吗?当然,对于代码质量,没有纯粹客观 的度量方法,但是有几个指标能够比较客观地反映代码质量;其中之一是圈复杂 度,这是由 Thomas McCabe 发明的度量代码复杂度的方法。公式非常简单:边数 减去节点数,再加 2,这里的边代表执行路径,节点代表代码行数。请考虑清单 11 中的代码: 清单 11. |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |