快速业务通道

演化架构与紧急设计: 测试驱动设计,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04
把因子加起来。

我需要确定某个数字是不是完全数。

还没有完成的两个任务是把因子加起来和判断完全数。这两个任务很简单;最 后两个测试见清单 5:

清单 5. 完全数的最后两个测试

@Test public void sum()  {    Classifier5 c = new Classifier5(20);    c.calculateFactors();    int expected = 1 + 2 + 4 + 5 + 10 + 20;    assertThat(c.sumOfFactors(), is(expected)); } @Test public void perfection() {    int[] perfectNumbers =      new int[] {6, 28, 496, 8128, 33550336};    for (int number : perfectNumbers)      assertTrue(classifierFor(number).isPerfect()); }

演化架构与紧急设计: 测试驱动设计,第2部分(4)

时间:2011-05-18 IBM Neal Ford

在 Wikipedia 上查找到前几个完全数之后,我可以编写一个测试,它检查实 际上是否可以找到完全数。但是,这还没有完。肯定测试只是工作的一半儿。还 需要编写另一个测试,确保不会意外地把非完全数分类为完全数。因此,我编写 了清单 6 所示的否定测试:

清单 6. 确保完全数分类正确的否定测试

@Test public void  test_a_bunch_of_numbers() {    Set<Integer> expected = new HashSet<Integer> (        Arrays.asList(PERFECT_NUMS));    for (int i = 2; i < 33550340; i++) {      if (expected.contains(i))        assertTrue(classifierFor(i).isPerfect());      else        assertFalse(classifierFor(i).isPerfect());    } }

这段代码报告我的完全数算法工作正常,但是它非常慢。通过查看 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); }

演化架构与紧急设计: 测试驱动设计,第2部分(5)

时间:2011-05-18 IBM Neal Ford

这与在后测试版本中做过的重构相似(见 第 1 部分),但是这一次要修改两 个不同的方法。这里的修改更简单,因为我已经把 addFactors() 功能放在一个 单独的方法中了,而且这个版本使用 Set 抽象,这样就不需要通过测试确保没有 出现在后测试版本中曾经出现的重复。

优化的指导原则应该总是先确保它正确,然后加快它的运行速度。全面的单元 测试集能够轻松地检查行为是否正确,让开发人员能够专心地优化代码,而不必 担心是否会破坏代码的正常行为。

最后,完成了完全数查找程序的测试驱动版本;完整的类见清单 9:

清单 9. 数字分类程序的完整 TDD 版本

public class  Classifier6 {    private Set<Integer> _factors;    private int _number;    public Classifier6(int number) {      if (number < 1)        throw new InvalidNumberException(        "Can''t cla

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号