摘要:并根據(jù)目錄選讀第章重構(gòu),第一個(gè)案例這是只是一個(gè)方法。絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對(duì)象內(nèi)最好不要在另一個(gè)對(duì)象的屬性基礎(chǔ)上運(yùn)用語(yǔ)句。
什么是重構(gòu)
在不改變代碼外在行為的前提下,對(duì)代碼做出修改以改進(jìn)程序內(nèi)部的結(jié)構(gòu)
簡(jiǎn)單地說(shuō)就是在代碼寫好后改進(jìn)它的設(shè)計(jì)
專業(yè)程序員(能夠提高你的代碼質(zhì)量)
資深設(shè)計(jì)師和架構(gòu)規(guī)劃師(理解為什么需要重構(gòu),哪里需要重構(gòu))
閱讀技巧帶著疑問(wèn)去讀:
如果你想要知道重構(gòu)是什么。第1章夠了
如果你想要知道為什么要重構(gòu),第1,2章
如果你想知道該在什么地方重構(gòu),第3章
如果你想進(jìn)行重構(gòu),第1,2,3,4章。并根據(jù)目錄選讀
第1章 重構(gòu),第一個(gè)案例public String statement(){ double totalAmount=0; int frequentRenterPoints=0; Enumerationrentals = _rentals.elements(); String result = "Rental Record for "+getName()+" "; while(rentals.hasMoreElements()){ double thisAmount=0; Rental each = (Rental)rentals.nextElement(); switch (each.getMovie().getPriceCode()) { case Movie.CHILDRENS: thisAmount += 1.5; if(each.getDaysRented()>3){ thisAmount += (each.getDaysRented()-3)*1.5; } break; case Movie.NEW_RELEASE: thisAmount += each.getDaysRented()*3; break; case Movie.REGULAR: thisAmount += 2; if(each.getDaysRented()>2){ thisAmount += (each.getDaysRented()-2)*1.5; } break; default: break; } frequentRenterPoints++; if(each.getMovie().getPriceCode()==Movie.NEW_RELEASE && each.getDaysRented()>1)frequentRenterPoints++; result += " "+each.getMovie().getTitle()+" "+String.valueOf(thisAmount)+" "; totalAmount +=thisAmount; } result += "Amount owed is " + String.valueOf(totalAmount) + " "; result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points "; return result; }
這是只是一個(gè)方法。直接評(píng)價(jià):太復(fù)雜,復(fù)用率低
解決方法 分解并重組將代碼按照功能拆分。每個(gè)功能只做一件事。
拆除switch并封裝為方法private double amountFor(Rental each, double result) { switch (each.getMovie().getPriceCode()) { case Movie.CHILDRENS: result += 1.5; if(each.getDaysRented()>3){ result += (each.getDaysRented()-3)*1.5; } break; case Movie.NEW_RELEASE: result += each.getDaysRented()*3; break; case Movie.REGULAR: result += 2; if(each.getDaysRented()>2){ result += (each.getDaysRented()-2)*1.5; } break; default: break; } return result; }重設(shè)變量名
變量名必須保證簡(jiǎn)單清楚,不產(chǎn)生歧義。比如上方代碼的each就是可修改的變量名。因?yàn)閑ach到底指的是什么
搬移代碼因?yàn)檫@個(gè)方法只使用了rental的信息。所以需要放在rental類下
去除臨時(shí)變量statement方法中有兩個(gè)臨時(shí)變量totalAmount和frequentRenterPoints。 做成getTotalAmount和getFrequentRenterPoints方法
public String statement() { double totalAmount = 0; int frequentRenterPoints = 0; // Enumeration接口定義了從一個(gè)數(shù)據(jù)結(jié)構(gòu)得到連續(xù)數(shù)據(jù)的手段 Enumeration rentals = _rentals.elements(); String result = "Rental Record for" + getName() + " "; while (rentals.hasMoreElements()) { Rental each = (Rental) rentals.nextElement(); result += " " + each.getMovie().getTitle() + " " + String.valueOf(each.getMovie().getPrice().getCharge(each.getDayRented())) + " "; } result += "Amount owed is " + String.valueOf(getTotalCharge()) + " "; result += "You earned " + String.valueOf(getTotalFrequentRenterPoints()) + "frequent renter points"; return result; } private int getTotalFrequentRenterPoints(){ int result=0; Enumeration rentals=_rentals.elements(); while(rentals.hasMoreElements()){ Rental each=(Rental)rentals.nextElement(); result+=each.getMovie().getFrequentRenterPoints(each.getDayRented()); } return result; } private double getTotalCharge(){ double result =0; Enumeration rentals=_rentals.elements(); while(rentals.hasMoreElements()){ Rental each=(Rental)rentals.nextElement(); result+=each.getMovie().getPrice().getCharge(each.getDayRented()); } return result; }測(cè)試重構(gòu)后的方法
保證重構(gòu)后的方法能夠滿足所有的需求
總結(jié)代碼塊俞小,代碼的功能就俞容易管理,代碼的處理和移動(dòng)也就俞輕松
任何不會(huì)被修改的變量都可以被當(dāng)成參數(shù)傳入新的函數(shù),至于會(huì)被修改的變量需要慎重。如果只有一個(gè)變量會(huì)被修改,可以把它當(dāng)做返回值。
絕大多數(shù)情況下,函數(shù)應(yīng)該放在它所使用的數(shù)據(jù)的所屬對(duì)象內(nèi)
最好不要在另一個(gè)對(duì)象的屬性基礎(chǔ)上運(yùn)用switch語(yǔ)句。如果不得不使用,也應(yīng)該在對(duì)象自己的數(shù)據(jù)上使用,而不是在別人的數(shù)據(jù)上使用。
使用繼承來(lái)適當(dāng)組織類關(guān)系后,可以用多態(tài)取代switch語(yǔ)句。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69675.html
摘要:重構(gòu)在不改變代碼的外在的行為的前提下對(duì)代碼進(jìn)行修改最大限度的減少錯(cuò)誤的幾率本質(zhì)上,就是代碼寫好之后修改它的設(shè)計(jì)。重構(gòu)可以深入理解代碼并且?guī)椭业?。同時(shí)重構(gòu)可以減少引入的機(jī)率,方便日后擴(kuò)展。平行繼承目的在于消除類之間的重復(fù)代碼。 重構(gòu) (refactoring) 在不改變代碼的外在的行為的前提下 對(duì)代碼進(jìn)行修改最大限度的減少錯(cuò)誤的幾率 本質(zhì)上, 就是代碼寫好之后 修改它的設(shè)計(jì)。 1,書中...
摘要:什么是重構(gòu)列表重構(gòu)方法需要以一種特定的格式記錄下來(lái)。這些重構(gòu)手法到底有多成熟本書中提到的重構(gòu)手法第章。做法創(chuàng)造新函數(shù),以用途命名提煉代碼到函數(shù)中檢查變量名是否符合規(guī)范在源函數(shù)中,將被提煉代碼替換為函數(shù)引用測(cè)試范例重構(gòu)前重構(gòu)后 什么是重構(gòu)列表 重構(gòu)方法需要以一種特定的格式記錄下來(lái)。按照格式記錄下來(lái)的重構(gòu)方法的集合叫重構(gòu)列表 重構(gòu)的記錄格式 每個(gè)重構(gòu)手法可分為5個(gè)部分: 名稱 構(gòu)建重構(gòu)詞匯...
摘要:重構(gòu)改善既有代碼設(shè)計(jì)動(dòng)詞使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。修補(bǔ)錯(cuò)誤時(shí)重構(gòu)代碼時(shí)重構(gòu)怎么重構(gòu)關(guān)于代碼的重構(gòu)技巧參考重構(gòu)改善既有代碼設(shè)計(jì)讀書筆記代碼篇個(gè)人博客 重構(gòu)定義 名詞 對(duì)軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本?!吨貥?gòu)-改善既有代碼設(shè)計(jì)》 動(dòng)詞 使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,...
摘要:改進(jìn)代碼設(shè)計(jì)的一個(gè)重要原則就是消除重復(fù)代碼使軟件更容易被理解優(yōu)秀的代碼能夠讓接收你代碼的付出更少的學(xué)習(xí)成本。重構(gòu)更容易找到重構(gòu)能加深對(duì)代碼的理解??梢灾貥?gòu)的情況添加功能時(shí)可以重構(gòu)。說(shuō)明你沒(méi)有發(fā)現(xiàn)代碼的錯(cuò)誤。需要重構(gòu)復(fù)審代碼時(shí)可以重構(gòu)。 為何重構(gòu) 重構(gòu)不是銀彈,但是幫助你達(dá)到以下幾個(gè)目的 改進(jìn)軟件設(shè)計(jì) 不良的程序需要更多的代碼。而代碼越多,正確的修改就越困難。改進(jìn)代碼設(shè)計(jì)的一個(gè)重要原則就...
那有什么天生如此,只是我們天天堅(jiān)持。 本篇文章主要講解 《重構(gòu)---改善既有代碼的設(shè)計(jì)》 這本書中的 第九章簡(jiǎn)化條件表達(dá)式中 的知識(shí)點(diǎn), Decompose Conditional(分解條件表達(dá)式) 問(wèn)題:你有一個(gè)復(fù)雜的條件(if、then、else) 語(yǔ)句 解決:從if、then、else三個(gè)段落中分別提煉出獨(dú)立函數(shù) //重構(gòu)前 if (date.before(SUMMER_START) |...
閱讀 1973·2023-04-26 01:59
閱讀 3276·2021-10-11 11:07
閱讀 3307·2021-09-22 15:43
閱讀 3388·2021-09-02 15:21
閱讀 2572·2021-09-01 10:49
閱讀 912·2019-08-29 15:15
閱讀 3100·2019-08-29 13:59
閱讀 2839·2019-08-26 13:36