FizzBuzzWhizz題目需求:
when run (3) return 'Fizz'
when run(5) retunr 'Buzz'
when run(7) retunr 'Whizz'
when run(3×5) retunr 'FizzWhizz' //run 的參數(shù)為3和5共同的倍數(shù)
when run(3×7) retunr 'FizzBuzz' //run 的參數(shù)為3和7共同的倍數(shù)
when run(5×7) return 'BuzzWhizz' //run 的參數(shù)為5和7共同的倍數(shù)
when run(3×5×7) return 'FizzBuzzWhizz' //run 的參數(shù)為3和5和7共同的倍數(shù)
when run(n) return n //n 可以為非3,5,7或3,5,7的倍數(shù)的數(shù)字,如:run(2) return '2'
分析

測試數(shù)據(jù)及預期結(jié)果
| input | |
|---|---|
| 3 | " F i z z " |
| 5 | " B u z z " |
| 7 | " W h i z z " |
| 3 × 5 | " F i z z B u z z " |
| 3 × 7 | " F i z z W h i z z " |
| 5 × 7 | " B u z z W h i z z " |
| 3 × 5 × 7 | " F i z z B u z z W h i z z" |
從題目來看,這道題的邏輯并不復雜,無非是判定是否為3,5,7的倍數(shù),再根據(jù)判定結(jié)果輸出相應的字符串,判定是否為倍數(shù)可通過取模運算來實現(xiàn);同時,根據(jù)題目要求,很明顯可以看出,當輸入數(shù)字為多個因子的公倍數(shù)時,輸出的復雜字符串是由各個簡單字符串根據(jù)不同的優(yōu)先級進行拼接而成,那么可根據(jù)不同的優(yōu)先級來調(diào)整其約數(shù)判定順序,從而實現(xiàn)字符串的優(yōu)先級排列。
我嘗試用TDD的方式來編寫代碼,先寫測試,再寫實現(xiàn),保證在每一次測試時都滿足我的測試需求,再逐步添加需求,寫出的代碼如下:
function run(num){
var result=num.toString();
if(num%3==0){
result="Fizz";
if(num%5==0){
result=result+"Buzz";
}
if(num%7==0){
result=result+"Whizz";
}
}else if(num%5==0){
result="Buzz";
if(num%7==0){
result=result+"Whizz";
}
}else if(num%7==0){
result="Whizz";
}
return result;
}
總測試結(jié)果如下:

由代碼分析可知,不管是輸入8種情況中的任意一種,均需要通過3次判定;
并且,從代碼中可以看見有許多重復代碼,而這些重復代碼執(zhí)行所需要的判定也是一樣的。于是,我嘗試將重復的代碼進行歸并,考慮到當輸入為非3,5,7的倍數(shù)時,輸出與輸入相同的數(shù)字,還要添加一條判定,如下:
function run(num){
var result="";
if(num%3==0){
result+="Fizz";
}
if(num%5==0){
result+="Buzz";
}
if(num%7==0){
result+="Whizz";
}
if(result==="")
return num.toStirng;
return result;
}
測試結(jié)果:
