知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
重構(gòu)——重新組織函數(shù)
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):43
Extract Method提煉函數(shù)
動機
首先如果每個函數(shù)的粒度都很小,那么函數(shù)被復(fù)用的機會就更大;其次,這會使高層函數(shù)讀起來就像一系列注釋;再次,如果函數(shù)都是細粒度,那么函數(shù)的覆寫也會更容易。
做法
-
創(chuàng)造一個新函數(shù),根據(jù)這個函數(shù)的意圖來對它進行命名(以它“做什么”來命名而是“怎么做”)。
-
將提煉出來的代碼從源函數(shù)復(fù)制到新建的目標函數(shù)中。
-
仔細檢查提煉出的代碼,看看其中是否引用了作用域限于源函數(shù)的變量(包括局部變量和源函數(shù)參數(shù));
-
檢查是否有“僅用于被提煉代碼段”的臨時變量,如果有,在目標函數(shù)中將它們聲明為臨時變量。
-
檢查被提煉代碼段,看看是否有任何局部變量的值被它改變,如果有一個臨時變量值被修改了,看看是否可以將提煉代碼段處理為一個查詢,并將結(jié)果賦值給相關(guān)變量。
-
將被提煉代碼段中需要讀取的局部變量當做參數(shù)傳給目標函數(shù)。
-
處理完所有局部變量后,進行編譯。
Inline Method(內(nèi)聯(lián)函數(shù))
動機
- 簡短的函數(shù)表現(xiàn)動作意圖會使代碼更清晰易讀,但有時候會遇到某些函數(shù),其內(nèi)部代碼和函數(shù)名稱同樣清晰易讀;
- 將一群不甚合理的函數(shù)內(nèi)聯(lián)到一個大型函數(shù)中,再從中提煉出組織合理的小型函數(shù),比起既要移動一個函數(shù)、又要移動它所調(diào)用的其他所有函數(shù),將整個大型函數(shù)作為曾提移動會比較簡單;
- 如果別人使用了套太多間接層,使得系統(tǒng)中的所有函數(shù)都似乎只是對另一個函數(shù)的簡單委托,造成代碼閱讀時候在這些委托動作之間暈頭轉(zhuǎn)向,通常使用內(nèi)聯(lián)函數(shù),當前指的是那些無用的間接層。
做法
-
檢查函數(shù),確定它不具有多態(tài)性;
-
找出這個函數(shù)的所有被調(diào)用點;
Inline Temp(內(nèi)聯(lián)臨時變量)
動機
內(nèi)聯(lián)臨時變量多半是作為以查詢替代臨時變量的一部分使用的,所以真正的動機出現(xiàn)在后者那,但是,如果你發(fā)現(xiàn)某個臨時變量被賦予某個函數(shù)調(diào)用的返回值,雖然這并沒有任何危害,但是如果妨礙了其他重構(gòu)手法,就應(yīng)該將它內(nèi)聯(lián)化。
做法
-
檢查給臨時變量賦值的語句,確保等號右邊的表達式?jīng)]有副作用;
-
如果這個臨時變量并未被聲明為final,則聲明;
-
找到該臨時變量的所有引用點,將它們替換為為臨時變量賦值的表達式;
-
每次修改后,編譯并測試;
-
修改完所有引用點之后,刪除該臨時變量的聲明和賦值語句;
Replace Temp with Query(以查詢?nèi)〈R時變量)
動機
臨時變量的問題在于:它們是暫時的,而且只能在所屬函數(shù)內(nèi)使用,由于臨時變量只在所屬函數(shù)內(nèi)可見,所以它們會驅(qū)使你寫出更長的函數(shù),因為這樣才能訪問到函數(shù)上面定義的臨時變量。如果把臨時變量替換為一個查詢,那么同一個類中的所有函數(shù)都將可以獲得這份信息。局部變量會使代碼難以被提煉,所以應(yīng)盡可能把他們替換為查詢式。
這個重構(gòu)手法比較簡單的情況是:臨時變量只被賦值一次,或者賦值給臨時變量的表達式不受其他條件影響。對于其他情況可能需要先運用分解臨時變量或以查詢函數(shù)和修改函數(shù)分離使得情況變得簡單一些,如果你想替換的臨時變量是用來收集結(jié)果的(例如循環(huán)中的累加值),就需要將這些程序邏輯復(fù)制到查詢函數(shù)去。
做法
簡單情況:
-
找出制備復(fù)制一次的臨時變量,如果某個臨時變量被賦值超過一次,考慮使用分離臨時變量法將它分割成多個變量;
-
將該臨時變量聲明為final;
-
將對該臨時變量賦值之語句的等號右側(cè)部分提煉到一個獨立函數(shù)中;
對臨時變量進行累加的循環(huán)可以被提煉為一個獨立的函數(shù),對于一個循環(huán)累加好幾個值的時候,你應(yīng)該針對每個累加值重復(fù)一遍,這樣可以將所有臨時變量替換為查詢。
Introduce Explaining Variable(引入解釋性變量)
動機
你可以用這項重構(gòu)將每個條件子句提煉出來,以一個良好命名的臨時變量來解釋對應(yīng)條件子句的意義。
Split Temporary Variable(分解臨時變量)
動機
臨時變量有各種不同的用途,其中某些用途會很自然地導(dǎo)致臨時變量被多次賦值,循環(huán)變量和結(jié)果收集變量就是典型的例子,除此之外,還有很多臨時變量用于保存一段冗長代碼的運算結(jié)果,以便稍后使用。這種臨時變量應(yīng)該只被賦值一次,如果它們被賦值多次,就意味著它們在函數(shù)中承擔(dān)一個以上的責(zé)任,如果臨時變量承擔(dān)多個責(zé)任,它就應(yīng)該被替換為多個臨時變量,每個變量只承擔(dān)一個責(zé)任。
做法
-
在待分解臨時變量的聲明及其第一次被賦值處修改其名稱,除了累加、字符串結(jié)合、寫入流或者向集合添加元素的變量。
-
將新的臨時變量聲明為final;
-
以該臨時變量的第二次賦值動作為界,修改此前對該臨時變量的所有引用點,讓它們引用新的臨時變量。
-
在第二次賦值處,重新聲明原先那個臨時變量;
-
逐次重復(fù)上述過程;
Remove Assignments to Parameters(移除對參數(shù)的賦值)
動機
不要對參數(shù)賦值,因為它降低了代碼的清晰度,而且混用了按值傳遞和按引用傳遞這兩種參數(shù)傳遞方式,Java只采用按值傳遞的方式。
在按值傳遞的情況下,對參數(shù)的任何修改都不會對調(diào)用端造成任何影響
做法
- 建立一個臨時變量,把待處理的參數(shù)值賦予它;
- 以對參數(shù)的賦值為界,將其后所有對此參數(shù)的引用點,全部替換為對此臨時變量的引用;
- 修改賦值語句,使其改為對新建臨時變量賦值;
Replace Method with Method Object(以函數(shù)對象取代函數(shù))
動機
將相對獨立的代碼從大型函數(shù)中提煉出來就可以大大提高代碼的可讀性,但是局部變量的存在會增加函數(shù)分解難度。
以函數(shù)對象取代函數(shù)會將所有局部變量都變成函數(shù)對象的字段,然后就可以對這個新對象使用提煉函數(shù)創(chuàng)造新函數(shù),從而將原本的大型函數(shù)拆解變短。
做法
- 建立一個新類,根據(jù)待處理函數(shù)的用途,為這個類命名;
- 在新類中建立一個final字段,用以保存原先大型函數(shù)所在的對象,將這個字段稱為源對象,同時,針對這個原函數(shù)的每個臨時變量和每個參數(shù)在新類中建立一個對應(yīng)的字段保存。
- 在新類中建立一個構(gòu)造函數(shù),接收源對象及原函數(shù)的所有參數(shù)作為參數(shù);
- 在新類中建立一個compute()函數(shù);
- 將原函數(shù)的代碼復(fù)制到compute()函數(shù)中,如果需要調(diào)用源對象的任何函數(shù),請通過源對象字段調(diào)用;
- 將就函數(shù)的函數(shù)本體替換為創(chuàng)建上述新類的一個新對象,而后調(diào)用其中的compute()函數(shù)。
Substitile Algorithm(替換算法)
相關(guān)案例查看更多
相關(guān)閱讀
- 區(qū)塊鏈
- 小程序被攻擊
- 大理小程序開發(fā)
- 國內(nèi)知名網(wǎng)站建設(shè)公司排名
- 云南百度小程序
- 保山小程序開發(fā)
- 汽車報廢回收管理軟件
- 軟件定制
- 云南網(wǎng)絡(luò)營銷
- 小程序開發(fā)聯(lián)系方式
- 昆明做網(wǎng)站
- 昆明網(wǎng)站開發(fā)
- 云南小程序制作
- 網(wǎng)站建設(shè)專家
- web前端
- php網(wǎng)站
- 云南花農(nóng)小程序
- 商標
- 網(wǎng)絡(luò)公司報價
- 云南網(wǎng)站維護
- 云南省城鄉(xiāng)建設(shè)廳網(wǎng)站
- 云南軟件公司
- 云南網(wǎng)站建設(shè)價格
- 小程序制作
- 小程序模板開發(fā)公司
- 小程序定制開發(fā)
- 汽車報廢回收管理系統(tǒng)
- 出入小程序
- 昆明軟件定制
- 云南網(wǎng)站建設(shè)首選