TDD Kata - 保齡球(Bowling)Tasking

閱讀本文后,希望你能夠有如下收獲:

  1. 掌握保齡球的計分規(guī)則,下次打球不再迷茫碳柱。
  2. 通過保齡球的計分系統(tǒng)端到端業(yè)務(wù)功能分析,避免陷入細節(jié)熬芜。
  3. 通過業(yè)務(wù)抽象產(chǎn)出一份需求任務(wù)列表莲镣,從而指導(dǎo)下一步的TDD。

如若與你期望相符涎拉,歡迎你繼續(xù)閱讀瑞侮!


需求背景

請你設(shè)計一個計算保齡球比賽一局總得分的程序的圆,保齡球的計分規(guī)則如下:

  1. 每一局總共有十輪,每輪一開始會有十支球瓶区岗,球手可以扔兩次球略板,目標(biāo)就是用盡量少的球把全部球瓶擊倒。
  2. 如果第一球就把全部的球瓶都擊倒了慈缔,也就是STRIKE叮称,畫面出現(xiàn)“X”,就算完成一輪了藐鹤,所得分數(shù)是10分再加后面兩球的倒瓶數(shù)瓤檐。
  3. 如果第一球沒有全倒,就要再打一球娱节,如果第二球?qū)⑹O碌那蚱咳紦舻鼓域龋簿褪荢PARE,畫面出現(xiàn)“/”肄满,也算完成一格谴古,所得分數(shù)為10分再加下一輪第一球的倒瓶數(shù)。
  4. 如果第二球也沒有把球瓶全部擊倒的話稠歉,那分數(shù)就是第一球加第二球倒的瓶數(shù)掰担,沒有獎勵(bonus),再接著打下一輪怒炸。依此類推带饱。
  5. 第十輪有機會扔三次球。如果在第十輪出現(xiàn)STRIKE或者SPARE阅羹,則球手可再加打第三球勺疼。
  6. 全部十輪的得分相加就等于這一局的總得分。
保齡球記分牌捏鱼,方塊代表STRIKE执庐,三角塊代表SPARE

上述記分牌建議你逐個數(shù)一下,能夠幫助你理解透徹保齡球的積分規(guī)則导梆,打下良好基礎(chǔ)轨淌。

系統(tǒng)分析

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

通讀業(yè)務(wù)描述婚被,分析出系統(tǒng)要解決的核心業(yè)務(wù)問題是為每一局統(tǒng)計總分狡忙,這就是系統(tǒng)將提供面向用戶的端到端功能。最終的需求分解始終應(yīng)該聚焦在這個點上址芯,要避免陷入某一輪的細節(jié)中灾茁。

每一局游戲又分為10輪窜觉,最終的總分是根據(jù)一局比賽中每輪中每次擊倒的瓶數(shù),按照一定的業(yè)務(wù)與規(guī)則計算出來北专。所以禀挫,為了統(tǒng)計每局結(jié)束后的總分,系統(tǒng)還要能夠記錄每次擊倒瓶數(shù)拓颓,從而為統(tǒng)計總得分提供數(shù)據(jù)语婴。

到此,我們識別出系統(tǒng)需要提供的核心功能是統(tǒng)計總分驶睦,還需要支撐的功能是能夠記錄每次擊球數(shù)砰左。

需求拆分

從需求描述中得到信息,每一輪中的倒瓶數(shù)的規(guī)則會對總分產(chǎn)生不同的影響场航,對于某一輪缠导,有如下幾種場景:

  1. 某輪中,兩次扔球都沒有碰到球溉痢,所得分數(shù)為0僻造。
  2. 某輪中,兩次扔球都沒有將球瓶全部擊倒孩饼,所得分數(shù)為兩球的倒瓶數(shù)髓削。
  3. 某輪中,第一球就把全部的球瓶都擊倒捣辆,STRIKE蔬螟,所得分數(shù)是10分再加后面兩球的倒瓶數(shù)。
  4. 某輪中汽畴,第二球?qū)⑹O碌娜壳蚱窊舻咕山恚琒PARE,所得分數(shù)為10分再加下一輪第一球的倒瓶數(shù)忍些。

其實場景1是場景2的極端情況鲁猩,我回想起了第一次玩保齡球的時候,就出現(xiàn)過這種情況罢坝,所以我很快就想到了它廓握。

經(jīng)過上述分析,我們將每輪得分規(guī)則分為3大類嘁酿。此時隙券,你可能會問,這只是1輪的4種場景闹司,如果要統(tǒng)計10輪的總得分娱仔,窮舉出來,是不是應(yīng)該得有3^10 = 59049種業(yè)務(wù)場景(一個極端負責(zé)任的QA或許會想辦法去測試這么多場景游桩,此QA能用程序生成測試數(shù)據(jù)~ ~)牲迫。理論上耐朴,這樣窮舉出來的結(jié)果就是現(xiàn)實中真實存在的全部場景。這樣去拆分業(yè)務(wù)需求盹憎,本身是沒有錯的筛峭,但看到這個數(shù)字,還沒有開始寫測試陪每,估計你內(nèi)心就已經(jīng)崩盤了影晓。

英雄難過Tasking關(guān),TDD的踐行顯然無望了奶稠。為了拯救英雄俯艰,我們需要進一步業(yè)務(wù)抽象。多琢磨琢磨锌订,其實10輪只是1輪的重復(fù)竹握,這里說的重復(fù)是計分規(guī)則重復(fù)。比如說:我第1輪打出STRIKE辆飘,和第5輪打出STRIKE計分規(guī)則沒什么區(qū)別啦辐。

通過進一步業(yè)務(wù)抽象,我們可以通過某一輪打出STRIKE來覆蓋包含了STRIKE的場景蜈项,確保了某一輪STRIKE計分準(zhǔn)確芹关,打出2輪、3輪或10輪STRIKE都是一樣的紧卒。同理侥衬,SPARE和其他的場景也一樣。

結(jié)合我們識別出來的系統(tǒng)核心端到端功能 -- 統(tǒng)計每一局的總分跑芳,我們對進行業(yè)務(wù)拆分轴总,得到如下列表:

  1. 每一輪的兩次扔球都沒有碰到球,所得分數(shù)為0博个。
  2. 每一輪的兩次扔球都沒有全部擊倒球瓶怀樟,所得分數(shù)為每次扔球的倒瓶數(shù)總和。
  3. 存在一輪SPARE盆佣,所得分數(shù)為每次扔球的倒瓶數(shù)總和再加SPARE輪后的一球的倒瓶數(shù)往堡。
  4. 存在一輪STRIKE,所得分數(shù)為每次扔球的倒瓶數(shù)總和再加STRIKE輪后兩球的倒瓶數(shù)共耍。
  5. 十輪均為STRIKE虑灰,所得分數(shù)300。

你可能會問痹兜,明明需求描述上強調(diào)了第10輪的特殊性穆咐,是不是最起碼要區(qū)分一下前9輪和第10輪。你想到了這一點是非常好的佃蚜,如果你想到了庸娱,盡管添加到你的任務(wù)列表,然后你會得到一個更詳細的任務(wù)列表谐算,繼續(xù)前進就好熟尉。

我解釋一下這里沒有區(qū)分的原因。從業(yè)務(wù)描述上洲脂,第10輪加了這一個特殊的區(qū)分斤儿,正好滿足了:“打出STRIKE,獎勵兩球的倒瓶數(shù)恐锦,打出SPARE往果,就獎勵一球的倒瓶數(shù),都沒打出一铅,就是本身的兩球倒瓶數(shù)”陕贮。所以,這個特殊化恰好跟前九輪保持了一致的業(yè)務(wù)規(guī)則潘飘,應(yīng)用在場景3或4中了肮之。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市卜录,隨后出現(xiàn)的幾起案子戈擒,更是在濱河造成了極大的恐慌,老刑警劉巖艰毒,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筐高,死亡現(xiàn)場離奇詭異,居然都是意外死亡丑瞧,警方通過查閱死者的電腦和手機柑土,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗦篱,“玉大人冰单,你說我怎么就攤上這事【拇伲” “怎么了诫欠?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浴栽。 經(jīng)常有香客問我荒叼,道長,這世上最難降的妖魔是什么典鸡? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任被廓,我火速辦了婚禮,結(jié)果婚禮上萝玷,老公的妹妹穿的比我還像新娘嫁乘。我一直安慰自己昆婿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布蜓斧。 她就那樣靜靜地躺著仓蛆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挎春。 梳的紋絲不亂的頭發(fā)上看疙,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音直奋,去河邊找鬼能庆。 笑死,一個胖子當(dāng)著我的面吹牛脚线,可吹牛的內(nèi)容都是我干的搁胆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼邮绿,長吁一口氣:“原來是場噩夢啊……” “哼丰涉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斯碌,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤一死,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傻唾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體投慈,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年冠骄,在試婚紗的時候發(fā)現(xiàn)自己被綠了伪煤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡凛辣,死狀恐怖抱既,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扁誓,我是刑警寧澤防泵,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蝗敢,受9級特大地震影響捷泞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寿谴,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一锁右、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦咏瑟、人聲如沸拂到。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆焊。三九已至,卻和暖如春浦夷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辜王。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工劈狐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呐馆。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓肥缔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親汹来。 傳聞我的和親對象是個殘疾皇子续膳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356