一,從新組織函數
1.首先找出局部變量和參數.
1>任何不會被修改的變量均可以看成參數傳入.
2.去掉臨時變量Replace Temp with Query.用查詢函數代替臨時變量
3.Extract Method
難點:有局部變量依賴.(用方法返回值的方式去賦回值)
4.Inline Method內聯函數(三段式)
5.Introduce Explaining Variable引入解釋性變量,(和2相反)
6.Split Temporary Variable(分解臨時變量:針對每次賦值,創造一個獨立\對應的臨時變量)
7.移除對參數的賦值(更明確,不會誤解按引用傳遞和按值傳遞)
8.已函數對象取代函數(將這個函數放進一個獨立對象中,如此依賴局部變量就變成了對象內的字段.而後就能夠在同一個對象中將這個大型函數分解爲多個小型函數)算法
二,在對象之間搬移特性
1,Move Method(有個函數與所駐類以外的另外一個類有過多的交流,調用後者或唄後者調用.那麼,在該函數最常引用的類中創建一個有着相似行爲的新函數,將舊函數變成一個單純的委託函數,或是將舊函數徹底移出)
2,Move Field(搬移字段,某個字段被其所駐類以外的另外一個類更多地用到)
3,Extract Class(提煉類,將相關的字段和函數從舊類搬移到新類)
4,隱藏"委託關係"(客戶經過一個委託類去調用另外一個對象)
5,引入外加函數(你須要爲提供服務的類添加一個函數,但你沒法修改這個類.在客戶類中創建一個函數,並以第一參數形式傳入一個服務類實例)
6,引入本地擴展(用繼承或聚合的方式去作類擴展)函數
三,從新組織數據
1.自封裝字段(爲類字段創建getter/setter方法,而且只以這個函數訪問字段)
2.以對象取代數據值(你有一個數據項,須要與其餘數據和行爲一塊兒使用纔有意義)
3.以字面量常量代替無心義數(宏定義或常量)
4,以子類取代類型碼(類繼承結構,多態)
5,用state(狀態模式)/strategy(策略模式)代替類型碼 ([都是用到多態的基本方式]狀態模式:多個狀態變換,將這些狀態子類化,而後由一個state manager來管理這些狀態[多態]; 策略模式:將不一樣算法分配到子類中去)
6,用字段取代子類(你的各個子類的惟一差異只在"返回常量數據"的函數身上,那麼修改這些函數,使他們返回超類中的某個(新增)字段,而後銷燬子類)[反多態.技巧,Replace Constructor with Factory Method用工廠方法將子類實例化的過程封裝在工廠方法裏,從而消除對子類的引用]
如:Peopele createMale(){return new Male();};
Peopele p = createMale();設計
四,簡化函數調用
1.Separate Query from Modifer(將查詢函數和修改函數分開,類的單一化設計)
2.Replace Parameter with Explicit Methods(以明確函數取代參數)
如:void setValue(String name,int value){if xxxx}
改成兩個語義化且明確的方法名:
void setName(){};
void setValue(){};
3.引入參數對象(有利弊,會引入結構依賴)
4.以工廠函數取代構造函數
如:Peopele createMale(){return new Male();};
Peopele p = createMale();對象
參考資料:<重構:改善既有代碼的設計>繼承