標籤:

《重構》--- 重新組織函數

  • Extract Method(提煉函數)

    • 有一段代碼可以被組織在一起並獨立出來。將這段代碼放進一個獨立函數中,並讓函數名稱解釋該函數的用途。
    • 使用小函數,小型函數的優美動人。只要將相對獨立的代碼從大型函數中提煉出來,就可以大大提高代碼的可讀性。
  • Inline Method(將函數內聯化)

    • 一個函數,其本體(method body)應該與其名稱(method name)同樣清楚易懂。在函數調用點插入函數本體,然後移除該函數。

int getRating() {n return (moreThanFiveLateDeliveries()) ? 2 : 1;n }n boolean moreThanFiveLateDeliveries() {n return _numberOfLateDeliveries > 5;n }n 重構後n int getRating() {n return (_numberOfLateDeliveries > 5) ? 2 : 1;n }n

  • Inline Temp(將臨時變數內聯化)

    • 一個臨時變數,只被一個簡單表達式賦值一次,而它妨礙了其他重構手法。將所有對該變數的引用動作,替換為對它賦值的那個表達式本身。

double basePrice = anOrder.basePrice();n return (basePrice > 1000)n重構後nreturn (anOrder.basePrice() > 1000)n

  • Replace Temp with Query(以查詢取代臨時變數)

    • 以一個臨時變數(temp)保存某一表達式的運算結果。將這個表達式提煉到一個獨立函數(query)中。將這個臨時變數的所有「被引用點」替換為「對新函數的調用」。新函數可被其他函數使用。

double basePrice = _quantity * _itemPrice;nif (basePrice > 1000)n return basePrice * 0.95;nelsen return basePrice * 0.98;n重構後nif (basePrice() > 1000)n return basePrice() * 0.95;nelsen return basePrice() * 0.98;nndouble basePrice() {n return _quantity * _itemPrice;n}n

  • Introduce Explaining Variable(引入解釋性變數)

    • 一個複雜的表達式,將該表達式(或其中一部分)的結果放進一個臨時變數,以此變數名稱來解釋表達式用途。省卻注釋。

if ( (platform.toUpperCase().indexOf("MAC") > -1) &&n (browser.toUpperCase().indexOf("IE") > -1) &&n wasInitialized() && resize > 0 )n{n // do somethingn}n重構後nfinal boolean isMacOs = platform.toUpperCase().indexOf("MAC") > -1;nfinal boolean isIEBrowser = browser.toUpperCase().indexOf("IE") > -1;nfinal boolean wasResized = resize > 0;nnif (isMacOs && isIEBrowser && wasInitialized() && wasResized) {n // do somethingn}n

  • Split Temporary Variable(剖解臨時變數)

    • 程序有某個臨時變數被賦值超過一次,它既不是循環變數,也不是一個集用臨時變數,針對每次賦值,創造一個獨立的、對應的臨時變數。

double temp = 2 * (_height + _width);nSystem.out.println (temp);ntemp = _height * _width;nSystem.out.println (temp);n重構後nfinal double perimeter = 2 * (_height + _width);nSystem.out.println (perimeter);nfinal double area = _height * _width;nSystem.out.println (area)n

  • Remove Assignments to Parameters(移除對參數的賦值動作)

    • 代碼對參數進行賦值動作,降低了代碼的清晰度。
    • 只以參數表示「被傳遞進來的東西」,那麼代碼會清晰得多,在所有語言中都表現出相同語義。
    • 以一個臨時變數取代該參數的位置。

int discount (int inputVal, int quantity, int yearToDate) {n if (inputVal > 50) inputVal -= 2;n重構後nint discount (int inputVal, int quantity, int yearToDate) {n int result = inputVal;n if (inputVal > 50) result -= 2;n

  • Replace Method with Method Object(以函數對象取代函數)

    • 一個大型函數,其中對局部變數的使用,使你無法釆用 Extract Method。將這個函數放進一個單獨對象中,如此一來局部變數就成了對象內的值域(field) 然後你可以在同一個對象中將這個大型函數分解為數個小型函數。
  • Substitute Algorithm(替換你的演算法)

    • 把某個演算法替換為另一個更清晰的演算法

推薦閱讀:

《不該是這樣的啊!》
致知乎主機遊戲話題的各位答主們 —— 我的一點想法與建議

TAG:杂谈 |