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