TDD实践

关于除法功能的TODO列表
1、 基本功能
2、 除数不能为零
3、 格式化,保留小数点后两位

代码演进过程1:基本功能(列表第一项)

/**测试代码:DivisionTest.java*/
public class DivisionTest extends TestCase {
//测试基本功能
public void testDivision() {
Division division = new Division();
//0除以1等于0
assertEquals(0.00, division.compute(1, 0));
//1除以1等于1
assertEquals(1.00, division.compute(1, 1));
//2除以1等于2
assertEquals(2.00, division.compute(1, 2));
}
}
/**Division.java*/
public class Division implements ICalculator {
//计算除法
public double compute(double divisor, double dividend) {
return dividend / divisor;
}
}

代码演进过程2:添加功能-除数不能为零(列表第二项)

/**测试代码:DivisionTest.java*/
public class DivisionTest extends TestCase {
//测试基本功能
public void testDivision() {
Division division = new Division();
//0除以1等于0
assertEquals(0.00, division.compute(1, 0));
//1除以1等于1
assertEquals(1.00, division.compute(1, 1));
//2除以1等于2
assertEquals(2.00, division.compute(1, 2));
}
//测试除数不能为零
public void testException() {
try {
Division division = new Division();
//错误:3除以0
division.compute(0, 3);
fail("should throw an exception but not");
} catch (IllegalArgumentException expected) {
assertTrue(true);
}
}
}
/**Division.java*/
public class Division implements ICalculator {
//计算除法
public double compute(double divisor, double dividend) {
//检查除数是否为零,若为真则抛出异常
if (divisor == 0)
throw new IllegalArgumentException("divisor cannot be zero");
return dividend / divisor;
}
}

代码演进过程3:添加功能-格式化(列表第三项)

/**测试代码:DivisionTest.java*/
public class DivisionTest extends TestCase {
//测试基本功能
public void testDivision() {
Division division = new Division();
//0除以1等于0
assertEquals(0.00, division.compute(1, 0));
//1除以1等于1
assertEquals(1.00, division.compute(1, 1));
//2除以1等于2
assertEquals(2.00, division.compute(1, 2));
//测试格式化
assertEquals(1.33, division.compute(3, 4));
}
//测试除数不能为零
public void testException() {
try {
Division division = new Division();
//错误:3除以0
division.compute(0, 3);
fail("should throw an exception but not");
} catch (IllegalArgumentException expected) {
assertTrue(true);
}
}
}
/**Division.java*/
public class Division implements ICalculator {
//计算除法
//此时格式化功能耦合在计算功能中
public double compute(double divisor, double dividend) {
DecimalFormat df = new DecimalFormat("#.##");
if (divisor == 0)
throw new IllegalArgumentException("divisor cannot be zero");
return Double.parseDouble(df.format(dividend / divisor));
}
}

代码演进过程4:重构-把格式化代码分离出去
重构依据:降低程序的耦合性

/**Division.java*/
public class Division implements ICalculator {
//计算除法
public double compute(double divisor, double dividend) {
if (divisor == 0)
throw new IllegalArgumentException("divisor cannot be zero");
return format(dividend / divisor);
}
//格式化运算结果:保留两位有效小数点
private double format(double value) {
DecimalFormat df = new DecimalFormat("#.##");
return Double.parseDouble(df.format(value));
}
}



最终代码清单

/**计算器接口:ICalculator.java*/
public interface ICalculator {
double compute(double arg1, double arg2);
}
/**重构后的Division.java*/
public class Division implements ICalculator {
//计算除法
public double compute(double divisor, double dividend) {
if (divisor == 0)
throw new IllegalArgumentException("divisor cannot be zero");
return format(dividend / divisor);
}
//格式化运算结果:保留两位有效小数点
private double format(double value) {
DecimalFormat df = new DecimalFormat("#.##");
return Double.parseDouble(df.format(value));
}
}
/**测试代码:DivisionTest.java*/
public class DivisionTest extends TestCase {
public void testDivision() {
Division division = new Division();
assertEquals(0.00, division.compute(1, 0));
assertEquals(1.33, division.compute(3, 4));
}
public void testExceptions() {
try {
Division division = new Division();
division.compute(0, 3);
fail("should throw an exception but not");
} catch (IllegalArgumentException expected) {
assertTrue(true);
}
}
}



[img][/img][img][/img][img][/img][img][/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值