欧美日韩国产一区二区|qovd片|小明个人发布看看|小浪货你夹真紧水又多|老头把我添高潮了A片故|99热久久精品国产一区二区|久久久春色AV

fizzbuzz牛津英語樹 fizzbuzz( 五 )


迭代2前面的做完,新的需求來了:
你是一名體育老師,在某次距離下課還有五分鐘時,你決定搞一個游戲 。此時有200名學生在上課 。游戲的規則是:
讓所有學生拍成一隊,然后按順序報數 。學生報數時,如果所報數字是3的倍數,那么不能說該數字,而要說Fizz;如果所報數字是5的倍數,那么要說Buzz;如果所報數字是第7的倍數,那么要說Whizz 。學生報數時,如果所報數字同時是兩個特殊數的倍數情況下,也要特殊處理,比如3和5的倍數,那么不能說該數字,而是牛津要說FizzBuzz,以此類推 。如果同時是三個特殊數的倍數,那么要說FizzBuzzWhizz 。迭代2的需求改動不多,這個需求對我們的業務域造成的變化是加入了一個新的特殊數字7 。如果我們還是按照迭代1的方式去實現,我們寫出來的代碼可能很可能游戲如下所示:

fizzbuzz牛津英語樹 fizzbuzz

文章插圖
代碼有什么問題嗎?它最大的問題叫做圈復雜度太高 。
圈復雜度圈復雜度的計算中文方式是這樣的,每當你看到一個for或者if或者while,總之,每看到一個判斷分支或者是一個循環分支,圈復雜度就加1 。每當看到continue和break也加1,return也加1 。加完了就是這一部分代碼的圈復雜度了 。
圈復雜度高了會怎么樣呢?圈復雜度高低與bug率高低有強相關性 。在各種測試指標當中,很少有像圈復雜度這樣與千行代碼bug率強相關的指標,相關度高達百分之九十幾 。也就是每千行代碼,圈復雜度越高BUG率就越高 。雖然不是因果性,但是對于一個工程學科來說,相關性也有足夠多的指導意義了,所以當我們看到圈復雜度比較高的代碼的時候,就要考慮重構掉 。
重構與十六字箴言這回我們就真的需要重構了,具體重構要怎么做呢?難道是把這塊刪了重寫嗎?那就有點糙了 。但精細的講,重構是有60多種手法的,也沒誰都能記住啊 。不過好在總的來說手法的模式是很相近的python,我們有個同事總結了四句話,我們戲稱為“16字箴言”,內容如下:
舊的不變新的創建一步切換舊的再見什么意思呢?首先不要著急改掉舊的代碼,先讓舊的保持不變,不過因為intelliJ這種利器的存在,使得抽取函數本身不再是一件危險的事(起碼在Java里是這樣),所以我們通常會先把要重構的舊的代碼抽個函數,讓重構的目標顯性化 。做這一步的時候,你會發現可能已經要改變代碼結構了,起碼要改造成我前面所說消除過程依賴,讓代碼之間只有數據依賴,這樣才好提取嘛 。提取之后寫個新實現,然后在調用點調用新實現,舊的調用點先注釋掉,測試通過了,在把舊的調用點代碼刪掉,打掃戰場把舊的實現也刪掉 。
具體到這個題呢,我的做法會是如下:
先消除過程依賴 。
然后抽取函數,把要讀音重構的代碼塊先通過函數封起來,劃定重構的邊界,把輸入輸出浮現音標出來 。
fizzbuzz牛津英語樹 fizzbuzz

文章插圖
接著寫一個新函數 。
fizzbuzz牛津英語樹 fizzbuzz

文章插圖
然后把函數調用點換掉 。
fizzbuzz牛津英語樹 fizzbuzz

文章插圖
然后把舊的函數刪掉,打掃現場,該改名改名,該去注釋去注釋 。
fizzbuzz牛津英語樹 fizzbuzz

文章插圖
上面每一步結束的時候都要保證測試是通過的 。軟件工程當中有一句很重要的理念:一個問題發現的越晚修正它的成本就越高 。本著這個思想,我們重構的時候也要是這個樣子,每做一次修改都要看一看有沒有問題,如果有問題就立刻修正 。如此小步前進,才是我們所謂的重構 。

相關經驗推薦