Codewars 上隨機(jī)挑到的題目:Number of People in the Bus
【題目描述】

看測(cè)試用例比較好懂:

題目解釋:每一個(gè)
int[]都有兩個(gè)正整數(shù),第一個(gè)代表上車的乘客數(shù),第二個(gè)代表下車的乘客數(shù)。最後的結(jié)果就是車子上還剩多少人。
Step 1: 新增測(cè)試用例,只有一個(gè) station
【測(cè)試代碼】

【生產(chǎn)代碼】

Step 2: hard-code 回傳 p[0][0] - p[0][1]
【生產(chǎn)代碼】

先針對(duì)單一個(gè) item hard-code 處理,等等只需要把 index = 0 的部分替換成 for loop 的 i 即可。
【重構(gòu)測(cè)試代碼】擷取方法,將驗(yàn)證行為封裝到 RemainPassengerShouldBe() 裡。

Step 3: 新增測(cè)試用例,有兩個(gè) station 的情況
【測(cè)試代碼】

【生產(chǎn)代碼】hard-code,當(dāng)還有第二個(gè) station 時(shí),累加 remainPassengerCount。

Step 4: 新增測(cè)試用例,有三個(gè) station 的情況
【測(cè)試代碼】重複了三次類似的處理,逼出生產(chǎn)代碼使用 loop。

【生產(chǎn)代碼】一樣先 hard-code,通過(guò)測(cè)試用例後,再重構(gòu)出 for loop。

【重構(gòu)】擷取方法,將 remainPassgerCount 的計(jì)算抽到 RemainPassengerCountOfCurrentStation() 中,避免同樣的計(jì)算重複三份。

【重構(gòu)】以 for loop 取代 hard-code 的 [0], [1], [2] index。

【通過(guò) Codewars 上所有測(cè)試用例】

【重構(gòu)】使用 LINQ 的 Aggregate() 來(lái)取代這個(gè) for loop 的行為,讓語(yǔ)意更加清楚。

一行搞定這個(gè) Aggregate 的行為!
結(jié)論
寫(xiě) LeetCode 久了,突然看到這樣的題目,一直在想是不是哪邊有陷阱。結(jié)果真的是一題單純到爆炸,單純考會(huì)不會(huì)寫(xiě)程式的考題。
但我還是決定用 TDD 一路驅(qū)動(dòng)跟重構(gòu)出最後版本的代碼,希望可以提供給剛?cè)腴T(mén)的朋友當(dāng)參考。
GitHub commi history: Codewars_NumberOfPeopleInTheBus
大部分的 LINQ 都是在封裝 foreach loop 的巡覽行為,賦予其更簡(jiǎn)單、有彈性、易讀的寫(xiě)法,這種先寫(xiě)出 loop 再重構(gòu)成 LINQ,是學(xué)習(xí) LINQ to object 本質(zhì)很重要的一個(gè)脈絡(luò)。練久了,你就有火眼金睛,看到那些看似複雜的 foreach loop, 可以對(duì)照到是否可以重構(gòu)成 LINQ 的 API 來(lái)表示。