欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

重構(gòu)——重新組織函數(shù) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!

您當前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

重構(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ù),當前指的是那些無用的間接層。

做法

  1. 檢查函數(shù),確定它不具有多態(tài)性;

  2. 找出這個函數(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)化。

做法

  1. 檢查給臨時變量賦值的語句,確保等號右邊的表達式?jīng)]有副作用;

  2. 如果這個臨時變量并未被聲明為final,則聲明;

  3. 找到該臨時變量的所有引用點,將它們替換為為臨時變量賦值的表達式;

  4. 每次修改后,編譯并測試;

  5. 修改完所有引用點之后,刪除該臨時變量的聲明和賦值語句;

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ù)去。

做法

簡單情況:

  1. 找出制備復(fù)制一次的臨時變量,如果某個臨時變量被賦值超過一次,考慮使用分離臨時變量法將它分割成多個變量;

  2. 將該臨時變量聲明為final;

  3. 對該臨時變量賦值之語句的等號右側(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é)任。

做法

  1. 在待分解臨時變量的聲明及其第一次被賦值處修改其名稱,除了累加、字符串結(jié)合、寫入流或者向集合添加元素的變量。

  2. 將新的臨時變量聲明為final;

  3. 以該臨時變量的第二次賦值動作為界,修改此前對該臨時變量的所有引用點,讓它們引用新的臨時變量。

  4. 在第二次賦值處,重新聲明原先那個臨時變量;

  5. 逐次重復(fù)上述過程;

Remove Assignments to Parameters(移除對參數(shù)的賦值)

在這里插入圖片描述

動機

不要對參數(shù)賦值,因為它降低了代碼的清晰度,而且混用了按值傳遞和按引用傳遞這兩種參數(shù)傳遞方式,Java只采用按值傳遞的方式。

在按值傳遞的情況下,對參數(shù)的任何修改都不會對調(diào)用端造成任何影響

做法

  1. 建立一個臨時變量,把待處理的參數(shù)值賦予它;
  2. 對參數(shù)的賦值為界,將其后所有對此參數(shù)的引用點,全部替換為對此臨時變量的引用
  3. 修改賦值語句,使其改為對新建臨時變量賦值;

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

動機

將相對獨立的代碼從大型函數(shù)中提煉出來就可以大大提高代碼的可讀性,但是局部變量的存在會增加函數(shù)分解難度。

以函數(shù)對象取代函數(shù)會將所有局部變量都變成函數(shù)對象的字段,然后就可以對這個新對象使用提煉函數(shù)創(chuàng)造新函數(shù),從而將原本的大型函數(shù)拆解變短。

做法

  1. 建立一個新類,根據(jù)待處理函數(shù)的用途,為這個類命名;
  2. 在新類中建立一個final字段,用以保存原先大型函數(shù)所在的對象,將這個字段稱為源對象,同時,針對這個原函數(shù)的每個臨時變量和每個參數(shù)在新類中建立一個對應(yīng)的字段保存。
  3. 在新類中建立一個構(gòu)造函數(shù),接收源對象及原函數(shù)的所有參數(shù)作為參數(shù);
  4. 在新類中建立一個compute()函數(shù);
  5. 將原函數(shù)的代碼復(fù)制到compute()函數(shù)中,如果需要調(diào)用源對象的任何函數(shù),請通過源對象字段調(diào)用;
  6. 將就函數(shù)的函數(shù)本體替換為創(chuàng)建上述新類的一個新對象,而后調(diào)用其中的compute()函數(shù)

Substitile Algorithm(替換算法)

在這里插入圖片描述

相關(guān)案例查看更多