第十三章 万恶之源(The Root of All Evil)——去除多余子类!
1、存在的问题:
去除子类Dollar和Franc:
packagegarbage;
publicclassMoney{
protectedintamount=0;
protectedStringcurrancy;
publicMoney(intamount,Stringcurrancy){
this.amount=amount;
this.currancy=currancy;
}
publicstaticMoneydollar(intamount){
returnnewMoney(amount,"USD");
}
publicstaticMoneyfranc(intamount){
returnnewMoney(amount,"CHF");
}
publicMoneytimes(intmultiplier){
returnnewMoney(amount*multiplier,currancy);
}
publicbooleanequals(Objectobject){
Moneymoney=(Money)object;
returnamount==money.amount
&&this.currancy.equals(money.currancy());
}
publicStringcurrancy(){
returncurrancy;
}
}
publicclasstestDollarextendsTestCase{
publicvoidtestMultiplication(){
Moneyfive=Money.dollar(5);
assertEquals(Money.dollar(10),five.times(2));
assertEquals(Money.dollar(15),five.times(3));
}
publicvoidtestEquality(){
assertTrue(Money.dollar(5).equals(Money.dollar(5)));
assertFalse(Money.dollar(5).equals(Money.dollar(6)));
assertFalse(Money.franc(5).equals(Money.dollar(5)));
}
publicvoidtestCurrancy(){
assertEquals("USD",Money.dollar(1).currancy());
assertEquals("CHF",Money.franc(1).currancy());
}
第十四章 加法,最后的部分(Addition,finally)——!
1、存在的问题:
(1)为了实现货币相加、汇率转化问题引入了Bank类、Expression接口;代码如下:
publicinterfaceExpression{
}
publicclassBank{
publicMoneyreduce(Expressionsum,Stringstr){
returnMoney.dollar(10);
}
}
publicclassMoneyimplementsExpression{
protectedintamount=0;
protectedStringcurrancy;
publicMoney(intamount,Stringcurrancy){
this.amount=amount;
this.currancy=currancy;
}
publicstaticMoneydollar(intamount){
returnnewMoney(amount,"USD");
}
publicstaticMoneyfranc(intamount){
returnnewMoney(amount,currancy);
}
publicbooleanequals(Objectobject){
Moneymoney=(Money)object;
returnamount==money.amount
&&this.currancy.equals(money.currancy());
}
publicStringcurrancy(){
returncurrancy;
}
publicMoneyplus(Moneyaddend){
returnnewMoney(amount+addend.amount,currancy);
}
}
第十五章 完成预期目标(Make It)——继续完成相加和汇率转换!
1、存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
第十六章 变化(change)
第十七章 混合货币
第十八章 抽象
第十九章 实例回顾
(1)下一步做什么?、
(2)比喻
(3)Junit的用法
(5)过程
(6)测试质量
第二部分 xUnit实例
第三部分 测试驱动开发模式
1、正反馈环:我的经验积累的越多,我所知道有可能要完成的事情就越多。我知道要完成的事情越多,就对自己手头的工作关注的越少,对手头工作关注的越少,完成的工作就越少,完成的越少,我所知道自己要完成的事情就越多。
2、对正反馈环的处理:列清测试清单。
第二十七章 测试模式
1、子测试(child test)
2、模拟对象(mock test)
3、自分流(self shunt)——让测试对象与测试用例而不是期望的进行交互。
4、日志字符串(log string)
5、清扫测试死角(crash test dummy)
6、不完整的测试(broken test)
第二十八章 可运行模式
1、伪成功——先让设计思路和整个流程能够走通,保证你的设计思路和整个流程正确;
2、三角法——现用简单的、错误的逻辑代替复杂的、正确的逻辑,以保证测试运行通过。
3、鲜明实现——用正确的逻辑实现功能。
4、从一到多——实现复杂的逻辑。
第三十章 设计模式
1、命令(command)——把计算作为一个对象而不是消息来调用;
2、值对象(value object)——避免别名问题;
3、空对象(null object)——表示一种对象计算的基本情形;
4、模板方法(template method)——用继承来实现子类中不同的实现;
5、插入式对象()——多个条件判断过滤,会使测试变得十分复杂,不容易进行测试,可以使用指定条件进行测试;
6、插入式选择器()——根据不用对象调动不同方法,。使用反射机制取代switch。
8、单例模式——不要使用全局模式。
第三十一章 重构
1、调和差异(reconcile differences)
(1)两个循环结构类似——合并、去掉一个;
(2)两个判断分支类似——合并、去掉一个;
(3)两个方法类似——合并、去掉一个;
(4)两个类类似——合并、去掉一个;
2、隔离变化(isolate change)——对要修改的地方进行隔离;
3、数据迁移(migrate data)——迁移出旧的数据格式,换成新的数据格式;
5、内联方法(inline method)
6、提取接口(extract interface)
第三十三章 掌握测试驱动开发
1、TDD与XP是相辅相成的!
四、Recite(复述)
五、Review(回顾)