重構筆記——內嵌函式,重構內嵌函式
本文是在學習中的總結,歡迎轉載但請註明出處:http://blog.csdn.net/pistolove/article/details/42261333
在上一篇文章中介紹了“提煉函數“。本文將介紹“內嵌函式”這種重構手法。
下面讓我們一起來學習該重構手法把。
開門見山
發現:一個函數的本體與名稱同樣清楚易懂。
解決:在函數調用點插入函數本體,然後移除該函數。
//重構前public int getRating(){return (moreThanSixLateDeliveries()) ? 2 : 1;}boolean moreThanSixLateDeliveries(){return _numberOfLateDeliveries > 6;}
//重構後public int getRating(){return (_numberOfLateDeliveries > 6) ? 2 : 1;}
動機
重構過程中經常會以簡短的函數來表現動作意圖,這樣就使得代碼更清晰易讀。但有時你會遇到某些函數,其內部代碼和函數名稱同樣清晰易讀。可能你重構了該函數,使得其內容和其名稱變得同樣清晰。果真如此,你就應該去掉這個函數,直接使用其中的代碼。間接性可能會帶來一些協助,但是沒有必要的間接性總是讓人感覺不舒服。
還有一種情況是:你手上有一群組織不甚合理的函數。你可以將它們都內聯到一個大型函數中,再從中提煉出組織合理的小型函數。比起既要移動一個函數、又要移動它所調用的其它所有函數,將整個大型函數作為整體來移動會比較的簡單。
如果你發現代碼中使用了太多的間接層,使得系統中的所有函數都似乎只是對另一個函數的簡單委託,造成對被些委託動作弄的暈頭轉向,這時通常也會使用內嵌函式。
做法(1)檢查函數,確定其不具有多態性。(如果子類繼承了這個函數,就不要將此函數內聯,因為子類無法複寫一個根本不存在的函數)。(2)找出這個函數的所有被調用點。(3)將這個函數的所有被調用點都替換為函數本體。(4)編譯,測試。(5)一切正常後,刪除該函數的定義。
內嵌函式看起來似乎很簡單。但情況往往那並非如此。對於遞迴調用、內聯至另一個對象中而該對象並無提供訪問函數......每一種情況都會很複雜。不介紹複雜情形是因為:如果你遇到了這樣複雜的情形,那麼就不該運用這種重構手法。
本文主要介紹了重構手法——內嵌函式,該手法處理起來比較簡單,說白了就是消除一個函數,並將其中的代碼移動到用到該函數的地方。雖然手法比較簡單,但是在開發的過程中還是會經常使用到該手法。希望本文對你有所協助。有問題可以留言,謝謝。(PS:下一篇將介紹重構筆記——內聯臨時變數)