一個函數調用的本體與名稱同樣清楚易懂。在函數調用點插入函數體,然後移除該函數。
int GetRating() { return MoreThanfiveLateDeliverise() ? 2 : 1; } bool MoreThanfiveLateDeliverise() { return _numberOfLateLiveries > 5; } |
int GetRating() { return _numberOfLateLiveries > 5 ? 2 : 1; } |
動機: 有時候你會遇到某些函數,其內部代碼和函數名稱同樣清晰易讀。也可能你重構了改函數,使得其內容和其名稱變得同樣清晰。果真如此,你應該去掉這個函數,直接使用其中的代碼。間接性可能帶來協助,但非必要的間接性總是讓人不舒服。
另一種需要使用Inline Method (內嵌函式)的情況是:你手上有一群不甚合理的函數。你可以將它們都內聯到一個大型函數中,再從中提煉出合理的小函數。實施Replace Method with Method Object (以函數對象取代函數)之前這麼做,往往可以獲得不錯的效果。你可以把所要的函數的所有調用對象的函數內容都內聯到函數對象中。比起既要移動一個函數,又要移動它所調用的其他所有函數,將整個大型函數作為整體來移動比較簡單。
如果別人使用了太多間接層,使得系統中所有函數都似乎只是對另一個函數的簡單委託,造成在這些委託動作之間暈頭轉向,那麼就使用 Inline Method (內嵌函式)。當然,間接層有其價值,但不是所有間接層都有價值。試著使用內聯手法,可以找出那些有用的間接層,同時將那些無用的間接層去除。
做法:1、檢查函數,確定它不具多態性。如果子類繼承了這個函數,就不要將此函數內聯,因為子類午飯覆寫一個根本不存在的函數。
2、找出這個函數的所有被調用點。
3、將這個函數的所有被調用點都替換為函數本體。
4、編譯、測試。
5、刪除該函數定義。
Inline Method (內嵌函式)似乎很簡單。但情況往往並非如此。對於遞迴調用、多返回點、內聯至另一個對象中而該對象並無提供訪問函數……每種情況都可以寫上好幾頁如果遇到這些情況,那麼就不應該使用這個手法。