Codewars 上隨機(jī)挑到的題目:Number of People in the Bus
【題目描述】
看測試用例比較好懂:
題目解釋:每一個
int[]
都有兩個正整數(shù)渣窜,第一個代表上車的乘客數(shù),第二個代表下車的乘客數(shù)牛曹。最後的結(jié)果就是車子上還剩多少人。
Step 1: 新增測試用例沟于,只有一個 station
【測試代碼】
【生產(chǎn)代碼】
Step 2: hard-code 回傳 p[0][0] - p[0][1]
【生產(chǎn)代碼】
先針對單一個 item hard-code 處理渴丸,等等只需要把 index = 0 的部分替換成 for loop 的 i 即可。
【重構(gòu)測試代碼】擷取方法庆冕,將驗(yàn)證行為封裝到 RemainPassengerShouldBe()
裡。
Step 3: 新增測試用例劈榨,有兩個 station 的情況
【測試代碼】
【生產(chǎn)代碼】hard-code访递,當(dāng)還有第二個 station 時,累加 remainPassengerCount
同辣。
Step 4: 新增測試用例拷姿,有三個 station 的情況
【測試代碼】重複了三次類似的處理,逼出生產(chǎn)代碼使用 loop旱函。
【生產(chǎn)代碼】一樣先 hard-code响巢,通過測試用例後,再重構(gòu)出 for loop陡舅。
【重構(gòu)】擷取方法抵乓,將 remainPassgerCount
的計(jì)算抽到 RemainPassengerCountOfCurrentStation()
中伴挚,避免同樣的計(jì)算重複三份靶衍。
【重構(gòu)】以 for loop 取代 hard-code 的 [0]
, [1]
, [2]
index。
【通過 Codewars 上所有測試用例】
【重構(gòu)】使用 LINQ 的 Aggregate()
來取代這個 for loop 的行為茎芋,讓語意更加清楚颅眶。
一行搞定這個 Aggregate 的行為!
結(jié)論
寫 LeetCode 久了田弥,突然看到這樣的題目涛酗,一直在想是不是哪邊有陷阱。結(jié)果真的是一題單純到爆炸,單純考會不會寫程式的考題商叹。
但我還是決定用 TDD 一路驅(qū)動跟重構(gòu)出最後版本的代碼燕刻,希望可以提供給剛?cè)腴T的朋友當(dāng)參考。
GitHub commi history: Codewars_NumberOfPeopleInTheBus
大部分的 LINQ 都是在封裝 foreach loop 的巡覽行為剖笙,賦予其更簡單卵洗、有彈性、易讀的寫法弥咪,這種先寫出 loop 再重構(gòu)成 LINQ过蹂,是學(xué)習(xí) LINQ to object 本質(zhì)很重要的一個脈絡(luò)。練久了聚至,你就有火眼金睛酷勺,看到那些看似複雜的 foreach loop, 可以對照到是否可以重構(gòu)成 LINQ 的 API 來表示。