英制单位换算的TDD实战
项目需求
美国人习惯使用很古怪的英制度量单位。英制度量单位的换算经常不是十进制的,比如说:
- 1英尺(foot)= 12英寸(inch)
- 1码(yard)= 3英尺
任务:写一个程序,用于处理英寸、英尺、码之间的换算。
你的程序应该能很好地处理下面这些换算关系:
- 1英尺 应该等于 12英寸
- 1码 应该等于 3英尺
- 1码 应该等于 36英寸
源码:
https://github.com/libertyall/TddPractice
实现需求
1.新建测试类

@Test
void UnitConverter_Foot_Inch() {
UnitConverter converter = new UnitConverter();
Inch result = converter.conver(new Foot(1), new Inch(1));
assertEquals("", "");
}
1. 代码中存在着编译错误。
1.没有UnitConverter类。
2.没有Foot类和构造函数。
3.没有Inch类和构造函数。
2.解决以上编译错误

1.创建UnitConverter类

2.创建Foot类

-
创建Inch类
image.png
4.简单实现UnitConverter类的conver方法
image.png
5.设置测试的断言
image.png
6.运行测试通过
image.png
7.重构UnitConverter类的conver方法,实现英尺与英寸的换算
image.png
8.增加英尺与英寸的换算测试
image.png
9.英尺与英寸的换算通过后,增加码和英寸的换算测试
image.png
10.实现码Yard的类
image.png

11.UnitConverter类的conver方法不支持码这个单位

改写方法的入参为单位Unit

实现单位Unit类

将码Yard的方法和属性移到单位Unit中

重构码Yard让其继承Unit父类。

英尺和英寸类都进行重构,继承自Unit父类


先重新跑一下英尺和英寸的测试,避免代码修改引发问题

接着运行码和英寸的测试,测试无法通过

重构UnitConverter类的conver方法,使其可以支持根据单位类型使用不同的比率进行换算

运行英尺和码的测试,确认测试通过。

重构UnitConverter类,建立一个Map来保存码或英尺与英寸之间的换算比率。

重构UnitConverter类的conver方法,使其根据被换算的单位去获取跟英寸之间的比率

运行英尺和码的测试,确认测试通过。

创建码和英尺的测试,UnitConverter类的conver方法不支持换算成码

修改UnitConverter类的conver方法,将换算为哪个单位这个参数改为Unit父类,不再限定是英寸。

运行测试发现错误

因为只根据了被换算单位这个参数去获取比率,所以现在需要把被换算单位和换算为哪个单位结合起来


第一个测试通过了,第二个测试未能通过,修改掉测试方法中的错误。


测试通过

增加磅和盎司的测试



将测试预期值设为正确的比率应该换算得到的值

增加磅和盎司的换算比率

所有测试都通过

网友评论