Fizz-Buzz-Whizz
ThoughtWorks测试
问题描述:
1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。
2. 让所有学生拍成一队,然后按顺序报数。
3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。
4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。
5. 学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。
说明:以下为模仿Bob大叔的风格进行测试驱动的练习
我先考虑非特殊数字,要输出数字本身,那么我测试1,和2
写这个测试用例的时候,注意到了"特殊数"的概念,而且是三个,那就先建立这个概念吧
让编译器不再抱怨,然后需要可以开始报数了,我需要一个类,暂缺就叫FBW吧,报数呢,那就叫Shout吧
我希望Shout的结果是"1",编译器在抱怨,找不到FBW,那就先解决编译器的抱怨吧,定义下面一个类
编译,运行,通过!很有成就感阿。。。
同样,下面的测试也顺利通过
下面的测试3,按照规则3和规则5都满足,而且都可以终结掉,但是考虑规则5的规则很强硬,只要包含有3,就必须说"Fizz",所以就用下面的用例来测试3
目前编译器会抱怨,需要修改FBW类才能让测试顺利通过,这里我定义Rule5,这个规则用来告诉我两件事:1,返回什么字符串,2,是否可以被这个规则所终结,也就是说这个规则如果能处理完毕,就不需要后续处理,直接返回该字符串就行,所以引入了一个新的类,用来描述规则的处理结果:
同时为FBW添加Rul5方法:
编译,运行,通过,解决了数字3的测试,那么我要测试下面几个
恩,运行通过,说明规则5目前看起来问题不大,碰到问题的时候再说吧。
现在开始处理剩余的规则,简单分析后发现,规则3和规则4其实是一致的规则,规则4包含了规则3,所以合并一起处理吧,这个规则首先解决下面的测试:
也就是说105号应该报"FizzBuzzWhizz",简单看下规则的实现,在FBW类添加如下方法:
编译,运行,通过。。。。。。,感觉真好!
再进行几个测试,心里有底一些
同时别忘记一些边界上的数,测试看看
运行,测试通过,感觉大功告成!
这个代码满足了现在,而我也只关心现在,但是,为了练习技能,我要在后续版本中考虑各种需求变化过程下,如何进行重构!