版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處....4.15.重構(gòu)-改善既有代碼的設(shè)計:重新組織函數(shù)的九種方法(四)函數(shù)過長或者邏輯太混亂,重新組織和整理函數(shù)的代碼,使之更合理進行封裝。1. Extract Method提煉函數(shù)提煉函數(shù):(由復雜的函數(shù)提煉出獨立的函數(shù)或者說大函數(shù)分解成由小函數(shù)組成)你有一段代碼可以被組織在一起并獨立出來。 將這段代碼放進一個獨立函數(shù),并讓函數(shù)名稱解釋該函 數(shù)的用途。void printOwing(
2、) /print banner System.out.println( System.out.println( System.out.println( /print details System.out.println (*Banner ” );*););"n ame: "+ _name);System.out.println ("amount "+ getOutstanding();void printOwing() printBanner();printDetails(getOutstanding(); Void printBanner() /pri
3、nt bannerSystem.out.println(System.out.println(System.out.println(<strong> void printDetails (System.out.println (System.out.println ( </strong>*” );“ Banner ” );“ *” );double outstanding) "n ame: "+ _name);"am ount "+ outstanding);過長的函數(shù)或者一段需要注釋才能讓人理解用途的代碼,就應(yīng)該將這段代碼放進一
4、個獨立函數(shù)中。簡短而命名良好的函數(shù)的好處:1)如果每個函數(shù)的粒度都很小,那么函數(shù)被復用的機會就更大;2)這會使高層函數(shù)讀起來就想一系列注釋;3)如果函數(shù)都是細粒度,那么函數(shù)的覆寫也會更容易些。一個函數(shù)多長才算合適?長度不是問題,關(guān)鍵在于函數(shù)名稱和函數(shù)本體之間的語義距離。如果提煉可以強化代碼的清晰度,那就去做,就算函數(shù)名稱必提煉出來的代碼還長也無所謂。2. I nli ne Method內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù):(直接使用函數(shù)體代替函數(shù)調(diào)用)一個函數(shù)調(diào)用的本體與名稱同樣清楚易懂。在函數(shù)調(diào)用點插入 函數(shù)體,然后移除該函數(shù)1.int getRating() 2.return moreThanfiveLate
5、Deliverise() ?23.4.bool moreThanfiveLateDeliverise() 5.retur n_numberOfLateLiveries >5;6.1. int getRating()2. return _numberOfLateLiveries >5 ? 2 :1;3. 有時候你會遇到某些函數(shù),其內(nèi)部代碼和函數(shù)名稱同樣清晰易讀。也可能你重構(gòu)了該函數(shù),使得其內(nèi)容和其名稱變得同樣清晰。果真如此,你應(yīng)該去掉這個函數(shù),直接使用其中的 代碼。間接性可能帶來幫助,但非必要的間接性總是讓人不舒服。另一種需要使用Inline Method (內(nèi)聯(lián)函數(shù))的情況是:你手
6、上有一群不甚合理的函數(shù)。 你可以將它們都內(nèi)聯(lián)到一個大型函數(shù)中,再從中提煉出合理的小函數(shù)。實施Replace Methodwith Method Object (以函數(shù)對象取代函數(shù))之前這么做,往往可以獲得不錯的效果。你 可以把所要的函數(shù)的所有調(diào)用對象的函數(shù)內(nèi)容都內(nèi)聯(lián)到函數(shù)對象中。比起既要移動一個函 數(shù),又要移動它所調(diào)用的其他所有函數(shù),將整個大型函數(shù)作為整體來移動比較簡單。如果別人使用了太多間接層,使得系統(tǒng)中所有函數(shù)都似乎只是對另一個函數(shù)的簡單委托,造成在這些委托動作之間暈頭轉(zhuǎn)向,那么就使用Inline Method(內(nèi)聯(lián)函數(shù))。當然,間接層有其價值,但不是所有間接層都有價值。試著使用內(nèi)聯(lián)手法,
7、可以找出那些有 用的間接層,同時將那些無用的間接層去除。本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處n li ne Temp內(nèi)聯(lián)臨時變量內(nèi)聯(lián)臨時變量:(表達式代替臨時變量) 你有一個臨時變量,只被一個簡單表達式賦值一次,而它妨礙了其他重構(gòu)手法。 將所有對該變量的引用動作,替換為對它賦值的那個表達式自身double basePrice = anOrder.BasePrice();return basePrice(> 1000);return ( anOrder.
8、BasePrice() >1000);Inline Temp(內(nèi)聯(lián)臨時變量)多半是作為 Replace Temp with Query( 以查詢?nèi)〈R時 變量)的一部分使用的,所以真正的動機出現(xiàn)在后者那里。唯一單獨使用Inline Temp(內(nèi)聯(lián)臨時變量)情況是:你發(fā)現(xiàn)某個臨時變量被賦予某個函數(shù)調(diào)用的返回值。一般來說,這樣的臨時變量不會有任何危害,可以放心把它留在那。但如果這個臨時 變量妨礙了其他的重構(gòu)手法,例如Extract Method(提煉函數(shù)),就應(yīng)該將它內(nèi)聯(lián)化。4.Replace Temp with Query 以查詢代替臨時變量以查詢代替臨時變量: (獨立函數(shù)代替表達式)你的
9、程序以一個臨時變量保存某一個表達 式的運算效果。將這個表達式提煉到一個獨立函數(shù)中。將這個臨時變量的所有引用點替換為對新函數(shù)的調(diào)用。此后,新函數(shù)就可以被其他函數(shù)調(diào)用。1. double basePrice =_quantity*_itemPrice;2. if (basePrice >1000) 3. returnbasePrice *0.95 ;4. else5. returnbasePrice *0.98 ;1. if (basePrice() >1000)2. return basePrice() *0.95 ;本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,
10、轉(zhuǎn)載請注明出處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處3. else4. return basePrice() *0.98 ;5. 6. doublebasePrice() 7. return .quantity * _itemPrice;8. 臨時變量的問題在于:它們是暫時的,而且只能在所屬函數(shù)內(nèi)使用。由于臨時變量只是在所屬函數(shù)內(nèi)可見,所以它們會驅(qū)使你寫出更長的函數(shù),因為只有這樣你才能訪問到需要的臨時變量。如果把臨時變量替換為一個查詢,那么同一個類中的所有函數(shù)都可以獲得這份信息。這將帶給你極大幫助,使你能夠為這個類編寫更清晰地代碼。以查詢代替臨時變量往
11、往是你運用 Extract Method(提煉函數(shù))之前必不可少的一個步| 驟。局部變量會使代碼難以被提煉,所以你應(yīng)該盡可能把它們替換為查詢式。這個重構(gòu)手法較為簡單的情況是:臨時變量只被賦值一次,或者賦值給臨時變量的表達 式不受其他條件影響。其他情況比較棘手,但也可能發(fā)生。你可能需要先運用 Split Temporary Variable(分解臨時變量)或Separate Query form Modifier(將查詢函數(shù)和修改函數(shù)分離 )使 情況變得簡單一些,然后再替換臨時變量。如果你想替換的臨時變量是用來收集結(jié)果的)例如循環(huán)中的累加值),就需要將某些程序邏輯(例如循環(huán))復制到查詢函數(shù)去。5
12、.ln troduce Expla ining Variable弓 I入解釋性變量引入解釋性變量:(復雜表達式分解為臨時解釋性變量)你有一個復雜的表達式。將該復雜表達式(或其中一部分)的結(jié)果放進一個臨時變量,以此變量名稱來解釋表達式用途。1.if(Platform.ToUpperCass().indexOf(dexOf( "le")> -1) && Waslnitalized() ) 2./do something3."MAC") > -1 && (Browser.ToUpperCass().in1. cons
13、t bool imMacOs = Platform.ToUpperCass().indexOf("MAC") > -1;2. con st bool isleBrowser = Browser.ToUpperCass().indexOf("le" ) > -1;3. const bool waslnitalized = Waslnitalized();4. if(imMacOs && isleBrowser && waslnitalized)5. 6. /do something7. 表達式有可能非常復雜而難以
14、閱讀。這種情況下,臨時變量可以幫助你將表達式分解為 比較容易管理的形式。在條件邏輯中,Introduce Explaining Variable(引入解釋性變量)是一個很常見的手法, 但是最好盡量使用 Extract Method(提煉函數(shù))來解釋一段代碼的意義。 畢竟臨時變量只在他 所處的那個函數(shù)才有意義,局限性較大。函數(shù)則可以在對象的這個生命中都有用,并且可被其他對象使用。但有時候,當局部變量使Extract Method(提煉函數(shù))難以進行時,就可以使用 Introduce Explaining Variable(引入解釋性變量)6. Split Temporary Variable 分
15、解臨時變量分解臨時變量:(臨時變量不應(yīng)該被賦值超過一次)你的程序有某個臨時變量被賦值超過一次,它既不是循環(huán)變量,也不被用于收集計算結(jié)果。針對每次賦值,創(chuàng)造一個獨立、對應(yīng) 的臨時變量1. double temp =2 + (_height + _width);2. Console.WriteLine(temp);3. temp = _height * _width;4. Console.WriteLine(temp);1. const double perimeter =2 + (_height + _width);2. Console.WriteLine(perimeter);3. const
16、 double area = _height* _width;4. Console.WriteLine(area);臨時變量有各種不同用途,其中某些用途會很自然的導致臨時變量被多次賦值。循環(huán)變量”和 結(jié)果收集變量”就是典型的例子:循環(huán)變量會隨循環(huán)的每次運行而改變; 結(jié)果收集變量負責將通過這個函數(shù)的運算”而構(gòu)成的某個值收集起來。除了這2種情況,還有很多臨時變量保存一段冗長代碼的運算結(jié)果,以便稍后使用。這種臨時變量應(yīng)該只被賦值一次。如果它們被賦值超過一次,就意味著它們在函數(shù)中承擔了一個以上的職責。 如果臨時變量承擔多個責任,它就應(yīng)該被替 換為多個臨時變量,每個變量只承擔一個責任。同一個臨時變量承擔
17、2件不同的事情,會令代碼閱讀者糊涂。... Remove Assigme nts to Parameters移除對參數(shù)的賦值移除對參數(shù)的賦值:(不要對參數(shù)賦值)代碼對一個參數(shù)賦值。以一個臨時變量取代該參 數(shù)的位置。int discount ( int inputVal, int quantity, int yearToDate)if (inputVal >50) inputVal -=2;int discount ( int inputVal, int quantity, int yearToDate) int result = inputVal
18、;if (inputVal >50) result -=2;如果參數(shù)是Object,容易誤賦值。采用final來防止誤用參數(shù):要清楚“對參數(shù)賦值”這個說法的意思。如果你把一個名為foo的對象作為參數(shù)傳給某個函數(shù),那么“對參數(shù)賦值”意味著改變foo,使它引用另外一個對象。如果你在“被傳入對象”身上進行什么操作,那沒 什么問題。這里只針對“ foo被改而指向另一個對象”這種情況來討論。<span style= "font-size:12px;">void aMethod(Object foo) foo.modifylnSomeWay();foo = anoth
19、erObject;v/span>這樣的做法降低了代碼的清晰度,而且混用了按值傳遞和按引用傳遞這2種參數(shù)傳遞方式。在按值傳遞的情況下,對參數(shù)的任何修改,都不會對調(diào)用端造成任何影響。那些用過按引用傳遞方式的人 可能會在這一點上犯糊涂。另一個讓人糊涂的地方時函數(shù)本體內(nèi)。如果你只以參數(shù)表示“被傳遞進來的東西”。那么代碼會清晰地多, 因為這種用法在所有語言都表現(xiàn)出相同語義。8. Replace Method with Method object函數(shù)對象取代函數(shù)函數(shù)對象代替函數(shù):(大函數(shù)變成類) 你有一個大型函數(shù),其中對局部變量的使用使你無法 采用Extract Method(提煉函數(shù))。將這個大型
20、函數(shù)放進一個單獨對象中,如此一來局部變量就成了對象內(nèi)的字段。然后你可以在同一個對象中將這個大型函數(shù)分解為多個小型函 數(shù)。.5.6.class Order.double price() double primaryBasePrice; double secondaryBasePrice;double tertiaryBasePrice;/ long computation; .7.本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明岀處本文由西安白癜風醫(yī)院收集,轉(zhuǎn)載請注明出處return new Pricecalcul
21、ator (this) .compute 0或者可以采用 static method局部變量的存在會增加函數(shù)分解的難度。如果一個函數(shù)之中局部變量泛濫,那么想分解這個函數(shù)是 非常困難的。Replace T emp with Query(以查詢?nèi)〈R時變量)可以幫助你減輕這一負擔,但有時候你會發(fā)現(xiàn)根本無法拆解一個需要拆解的函數(shù)。這種情況下,應(yīng)該使用函數(shù)對象。....6.7.9.Substitute Algorithm替換算法替換算法:(函數(shù)本體替換為另一個算法)你想要把某個算法替換為另一個更清晰地算法。將函數(shù)本體替換為另一個算法。String foundPerson(String people)for ( int i =0; i < people.length; i+) if(peoplei.equals ("Don" )return"Don ”;if(peoplei.equals ("John&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)育嬰師服務(wù)合同
- XX省重點水電工程擴建項目合同2025
- 個人股權(quán)轉(zhuǎn)讓合同書
- 產(chǎn)品售后保養(yǎng)服務(wù)合同樣本
- 個人借款抵押存單合同范本
- 互聯(lián)網(wǎng)專線接入合同范本
- 個人借款合同催款函范本
- 二手摩托車分期付款合同
- XX領(lǐng)域XX合同簽訂儀式成功舉辦
- 專有技術(shù)購買合同模板
- 2024年公安機關(guān)理論考試題庫附答案【考試直接用】
- 課題申報參考:共同富裕進程中基本生活保障的內(nèi)涵及標準研究
- 2024醫(yī)師資格考試考生誠信考試承諾書
- 煤礦職業(yè)衛(wèi)生培訓課件2023
- GB/T 13364-2008往復泵機械振動測試方法
- 植物的類群及演化
- 老年社會工作課件
- 最新記24小時出入量、護理文書書寫規(guī)范課件
- 普通生物學考試大綱
- DB23T 2714-2020 農(nóng)村生活垃圾非焚燒低溫處理設(shè)施大氣污染物排放標準
- 【人教版】免疫系統(tǒng)的組成和功能課件1
評論
0/150
提交評論