###如下部分为记录note
保龄球的计分规则:
1:每一局总共有十轮,每轮一开始会有十支球瓶,球手可以扔两次球,目标就是用尽量少的球把全部球瓶击倒。
2:如果第一球就把全部的球瓶都击倒了,也就是STRIKE,画面出现“X”,就算完成一轮了,所得分数是10分再加后面两球的倒瓶数,
3:如果第一球没有全倒,就要再打一球,如果第二球将剩下的球瓶全都击倒,也就是SPARE,画面出现“/”,也算完成一格,所得分数为10分再加下一格第一球的倒瓶数,
4:如果第二球也没有把球瓶全部击倒的话,那分数就是第一球加第二球倒的瓶数,没有奖励(bonus),再接着打下一格。依此类推。
5:第十轮有机会扔三次球。如果在第十轮出现STRIKE或者SPARE,则球手可再加打第三球。
6:全部十轮的得分相加就等于这一局的总得分。
TDD实例执行步骤(红-绿-重构)/循环.
选取较为经典的保龄球规则作为case.
1:需求初步分解
1.1 创建一个游戏规则类Game
1.2 类中包含两个方法:
roll(int count)扔球后执行此方法,count是每局击倒的球瓶数
score()计算每局比赛的得分情况.
2:开始测试用例编写
2.1:创建一个test方法实例,testGutterGame
创建Game对象,测试代码爆红,提示无此类
新建Game对象,测试通过
2.2:通过Game对象实例game,调用方法roll(int count)和score(),代码爆红,提示无此方法
在Game类中,创建roll(int count)和score()方法,测试通过
2.3:此时出现第一次代码重构
每次调用test实例方法,都需要创建Game的实例对象,重构此方法.
2.4:第二次重构
重构roll(int count)和score()方法
2.5:第三次重构-N次roll点相同的重构
重构roll点roll(int count)方法重构为rollMany(int n,int count);
count-每局击倒的球瓶数,n-多少次击倒相同的球
2.6:第四次重构-一次STRIKE,一次SPARE情况.
重构roll点roll(int count)方法
***此处省略中间渐进重构过程**
***参考2>,试访问,需要验证信息**
.........
.........
.........
2.n:第n次重构-满足roll点任意数字,计算总分的重构.
3:重构定义
此TDD实例中,凡是代码涉及相同功能抽取代码的,算作重构,不限定在测试Test类中,还是主体开发类中.
TDD实例分享顺序
1:已开展的工作
拆分保龄球需求.
按照TDD原则,完成测试用例、功能代码的编写.
2:遇到的障碍
首次计算STRIKE以及SPARE场景得分,未充分考虑数组越界情况.
末尾一轮出现STRIKE以及SPARE场景得分,计算得分出错.
基于重构技术较多,单次分享耗时较多,省略中间循序渐进重构过程,在4-5次重构后,给出最终重构测试用例代码以及功能代码.
3:后续的计划
小组分享此次TDD保龄球案例后,完善重构实例.
基于此次分享,结合项目实际情况,把TDD原则推进到项目实际需求.
下次分享
重构的要点,实例的要点
下次以真实项目需求为案例
后端添加校验规则,放在实体类里面去校验,长度,格式等,具体可参考CommunityEvent.class
参考资料
1> http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata(保龄球-Kata-完整实例)
2> https://www.jianshu.com/p/9599083f33bc(保龄球-Kata-实例demo/部分实例)
3> https://blog.51cto.com/10760006/2157302(java版本-保龄球实现规则)