美文网首页TDD
TDD Kata - 保龄球(Bowling)Tasking

TDD Kata - 保龄球(Bowling)Tasking

作者: 袁慎建 | 来源:发表于2020-06-02 17:35 被阅读0次

需求背景

请你设计一个计算保龄球比赛一局总得分的程序,保龄球的计分规则如下:

  1. 每一局总共有十轮,每轮一开始会有十支球瓶,球手可以扔两次球,目标就是用尽量少的球把全部球瓶击倒。
  2. 如果第一球就把全部的球瓶都击倒了,也就是STRIKE,画面出现“X”,就算完成一轮了,所得分数是10分再加后面两球的倒瓶数。
  3. 如果第一球没有全倒,就要再打一球,如果第二球将剩下的球瓶全都击倒,也就是SPARE,画面出现“/”,也算完成一格,所得分数为10分再加下一轮第一球的倒瓶数。
  4. 如果第二球也没有把球瓶全部击倒的话,那分数就是第一球加第二球倒的瓶数,没有奖励(bonus),再接着打下一轮。依此类推。
  5. 第十轮有机会扔三次球。如果在第十轮出现STRIKE或者SPARE,则球手可再加打第三球。
  6. 全部十轮的得分相加就等于这一局的总得分。
保龄球记分牌,方块代表STRIKE,三角块代表SPARE

需求分析

拿到需求后,第一个件重要的事情永远都是理解需求,第二件重要的事情是拆分需求。

通读业务描述,分析出系统要解决的核心业务问题是为每一局统计总分,这就是系统将提供面向用户的端到端功能。最终的需求分解始终应该聚焦在这个点上,要避免陷入某一轮的细节中。

每一局游戏又分为10轮,最终的总分是根据一局比赛中每轮中每次击倒的瓶数,按照一定的业务与规则计算出来。所以,为了统计每局结束后的总分,系统还要能够记录每次击倒瓶数,从而为统计总得分提供数据。

到此,我们识别出系统需要提供的核心功能是统计总分,还需要有一个功能是能够记录每次击球数。

从需求描述中得到信息,每一轮中的倒瓶数的规则会对总分产生不同的影响,对于某一轮,有如下几种场景:

  1. 某轮中,两次扔球都没有碰到球,所得分数为0。
  2. 某轮中,两次扔球都没有将球瓶全部击倒,所得分数为两球的倒瓶数。
  3. 某轮中,第一球就把全部的球瓶都击倒,STRIKE,所得分数是10分再加后面两球的倒瓶数。
  4. 某轮中,第二球将剩下的全部球品击倒,SPARE,所得分数为10分再加下一轮第一球的倒瓶数。

其实场景1是场景2的极端情况,我回想起了当年第一次玩保龄球的时候,就出现过这种情况,所以我很快就想到了它。

经过上述分析,每一轮得分将被分成四类。此时,你可能会问,这只是1轮的4种场景,如果统计10轮的总得分,如果穷举出来,是不是应该得有4^10 = 1,048,576种业务场景(一个极端负责人的QA或许会想办法去测试这么多场景,此QA能用程序生成测试数据~ ~)。理论上,这样穷举出来的结果就是现实中真实存在的全部场景。这样去拆分业务需求,本身是没有错的,但看到这个数字,还没有开始写测试,估计你内心就已经崩盘了。

英雄难过Tasking关,TDD的践行显然无望了。为了拯救英雄,我们需要进一步业务抽象。多琢磨琢磨,其实10轮只是1轮的重复,如果我们确保了每1轮的统计是正确的就好,然后将每1轮循环运用到这10轮中,是否能确保最终的计分功能是可靠的?

答案是:肯定的 (软件将通过合理的抽象建模来解决现实中复杂的业务问题)

通过进一步业务抽象,结合我们识别出来的系统核心端到端功能,我们对进行业务拆分如下的几种场景:

  1. 每一轮的两次扔球都没有碰到球,所得分数为0。
  2. 每一轮的两次扔球都没有全部击倒球瓶,所得分数为每次扔球的倒瓶数总和。
  3. 存在一轮SPARE,所得分数为每次扔球的倒瓶数总和再加SPARE轮后的一球的倒瓶数。
  4. 存在一轮STRIKE,所得分数为每次扔球的倒瓶数总和再加STRIKE轮后两球的倒瓶数。
  5. 十轮均为STRIKE,所得分数300。

相关文章

  • TDD Kata - 保龄球(Bowling)Tasking

    需求背景 请你设计一个计算保龄球比赛一局总得分的程序,保龄球的计分规则如下: 每一局总共有十轮,每轮一开始会有十支...

  • TDD Kata - 保龄球(Bowling)Coding

    阅读本文后,希望你能够有如下收获: 能够采用TDD的方式实现保龄球业务需求。 掌握TDD的节奏:红(失败测试)、绿...

  • TDD入门首选,Bowling Kata

    Bowling Game是一道经典的编程Kata,而且是Bob大叔推荐的Kata,那么它究竟有什么样的魅力呢?这次...

  • Coding Dojo - Bowling Game

    Kata: Bowling Game Create a program, which, given a valid...

  • 2019-11-16

    bowling 收藏 /ˈbolɪŋ/ n. 保龄球 v. 打保龄球 I'm not going to go bo...

  • TDD核心:Tasking

    外行看高尔夫的挥杆,就是一个动作。然而老虎伍兹这样的高手,会把它分解成多个动作,逐一刻意练习: 1. 开球准备。要...

  • BOT(Business-Oriented Tasking)要拆

    我经常在TDD训练营中被问到Tasking的粒度如何把控? 首先,如果是面向问题域的Tasking,即对业务需求的...

  • 音译词

    Aspirin——阿司匹林(一种药物) Bowling——保龄球 Brandy——白兰地酒 Calorie——卡路...

  • TDD与瀑布式开发

    背景 最近项目中有同事做了一次 TDD(测试驱动开发) 的知识分享,编码实践中采用了保龄球的例子,可以参考保龄球积...

  • TDD Bowling Game 练习和重构

    题目 Write a program to score a game of Ten-Pin Bowling. In...

网友评论

    本文标题:TDD Kata - 保龄球(Bowling)Tasking

    本文链接:https://www.haomeiwen.com/subject/rtjlzhtx.html