TDD实践(二)

编程技术  /  houtizong 发布于 3年前   65

实践题目:分解质因数

Step1:

单元测试:

package com.bijian.study.factor.test;import java.util.Arrays;import junit.framework.Assert;import org.junit.Before;import org.junit.Test;import com.bijian.study.factor.Factor;public class FactorTest {private Factor factor;@Beforepublic void setUp() {factor = new Factor();}@Testpublic void test_factor() {Assert.assertEquals(Arrays.asList(2), factor.getFactors(2));Assert.assertEquals(Arrays.asList(3), factor.getFactors(3));}}

编写测试通过的代码:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int i) {List<Integer> resList = new ArrayList<Integer>();resList.add(i);return resList;}}

 

Step2:

再编写一个不通过的单元测试案例:

Assert.assertEquals(Arrays.asList(2,2), factor.getFactors(4));

修改代码,让单元测试案例通过:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int i) {List<Integer> resList = new ArrayList<Integer>();if(i % 2 == 0 && i != 2) {resList.add(2);i = i/2;}resList.add(i);return resList;}}

 

Step3:

再编写如下单元测试案例,发现最后一个案例不能通过

Assert.assertEquals(Arrays.asList(5), factor.getFactors(5));Assert.assertEquals(Arrays.asList(2,3), factor.getFactors(6));Assert.assertEquals(Arrays.asList(7), factor.getFactors(7));Assert.assertEquals(Arrays.asList(2,2,2), factor.getFactors(8));

修改代码,如下:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int i) {List<Integer> resList = new ArrayList<Integer>();while(i % 2 == 0 && i != 2) {resList.add(2);i = i/2;}resList.add(i);return resList;}}

 

Step4:

增加如下单元测试案例

Assert.assertEquals(Arrays.asList(3,3), factor.getFactors(9));

修改代码:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int i) {List<Integer> resList = new ArrayList<Integer>();while(i % 2 == 0 && i != 2) {resList.add(2);i = i/2;}while(i % 3 == 0 && i != 3) {resList.add(3);i = i/3;}resList.add(i);return resList;}}

 

Step5:

增加单元测试案例如下,发现最后一个案例执行不通过:

Assert.assertEquals(Arrays.asList(2,5), factor.getFactors(10));Assert.assertEquals(Arrays.asList(11), factor.getFactors(11));Assert.assertEquals(Arrays.asList(2,2,3), factor.getFactors(12));Assert.assertEquals(Arrays.asList(2,11,13), factor.getFactors(2*11*13));

修改代码如下:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int i) {List<Integer> resList = new ArrayList<Integer>();for(int j=2;j<i;j++) {while(i % j == 0 && i != j) {resList.add(j);i = i/j;}}resList.add(i);return resList;}}

 

Step6:

随意增加单元测试案例,如下所示:

Assert.assertEquals(Arrays.asList(3,7,13,23), factor.getFactors(3*7*13*23));

测试通过,但这代码不易理解,我们来重构,重构后代码如下:

package com.bijian.study.factor;import java.util.ArrayList;import java.util.List;public class Factor {public List<Integer> getFactors(int factor) {List<Integer> resList = new ArrayList<Integer>();for(int j=2;j<factor;j++) {while(factor % j == 0 && factor != j) {resList.add(j);factor = factor/j;}}resList.add(factor);return resList;}}

        上面仅用到一个很简单的重构方法,重命名。

        以上这些步骤或练习的过程就是Kata。Kata(路数练习)的思想就是通过反复练习来实践编码,在不断使用各种技能的过程中形成肌肉记忆。Kata从很多方面改善工作流程,比如编写测试、处理错误甚至编辑器的使用,更熟悉语言技巧。

 

附另一种分解质因数的方法:

public List<Integer> getFactors2(int factor) {List<Integer> resList = new ArrayList<Integer>();for(int j=2;j<=factor;j++) {if(factor%j == 0) {resList.add(j);factor = factor/j;j=1;}}return resList;}
上一篇:TDD实践(一)
下一篇:表驱动法实例

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客