重構之提煉程式碼
前幾天北京圖書大廈買了兩本書<<重構,改善既有程式碼的設計>>與<<agile with="" web="" development="" rails=""></agile>><agile with="" web="" development="" rails=""></agile>
特意把書的程式碼一個字一個字粘出來,望能幫助我們這些開發人員對"重構"理解提供一些幫助,
當你有一段程式碼可以被組織在一起獨立出來
將這段程式碼放進一個獨立函式中,並讓函式名稱解釋該函式的用途
函式的命名是非常重要的,以前我做開發的時候,從來我就不考慮這麼多,只要這個函式能跑起來就行,我也不去管那麼多,現在看了"重構",感覺它有另外一種思想,望大家好好學習!!
java 程式碼
- void printOwing(double amonut){
- printBanner();
- //print details
- System.out.println("name:"+_name);
- System.out.println(""amount:"+amount);
- }
重構後的程式碼:
java 程式碼
- void printOwing(double amonut){
- printBanner();
- printDetails(amount
- }
- void printDetails(double amount){
System.out.println("name:"+_name); - System.out.println("amount:"+amount);
- }
可以看出現在變成了兩個方法,把一部分語句抽出來做為一個方法!!
Extract Method 是最常見的重構方法之一。看見一個過長的函式或者一段需要註釋才能讓人理解用途的程式碼,就會將這個段程式碼放進一個獨立函式中。
有數個原因造成簡短面有良好的命名的函式。首先,如果每個函式的粒度都江堰市很小(finely grained),那麼函式之間彼此複用的機會就更大了,其次,這會使高層函式程式碼讀起來就像一系列註釋;再者,如果函式都是細粒度,那麼函式的覆寫(override)也會更容易些.
作法:
- 創造一個新函式,根據這個函式的意圖來給它命名
- 仔細檢查提煉出的程式碼,看看其中是否引用了(作用域限於源函式)的變數(包括區域性變數和源函式引數)
- 檢查是否有(僅僅用於被提煉程式碼)的臨時變數,如果有,在目標函式中將它們宣告為臨時變數
- 檢查被提煉碼,看看是否有任何區域性變數的值被它改變,如果一個臨時變數值被修改了,看看是否可以將被提煉碼處理為一個查詢(Query),並將結果值給相關變數,
- 將被提煉程式碼中需要讀取的區域性變數,當作函式傳給目標函式
範例1):無區域性變數(No Local Variables)
java 程式碼
- void printOwing()
- {
- Enumeration e =_orders.elements();
- double outstanding=0.0;
- //calculate outstanding
- System.out.println("*******************************");
- System.out.println("********* Customer Owes********");
- System.out.pritnln("*******************************");
- //calculate outstanding
- while(e.hasMoreElements()
- {
- Order each=(Order)e.nextElement();
- outstanding +=each.getAmount();
- }
- //print details
- System.out.println("name:"+_name);
- System.out.println("amount:"+outstanding);
- }
重構後:
java 程式碼
- void printOwing(){
- Enumeration e=_orders.elements();
- double outstanding=0.0;
- printBanner();
- //calculate outstanding
- while (e.hasMoreElements())
- {
- Order order=(Order)e.nextElement();
- outstanding +=each.getAmount();
} - //print details
- System.out.println("name:"+_name);
- System.out.println("amount:"+outstanding);
- }
- void printBanner(){
- //print banner
- System.out.println("*******************************";
- System.out.println("*********** Customer Owes *****");
- System.out.println("*******************************"):
}
範例2):對區域性變數再賦值(Reassigning)
java 程式碼
- void printOwing(){
- printBanner();
- double outstanding=getOutstanding();
- printDetails(outstanding);
- }
- double getOutstanding()
- {
- Enumeration e=_orders.elements();
- while (e.hasMoreElements())
- {
- Order each=(Order)e.nextElement();
- outstanding +=each.getAmount();
- }
- return outstanding;
}
Enumeration 變數 e 只有被提煉碼中用到,所以可以將它整個搬到新函式中,double 變數oustanding 在被提煉碼內外都被用到,所以我必須讓提煉的新函式返回它。
java 程式碼
- double getOutstanding()
- {
- Enumeration e=_orders.elements();
- double result=0.0;
- while(e.hasMoreElements())
- {
- Order each=(Order)e.nextElement();
- result +=each.getAmount();
- }
- return result;
}
最後提煉成:
java 程式碼
- void print()
- {
- printBanner();
- double outstanding=getOutstanding();
- printDetails(outstanding);
- }
相關文章
- 要點提煉| 理解JVM之程式編譯&程式碼優化JVM編譯優化
- 要點提煉| 理解JVM之類檔案結構JVM
- 要點提煉| 理解JVM之位元組碼執行引擎JVM
- 程式碼重構之法——方法重構分析
- 網頁播放器開發(四)程式碼精煉提純網頁播放器
- “硬核”程式碼重構
- 重構 PHP 程式碼PHP
- 提煉事實
- 要點提煉|開發藝術之IPC
- 【讀程式碼重構有感】
- 談談程式碼重構
- 程式碼重構技巧(二)
- 重構-改善既有程式碼的設計(七)– 在程式碼之間搬移特性
- 程式碼重構:類重構的 8 個小技巧
- 重構你的javascript程式碼JavaScript
- 程式碼重構那些事兒
- 要點提煉| 理解JVM之類載入機制JVM
- 重構改善既有的程式碼設計(重構原則)
- 程式碼重構:函式重構的 7 個小技巧函式
- 要點提煉| Gradle指南Gradle
- 重構指標之如何監控程式碼圈複雜度指標複雜度
- 程式設計師內功修煉之資料結構程式設計師資料結構
- 不想得手指關節炎?幫你提煉IDEA常用程式碼補全操作Idea
- 程式碼重構與單元測試——“提取方法”重構(三)
- 重構程式碼(應如寫詩)
- 程式碼的壞味道和重構
- 記一次程式碼重構
- 要點提煉| 理解JVM之GC&記憶體分配JVMGC記憶體
- 要點提煉| 理解JVM之記憶體管理機制JVM記憶體
- 重構:改善既有程式碼的設計(第二版讀書筆記) - 重構、壞程式碼、寫好程式碼筆記
- jscodeshift入門簡介&程式碼重構&程式碼分析&&ReactJSReact
- 要點提煉| 理解JVM之記憶體模型&執行緒JVM記憶體模型執行緒
- 要點提煉| 理解JVM之執行緒安全&鎖優化JVM執行緒優化
- 程式碼重構-業務中臺化
- 3個例子教你重構 Python 程式碼Python
- 6 個例子教你重構 Python 程式碼Python
- leobert重構程式碼二三事--一.可怕的低階程式碼
- 還重構?就你那程式碼只能鏟了重寫!
- google protobuf的原理和思路提煉Go