第六章 重新組織函數

6.1 Extract Method (提煉函數)

將代碼放進一個獨立函數中, 并讓函數名稱解釋該函數的用途

6.2 Inline Method(內聯函數)

一個函數的本體(method body)與其名稱(method name)同樣清楚易懂

在函數插入點插入函數本體,然后移除該函數

6.3 Inline Temp(內聯臨時變量)

你有一個變量,只被一個簡單表達式賦值一次, 而它妨礙了其他重構手法.

將所有對該變量的引用動作, 替換為對它賦值的那個表達式自身.

這條多半是作為 用查詢替代臨時變量 的一部分使用的.

6.4 Replace Temp With Query(用查詢替代臨時變量)

你的程序以一個臨時變量保存某一表達式的運算結果

將這個表達式提煉到一個獨立函數中. 將這個臨時變量是所有引用點替換為對新函數的調用.此后,新函數就可以被其他函數使用.

6.5 Introduce Explaining Variable(引入解釋性變量)

你有一個復雜的表達式

將該復雜的表達式(或者其中一部分)的結果放進一個臨時變量, 以此變量名來解釋表達式用途.

表達有可能非常復雜而且難以閱讀.臨時變量可以幫助你講表達式分解為必要容易管理的形式.

6.6 Split Temporary Variable(分解臨時變量)

你的程序有某個臨時變量被賦值超過一次, 他既不是循環變量,也不被用于收集計算結果.

針對每次賦值,創造一個獨立,對應的臨時變量

6.7Remove Assignment to Parameter(移除對參數的賦值)

代碼對一個參數進行賦值

以一個臨時變量取代該參數的位置.


- (void)discountInputValue:(int)inputValue quantity:(int)quantity yearToDate:(int)yearTodate{
    if (inputValue > 50) {
        inputValue -= 2;
    }   
}
/**
 *   以下為重構代碼.
 *   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
 */

- (void)discountInputValue:(int)inputValue quantity:(int)quantity yearToDate:(int)yearTodate{
    int result = inputValue;
    if (inputValue > 50) {
        result -= 2;
    }
}

因為有時候參數可能是對另一個對象的引用.

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

你有一個大型函數, 其中對局部變量的使用使你無法采用Extract Method

將這個函數放進一個單獨對象中, 如此一來局部變量就成了對象內的字段. 然后你可以在同一個對象中將這個大型函數分解為多個小型函數.

只要將相對獨立的代碼從大函數中提煉出來, 就可以大大提高代碼的可讀性.

6.9 Substitute Algorithm (替換算法)

你想把某個函數替換為另一個更清晰的算法

將函數本體替換為另一個算法

解決問題有好幾種方法, 我敢打賭其中某些方法回比另一些簡單.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 函數重構幾乎都是源自于Long Methods。這導致了函數包含的信息過多,信息帶來的邏輯錯綜復雜。 1 Extr...
    hklbird閱讀 481評論 0 1
  • Extract Method 提煉方法 動機 Extract Method 是最常用的重構手法之一。 函數過長或者...
    chiguozi閱讀 786評論 0 0
  • 《重構》讀書筆記 總覽 第一部分 第一章從實例程序出發,展示設計的缺陷,對其重構可以了解重構的過程和方法。 第二部...
    白樺葉閱讀 2,428評論 2 5
  • 這是一本所有人都應該一讀的書,關于衰老,關于死亡,關于所有你不想面對卻無法回避的問題,那些關于生死的討論從未停歇,...
    丁小姐的出口閱讀 771評論 0 6
  • 這段時間繼續忙工作忙帶娃,自己的時間少之又少,偶爾刷下手機,看著積壓成災的一堆信息,焦慮感又劇增,想學點做點真正有...
    思悟記錄儀閱讀 216評論 0 0