《Test-Driven development By Example》阅读(二)

3 篇文章 0 订阅
第四章 变质的对象(Degenerate Objects)——使用数值对象(value object),不必担心别名问题。
1、clean code that works!
    要达到这一目标,可以分步实施: 先达到“that works”,在达到“clean code”。——这与“体系结构驱动开发”相反
 
第五章 众生平等(Equality for All)——解决判等问题:equals()
1、三角法——或称为“间接法”
    只有当例子达到2个或者更多时才对代码进行一般化。
 
2、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;——拟解决问题
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
 
3、同步工程实践:
重写Dollar类中equals()方法:
public class Dollar {
    public int amount = 0;
    public Dollar(int amount) {
        this.amount = amount;
    }
    public Dollar times(int multiplier) {
        return new Dollar(amount*multiplier);
    }
    
    public boolean equals(Object object){
        Dollar dollar = (Dollar)object;
        return amount == dollar.amount;
    }
}
 
对equals()方法书写测试代码:
public class testDollar extends TestCase {
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        Dollar product = five.times(2);
        assertEquals(10,product.amount);
        product=five.times(3);
        assertEquals(15,product.amount);
    }
    
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }
}
 
测试通过,消除问题(6)。
 
第六章 私有性(privacy)——把公有变成私有
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;——待解决问题
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
 
2、同步工程实践:
对原有测试代码进行调整,引入内联(inline)语句:
(1)去除原来的product对象,同时消除了product对amount的引用;
(2)让对象之间进行比较;
public class testDollar extends TestCase {
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        assertEquals(new Dollar(10),five.times(2));
        assertEquals(new Dollar(15),five.times(3));
    }
    
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }
}
 
经过修改,现在Dollar类是唯一个使用实例变量amount的类,可以把amount 设为private
修改Dollar类代码:
public class Dollar {
    private int amount = 0;
    public Dollar(int amount) {
        this.amount = amount;
    }
    public Dollar times(int multiplier) {
        return new Dollar(amount*multiplier);
    }
    
    public boolean equals(Object object){
        Dollar dollar = (Dollar)object;
        return amount == dollar.amount;
    }
}
若直接修改Dollar类amount为私有,不进行测试代码修改,则会出错:
java中访问私有变量只能使用getter()和setter()!
 
 
第七章 法郎在诉说(Franc-ly Speaking)——处理法郎问题
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;——待解决问题
 
2、同步工程实践:
建立同dollar一样的类以及方法:
public class Franc {
    private int amount = 0;
    public Franc(int amount) {
        this.amount = amount;
    }
    public Franc times(int multiplier) {
        return new Franc(amount*multiplier);
    }
    
    public boolean equals(Object object){
        Franc dollar = (Franc)object;
        return amount == dollar.amount;
    }
}
这样就完成了问题(10),但同时新增加了三个问题!
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;
(13)普通相乘;
 
第八章 再议众生平等(Equality for All:Redux)——解决判等问题
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;——待解决问题
(13)普通相乘;
 
2、同步工程实践:
(1)抽取父类Money,使Dollar和Franc都继承Money;
(2)把子类公共代码抽取到父类;——在父类Money中声明amount为protected,以便子类能够看到。
(3)把equals()方法上移到父类中;
父类Money代码如下:
public class Money {
    protected int amount = 0;
    
    public boolean equals(Object object){
        Money money = (Money)object;
        return amount == money.amount;
    }
}
 
子类Franc代码如下:
public class Franc extends Money{
    public Franc(int amount) {
        this.amount = amount;
    }
    public Franc times(int multiplier) {
        return new Franc(amount*multiplier);
    }
}
 
子类Dollar代码如下:
public class Dollar extends Money{
    public Dollar(int amount) {
        this.amount = amount;
    }
    public Dollar times(int multiplier) {
        return new Dollar(amount*multiplier);
    }
}
 
测试代码不作任何变化:
public class testDollar extends TestCase {
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        assertEquals(new Dollar(10),five.times(2));
        assertEquals(new Dollar(15),five.times(3));
    }
    
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
    }
}
 
第九章 苹果和橘子(Apples and Oranges)——两个对象的判等问题(数值和类均相等时才相等)
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;
(13)普通相乘;
 
2、同步工程实践:
(1)进一步修改测试代码,比较Dollar和Franc两个对象
public class testDollar extends TestCase {
    public void testMultiplication(){
        Dollar five = new Dollar(5);
        assertEquals(new Dollar(10),five.times(2));
        assertEquals(new Dollar(15),five.times(3));
    }
    
    public void testEquality(){
        assertTrue(new Dollar(5).equals(new Dollar(5)));
        assertFalse(new Dollar(5).equals(new Dollar(6)));
        assertTrue(new Franc(5).equals(new Franc(5)));
        assertFalse(new Franc(5).equals(new Franc(6)));
        
        assertFalse(new Franc(5).equals(new Dollar(5)));
    }
}
测试失败!——表明当前的对象比较还存在问题!
新引入问题:
(14)对象之间的判等;
(15)货币表示?
 
(2)继续修改equals()代码,并进行断点调试,结果如下:
public class Money {
    protected int amount = 0;
    
    public boolean equals(Object object){
        Money money = (Money)object;
        return amount == money.amount
            && getClass().equals(money.getClass());
    }
}

分析语句 assertFalse(new Franc(5).equals(new Dollar(5))):
    其中 new Franc(5).equals()中equals()调用继承自父类Money的方法,其中getClass()返回值为Franc实例的类型Franc;而参数中money.getClass()返回的是Dollar实例的类型类Dollar。
 
 
第十章 制造对象(Makin' Objects)——使用工厂方法制造对象
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;
(13)普通相乘;
(14)对象之间的判等;
(15)货币表示?
2、同步工程实践:
(1)主要是对两个子类中极为相似的times()函数进行修改;
 
修改后的Money类:
public abstract class Money {
    protected int amount = 0;
    
    public boolean equals(Object object){
        Money money = (Money)object;
        return amount == money.amount
            && getClass().equals(money.getClass());
    }
    public static Dollar dollar(int amount) {
        return new Dollar(amount);
    }
    
    public static Franc franc(int amount) {
        return new Franc(amount);
    }
    public abstract Money times(int multiplier);
}
 
修改后的Dollar类和Franc类:
public class Dollar extends Money{
    public Dollar(int amount) {
        this.amount = amount;
    }
    public Money times(int multiplier) {
        return new Dollar(amount*multiplier);
    }
}
public class Franc extends Money{
    public Franc(int amount) {
        this.amount = amount;
    }
    public Money times(int multiplier) {
        return new Franc(amount*multiplier);
    }
}
 
修改后的测试代码:
public class testDollar extends TestCase {
    public void testMultiplication(){
        Money five = Money.dollar(5);
        assertEquals(Money.dollar(10),five.times(2));
        assertEquals(Money.dollar(15),five.times(3));
    }
    
    public void testEquality(){
        assertTrue(Money.dollar(5).equals(new Dollar(5)));
        assertFalse(Money.dollar(5).equals(new Dollar(6)));
        assertTrue(Money.franc(5).equals(new Franc(5)));
        assertFalse(Money.franc(5).equals(new Franc(6)));
        
        assertFalse(Money.franc(5).equals(Money.dollar(5)));
    }
}
 
下一步消除times()的重复设计!
 
第十一章 我们所处的时代(Times we are live in)——消除times()重复设计!
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;
(13)普通相乘;
(14)对象之间的判等;
(15)货币表示?
2、同步工程实践:
(1)增加货币属性;
 
public abstract class Money {
    protected int amount = 0;
     protected String currancy;
    
    public Money(int amount, String currancy) {
        this.amount = amount;
        this.currancy = currancy;
    }
    
    public static Dollar dollar(int amount) {
        return new Dollar(amount,"USD");
    }
    
    public static Franc franc(int amount) {
        return new Franc(amount,"CHF");
    }
    public abstract Money times(int multiplier);
    
    public boolean equals(Object object){
        Money money = (Money)object;
        return amount == money.amount
            && getClass().equals(money.getClass());
    }
    public String currancy(){
        return currancy;
    }
}
 
public class Franc extends Money{
    public Franc(int amount, String currancy) {
        super(amount, currancy);
    }
    public Money times(int multiplier) {
        return Money.franc(amount*multiplier);
    }
}
 
public class Dollar extends Money{
    public Dollar(int amount, String currancy) {
        super(amount,currancy);
    }
    public Money times(int multiplier) {
        return Money.dollar(amount*multiplier);
    }
}
 
public class testDollar extends TestCase {
    public void testMultiplication(){
        Money five = Money.dollar(5);
        assertEquals(Money.dollar(10),five.times(2));
        assertEquals(Money.dollar(15),five.times(3));
    }
 
    public void testCurrancy(){
        assertEquals("USD",Money.dollar(1).currancy());
        assertEquals("CHF",Money.franc(1).currancy());
    }
}
 
第十二章 有趣的Times方法(Interesting Times)——消除times()重复设计!
 
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
(11)Dollar与Franc之间的重复设计问题;
(12)普通判等;
(13)普通相乘;
(14)对象之间的判等;
(15)货币表示?
2、同步工程实践:
提取times方法到父类中:
public class Money {
    protected int amount = 0;
    protected String currancy;
    
    public Money(int amount, String currancy) {
        this.amount = amount;
        this.currancy = currancy;
    }
    
    public static Dollar dollar(int amount) {
        return new Dollar(amount,"USD");
    }
    
    public static Franc franc(int amount) {
        return new Franc(amount,"CHF");
    }
    public Money times(int multiplier){
        return new Money(amount*multiplier,currancy);
    }
    
    public boolean equals(Object object){
        Money money = (Money)object;
        return amount == money.amount
            && this.currancy.equals(money.currancy());
    }
    public String currancy(){
        return currancy;
    }
}
public class Franc extends Money{
    public Franc(int amount, String currancy) {
        super(amount, currancy);
    }
}
public class Dollar extends Money{
    public Dollar(int amount, String currancy) {
        super(amount,currancy);
    }
}
 
public class testDollar extends TestCase {
    public void testMultiplication(){
        Money five = Money.dollar(5);
        assertEquals(Money.dollar(10),five.times(2));
        assertEquals(Money.dollar(15),five.times(3));
    }
    
    public void testCurrancy(){
        assertEquals("USD",Money.dollar(1).currancy());
        assertEquals("CHF",Money.franc(1).currancy());
    }
    
}
测试通过!
1.敏捷开发强调测试先行,因为先编写测试代码,就可以有目的的预防某些bug的产生,要知道,治病不如预防!!!所以我个人觉得这个还是比较重要的,文件也不大,只有8M,但是高清。 2.本版本与网上其他资源不同之处在于,此版本可进行编辑,搜索,已进行内容识别扫描。可全选,可编辑,可剪切文字。 部分目录如下: 目录 第一部分资金实例 第1 章多币种资金··························································································································3 第2 章变质的对象························································································································10 第3 章一切均等····························································································································13 第4 章私有性·································································································............................... 16 第5 章法郎在诉说........................................................................................................................ 18 第6 章再谈一切均等.................................................................................................................... 21 第7 章苹果和桔子........................................................................................................................ 25 第8 章制造对象····························································································································27 第9 章我们所处的时代................................................................................................................ 31 第10 章有趣的Times 方法.…....….. …... …..... ….. ….... …... ….. ……….... …... ….. …….... ……... ……...... 36 第11 章万恶之源.......................................................................................................................... 41 第12 章加法,最后的部分..…..….. ….... …... ….... …..... …... ….. ….. …..... ….. …... …....... ……………· ….. 44 第13 章完成预期目标.................................................................................................................. 48 第14 章变化.................................................................................................................................. 53 第15 章混合货币.......................................................................................................................... 57 第16 章抽象,最后的工作.......................................................................................................... 61 第17 章资金实例回顾.................................................................................................................. 65 . 下一步是什么? •••••••••••·••••••••• 暹···········…...... 匿·…... …......... 霉.........…········· 暹....….. 查......................... 65 比喻66 JUnit 的向.法::::::::::::鲁....愈::::::::::::::::::::::::::::::::::::::::::::::::::::董:::::::::::::::::::::::::::::::::::::::::::::::::::::::66 代码统计.......................................... 夔················…................................................................ 麟..... 67 过程............................................................................................................................................ 68 了:回顾::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 第部分xUnit 实例 第18 章步入xUnit ......................................... 簪.........…......... …....... ….... …..................................... 73 第19 章设置表格··················--.. ·········.. ··••• 暹........... 薹··································"······"·····…................... 77 第20 章后期整理................. 畛················............................................................ 爹...参................….... 80 第21 章计数.......................................................................................…................................... ….. 83 第22 章失败处理.......................................…... 窜........….. ….............................. ….. ….... …............... 86 第23 章如何组成一组测试...........雪…………………..………………………………………….. 霞...…………….. 88 第24 章xUnit 回顾.............雪...... 暹........... 匿········ 摹…················--雹............ …............ 霉….........…............. 93 第三部分测试驱动开发的模式 第25 章测试驱动开发模式会....................…........... 吻.....……..... ……....... 诊....………………………......... 97 测试(名词)暹.雪.... 雪......................…......................................... 崎................................................. 97 相互独立的测试(Isolated Test) ……..... …·…….......... …………………………...... …………….... 雀..... 98 测试列表(Test List) ................................................... 豪....................…..... …........................... 99 测试优先(Test First) 断言优先 (Assert First;·:::::::::::::::::::::: ::::::::::::::::::::神: ....:::...:.......厂::::厂厂 100 101 测试数据(Test Data) .显然数据(Evident Dat~·;··:::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::…::::: 102 103 第26 章不可运行状态模式104 一步测试(One Step Test)··:::::::::: :....:..:墓::::::::厂::::::::::: ::..:: 104 启动测试(Starter Test) ................................... 金.......…·······....................... 渗........................... 105 说明测试<Explanation Test) 106 学习测试(Leaming Test) .... : 106 另外的测试 回归测试(;~鲁酝已卢;比~~;噜:::::::::::::: ..:.::.:::::::::::::::::::::::::::: 108 107 ::开 闷:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::缴:惫:::::::::: 便宜的桌子,舒适的椅子…………........……·…………………· ……………..... …………………………... 110 第27 章测试模式................…........ ….......................... 愈............................................................... 111 子测试(Child Test) .......... 筝.............….................................... 噙.............................................. 111 模拟对象(Mock Object) . …...... 摹.......………………·……………………………………………………· …111 :::1言lf(:n~~~~·;···::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::.:.:.. :::....}}: 清扫割试死角(Crash Test Dummy) . ……... ………· ……………... ……….. …………......... …….. ….. 114 昙需它需心为芯芯;沁五::::::::::::::::::::::::::::::::::::睿 ......查::::::::::::::::::::::::::::::::::::::::::: :~! 第2~伪!:~昙,~:动了::.:./.:.:...:::/三:.靡:...::::::::::::::::: !!; 三角法(Triangulation) .... 暹........ 参...................................................................佛....................... 119 显明实现(Obvious Impl ementatlon) ….................... 拳...............................…......................... 119 从一到多(One to Many) ........................................ …....... 匿.............….................................. 120 第29 章xUnit 模式 断言 (Assertion).. ::::.:::::::::::::::::::::::::看 :.:..令::::::::::::::::::::::::::::::::::::::: 122 122 固定设施(Fixture) ............................................................................................................... 123 ;古婴:哼宁:st(贮笠:飞F~~~~~-~...:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ~ 芦 异常测试(Exception Test) . …... ……....... …....... ………... …............... 争............. …·鲁............. 令奄.... 127 全部测试(All Tests) ..................... 耄..令......................................... 伞......................................... 127 第 3~命:巴尸尸式..:. .::.: ..: :::.,:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ;~~ 值对象簪............... 逾............................ 雪... 潭.................................................................................... 131 盓:去:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ~!! 插入式对象 插入式选择霹:::::: ::::::::::::::::::::::令: ........:噜:::::::::::::::::::::::::::::::::::::::::::::::::::::::::135 134 工厂方法.................................... 参·········"···········...........................................噜..............….......... 137 递归:::::::::参::::::::::::::::::::::::::::::::::::::::::参:::::::::::::::::::::::::::::::::::睿...集:::::::::::::::::::::::::::::::: :~; 收集参数 单例模式亭~~-;心如~;--·:::::::::.:.. :.:../...: 140 141 第31 章重构........................................................................................................................…..... 142 调和差异( Reconcile Differences) . …………………….. ……………………........ 萼..........……….. …... 142 隔离变化(Isolate Change) 帚...……………………........ …...... ……………... …………· …….. ………….. 143 :芯:亡::~!:~~==~;··::: 勹....勹勹:::::::/..::/厂:.::::::::::..::::: ;芯之笘:芦::兄芯立立e)鲁·:参:.:.:.:食::::::::: 俺.. :..::::::::::::::::::::::::: :参:..::::::::::::::: .::::..:芯 转移方法(Move Method) ………· ….. ……..... ……….... ………..... ………............. ………………....... 147 方法对象(Method Object) .. …………· ……….. ……………......... ……………….... …………………….. 148 添加参数(Add Parameter) …….. ….. ……………………………..... ……………..... ……………..... ….... 149 把方法中的参数转变为构造函数中的参数••• 重..............................................……....... …........ 149 第32 章掌握TDD ….....…….. ……..... ………….. ……………………...... ……………………………….. …... 夸... 150 附录沁尸尸严:::::::::::::::::::::::::::::::::睿 :.:::::::::: :.::::.:::.:.:::..::.::.:.::::.:..::::..::::::.:::腐 附录B 斐波纳契数列.…………·.........·….. …………....... ·······………….. 睿... 夸................. ….............. 食摩.. 164
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值