亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

大話重構(gòu)連載17:抽取方法的實踐

系統(tǒng) 1754 0
說了那么多理論,我們來看看怎樣使用抽取方法來重構(gòu)遺留系統(tǒng)。如前所述,重構(gòu)的過程首先是閱讀程序代碼,邊閱讀邊整理程序。將功能相對獨立的代碼段放在一起,在前面加上注釋。調(diào)整一些程序的順序,將相關(guān)的代碼盡量放在一起,但要保證程序執(zhí)行的結(jié)果不會發(fā)生改變。比較典型的,將變量的定義與使用變量的代碼放在一起。這個步驟比較實用,因為許多的遺留系統(tǒng),其代碼都有一個壞毛病,就是在程序開始時定義一大堆變量,但要弄清這些變量都用來做什么,卻十分困難。邊讀邊調(diào)整,將變量的定義逐漸遷移到使用它的代碼段中,將大大提高代碼可讀性,你甚至?xí)l(fā)現(xiàn)并簡化一些變量。

前面的工作為抽取函數(shù)做好了準備,但你不必閱讀和整理完所有的代碼才開始抽取。許多遺留函數(shù)的大函數(shù)非常長,你可以整理一部分,就開始著手重構(gòu)。比如,把剛才分段的代碼段抽取出來,形成一個獨立的函數(shù)。在這里,代碼段與注釋,是我們決定是否需要抽取成函數(shù)的重要標志之一。

在閱讀過程中,許多長相相似的代碼也是我們需要重視的重要代碼。重復(fù)代碼是許多遺留系統(tǒng)代碼質(zhì)量差的重要原因之一,因此提高代碼復(fù)用就成為了代碼優(yōu)化一個重要的項目。整合大量重復(fù)的代碼,將其提取到一個統(tǒng)一的函數(shù)中為其它各處所調(diào)用,是一個值得推薦的辦法。因此,重復(fù)代碼也是抽取函數(shù)的重要標志。

除此之外,一些塊操作的語句,如條件語句、循環(huán)語句、try語句,都可能成為抽取函數(shù)的標志。最典型的就是if語句,包含在if語句中間的常常是一個相對獨立的功能,譬如一次重構(gòu)中,原代碼長得像這樣:

    	......
	if (cmd != null && cmd.equals("chkCard")){
		//此處省略了500行
	} else if (cmd != null && cmd.equals("chkIc")){
		//此處省略了300行
	} else if (cmd != null && cmd.equals("chkBuffer")){
		//此處省略了1000行
	}
	......
  


整個這段代碼有數(shù)千行之多,但整體結(jié)果就是用這樣的一系列if語句組成。隨后,我將每個if語句中的代碼都提取出來形成了各自的函數(shù)。它們被重構(gòu)成這樣:

    	......
	if (cmd != null && cmd.equals("chkCard")){
	     byte[] ret = chkCard(reader);
	     servletOutput(res, ret);
	} else if (cmd != null && cmd.equals("chkIc")){
	     byte[] ret = chkIc(reader);
	     servletOutput(res, ret);
	} else if (cmd != null && cmd.equals("chkBuffer")){
	     byte[] ret = chkBuffer(reader);
	     servletOutput(res, ret);
	}
	......
  


這樣,原來if語句中的業(yè)務(wù)操作代碼,就被抽取到chkCard(), chkIc(), chkBuffer()這樣的函數(shù)中了。起初我們將if語句中的所有代碼都抽取出來寫入這些函數(shù)中,這是十分自然而然想到的辦法。但隨后發(fā)現(xiàn)這樣需要將response作為參數(shù)傳遞給這些函數(shù)中,這樣的設(shè)計不太好。因此,將代碼還原回來重新重構(gòu),將寫入response的操作寫入到servletOutput()中了。整個過程如圖5.1所示:


圖5.1分解大函數(shù)的示例


完成了此次重構(gòu)以后,我們原來這個超級大函數(shù)由數(shù)千行代碼,縮減到了百來行代碼,這是一個可喜的進步,函數(shù)變得結(jié)構(gòu)清晰而易于閱讀。但是,被抽取出來的新函數(shù)卻依然龐大,它們有的會達到一千多行,閱讀依然困難。這時我們運用“抽取方法”繼續(xù)分解。比如這個chkCard(),它執(zhí)行的是一大堆校驗,每個校驗其功能都相對獨立。因此,我首先調(diào)整代碼順序,將每個校驗的代碼都獨立成一段,在前面添加相應(yīng)的注釋。然后使用抽取方法,將校驗抽取到一個一個函數(shù)中。

整個數(shù)千行代碼的超級大函數(shù),就這樣原子裂變式地逐漸分解,最后分解成數(shù)十個函數(shù)。每個函數(shù)只有數(shù)十行代碼,并通過注釋標注它們的用途與參數(shù)、返回值含義。這樣,一個起初難于閱讀的函數(shù),經(jīng)過一系列重構(gòu),開始變得可以閱讀了。是的,我們開始邁出了可喜地一步。但一個對象包含了數(shù)十個方法,這些方法被凌亂地堆砌在一起,沒有層級、沒有主次。最關(guān)鍵是,雖然每個方法都不大,但這個對象卻包含數(shù)千行代碼,依然顯得臃腫。因此我們還需要后面的步驟繼續(xù)重構(gòu)。

大話重構(gòu)連載首頁: http://fangang.iteye.com/blog/2081995
特別說明:希望網(wǎng)友們在轉(zhuǎn)載本文時,應(yīng)當注明作者或出處,以示對作者的尊重,謝謝!

大話重構(gòu)連載17:抽取方法的實踐


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色狠狠色综合久久8狠狠色 色狠狠婷婷97 | 国产大战女模特在线视频 | 国产区一区 | 精品91自产拍在线观看99re | 99精品一区二区免费视频 | 日韩精品成人 | 久久久精品在观看999 | 狠狠色噜噜狠狠狠狠91 | 久久精品视频免费播放 | 日日干狠狠干 | 欧美啪 | 国产精品久久亚洲不卡动漫 | 狠狠操综合 | 日本欧美韩国专区 | 欧美成人一区二免费视频 | 色婷婷在线播放 | 色综合一本到久久亚洲91 | 免费精品国产自产拍在 | 久久这里有精品视频 | 国产69精品久久久久9999 | 久热国产在线视频 | 久久综合九色综合91 | 成人影院www在线观看 | 久久精品国产在热久久2019 | 四虎永久免费观看 | 久久综合九色综合97欧美 | 99激情网 | 大学生不戴套毛片视频 | 亚洲h片| 国内外成人在线视频 | 亚洲精品777 | 午夜精品影院 | 不卡一区二区在线 | 日韩欧美一区在线观看 | 一级毛片真人不卡免费播 | 久艹视频在线 | 亚洲综合在线播放 | 女人18毛片a级毛片免费看一 | 久久青草社区 | 四虎网站在线播放 | 九九精品久久久久久久久 |