自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Eclipse之重構(gòu)(Refactor)

開發(fā) 后端
本文介紹了Eclipse支持的重構(gòu)種類,它們的含義,以及怎樣重構(gòu)。本文同時(shí)也可以作為學(xué)習(xí)重構(gòu)知識的快速手冊。

Refactor

重構(gòu)和單元測試是程序員的兩大法寶,他們的作用就像空氣和水對于人一樣,平凡,不起眼,但是意義深重。預(yù)善事,必先利器,本文就介紹怎樣在Eclipse中進(jìn)行重構(gòu)。

本文介紹了Eclipse支持的重構(gòu)種類,它們的含義,以及怎樣重構(gòu)。本文同時(shí)也可以作為學(xué)習(xí)重構(gòu)知識的快速手冊。

1、什么是重構(gòu)?

重構(gòu)是指在保持程序的全部功能的基礎(chǔ)上改變程序結(jié)構(gòu)的過程。重構(gòu)的類型有很多,如更改類名,改變方法名,或者提取代碼到方法中。每一次重構(gòu),都要執(zhí)行一系列的步驟,這些步驟要保證代碼和原代碼相一致。

2、為什么重構(gòu)很重要?

手工重構(gòu)時(shí),很容易在代碼中引入錯誤,例如拼寫錯誤或者漏掉了重構(gòu)的某一步。為了防止引入錯誤,在每次重構(gòu)前后,都要執(zhí)行充分的測試。你可能會好奇重構(gòu)是否是值得的。

重 構(gòu)的理由很多。你可能想要更新一段代碼很爛的程序。或者最初的設(shè)計(jì)隊(duì)伍都不在了,現(xiàn)在隊(duì)伍中每人了解這些程序。為了更新,你必須要重新設(shè)計(jì)構(gòu)建程序來滿足 你的需求。另一個(gè)原因是原來的設(shè)計(jì)無法使你將新的特性添加進(jìn)去。為了添加進(jìn)去,你要重構(gòu)這些代碼。第三個(gè)原因是一個(gè)自動重構(gòu)的工具可以為你自動生成代碼, 例如Eclipse中的重構(gòu)功能。使用重構(gòu),你可以在重寫盡量少的代碼和仍保持軟件功能的同時(shí),使代碼的邏輯性更好。

3、測試

在重構(gòu)時(shí),測試是十分重要的。應(yīng)為重構(gòu)改變了代碼的結(jié)構(gòu),你要保證重構(gòu)后代碼的功能沒有被改變。手工重構(gòu)時(shí),一個(gè)好的測試套是必須的。使用自動重構(gòu)工具是,測試也是必要的,但不需要很頻繁,應(yīng)為自動重構(gòu)工具不會產(chǎn)生手工重構(gòu)時(shí)的那些錯誤,如拼寫錯誤。

在Eclipse中可以使用JUnit方便的為程序創(chuàng)建測試代碼,具體方法不在本文描述。

Eclipse中的重構(gòu)

JDT,Eclipse中的Java插件,能夠?qū)ava項(xiàng)目,類,或成員進(jìn)行多種類型的自動重構(gòu)??梢圆扇《喾N方法快速的為Java項(xiàng)目中的某個(gè)元素進(jìn)行重構(gòu)。

為 某些元素進(jìn)行重構(gòu)的前提是你必須選中他們。你可以在多個(gè)視圖中選擇這些元素,像大綱視圖或包瀏覽視圖??梢园醋trl或Shift鍵,在視圖中選擇多個(gè) 元素。另外一種選擇的方法是使該元素的編輯區(qū)高亮顯示,或者把鼠標(biāo)定位到源程序文件。在選中希望重構(gòu)的元素后,可以從重構(gòu)菜單的下拉項(xiàng)選擇重構(gòu),也可以從 右鍵單擊后彈出菜單中選擇重構(gòu)子菜單。同時(shí),Eclipse還提供了重構(gòu)的快捷鍵操作。

某些重構(gòu)可以應(yīng)用在任意元素上,有些則只能用在特定類型的元素上,如類或方法。在本文的***的表格中,列出了重構(gòu)能夠應(yīng)用的元素類型,以及重構(gòu)的快捷鍵。

在 Eclipse中,所有的重構(gòu)都能夠在正式執(zhí)行之前預(yù)覽一下。在重構(gòu)對話框中點(diǎn)擊“預(yù)覽”按鈕,可以查看所有將要被改變的地方。唯一沒有預(yù)覽按鈕的的重構(gòu) 是Pull Up,在它的重構(gòu)向?qū)е?,?**,預(yù)覽面板總會出現(xiàn)??梢詫⑵渲械膫€(gè)別變化反選掉,這樣這些改變就不會生效。

撤銷和重做

在重構(gòu)菜單中有撤銷和重做項(xiàng)。他們和編輯菜單中的撤銷重做不同。即使重構(gòu)改變了很多文件,編輯菜單中的撤銷重做只會更改當(dāng)前文件。重構(gòu)菜單中的撤銷和重做則會對一次重構(gòu)的所有文件進(jìn)行撤銷和重做操作。但是在使用時(shí),它們有一定的限制。

重構(gòu)后,無論重構(gòu)改變了文件與否,如果任一個(gè)文件被另外改變而且保存了,你就無法撤銷或重做這個(gè)重構(gòu)。假如一個(gè)文件在重構(gòu)中被修改了,然后又被編輯了,但是還沒有保存,這時(shí)就會有錯誤信息提示,如果你想要撤銷或重做該重構(gòu),必須撤銷未保存的文件。

只要注意到以上的限制條件,你就可以隨心所欲的對重構(gòu)進(jìn)行撤銷或重做。你甚至能夠編譯,運(yùn)行你的程序測試一下,然后再撤銷該重構(gòu),只要你沒有改變并保存任何文件。

Eclipse中的重構(gòu)類型

如果你看一下Eclipse的重構(gòu)菜單,可以看到四部分。***部分是撤銷和重做。其他的三部分包含Eclipse提供的三種類型的重構(gòu)。

***種類型的重構(gòu)改變代碼的物理結(jié)構(gòu),像Rename和Move。第二種是在類層次上改變代碼結(jié)構(gòu),例如Pull Up和Push Down。第三種是改變類內(nèi)部的代碼,像Extract Method和Encapsulate Field。這三部分的重構(gòu)列表如下。

類型1 物理結(jié)構(gòu)

l Rename

l Move

l Change Method signature

l Convert Anonymous Class to Nested

l Convert Member Type to New File

類型2 類層次結(jié)構(gòu)

l Push Down

l Push Up

l Extract Interface

l Generalize Type (Eclipse 3)

l User Supertype Where Possible

類型3 類內(nèi)部結(jié)構(gòu)

l Inline

l Extract Method

l Extract Local Variable

l Extract Constant

l Introduce Parameter

l Introduce Factory

l Encapsulate Field

Rename:

Rename用來改變一個(gè)Java元素的名字。雖然你可以手工改變Java文件Java元素的名字,但是這樣不能自動更新所有引用它們的文件或Java元 素。你必須在項(xiàng)目中搜索文件然后手工替換這些引用。很可能你就會漏掉一個(gè)或者改錯一個(gè)。Rename重構(gòu)會智能的更新所有有此引用的地方。

有時(shí)候,Java元素的名字不是很明了,或者它的功能已經(jīng)改變了。為了保持代碼的可讀性,該元素的名字也要更新。使用Rename重構(gòu),能夠十分快捷的更新元素的名字和所有引用它的地方。

要為一個(gè)Java元素改名,在包瀏覽視圖或大綱視圖選中該元素,從重構(gòu)菜單中選擇Rename項(xiàng),或者使用快捷鍵Alt+Shift+R。Rename對 話框會出現(xiàn)。在這里添入新的名字,選擇是否更新該元素的引用。點(diǎn)擊預(yù)覽按鈕,會打開預(yù)覽窗口,在這里,你可以看到那些內(nèi)容會被改變。點(diǎn)擊OK按鈕,重構(gòu)結(jié) 束。

Move

Move和Rename很相似。它用來把元素從一個(gè)位置移動到另一個(gè)位置。它主要用來將類從一個(gè)包移動到另一個(gè)包。選中要移動的元素,從重構(gòu)菜單中選擇 Move,或者使用快捷鍵,Alt+Shift+V,在彈出窗口中選擇要移動的目的地。你仍然可以用預(yù)覽功能檢查一下有什么改變,也可以按OK按鈕直接讓 其生效。

Change Method Signature

更改方法簽名能夠改變參數(shù)名,參數(shù)類型,參數(shù)順序,返回類型,以及方法的可見性。也可以添加,刪除參數(shù)。

要執(zhí)行此重構(gòu),選擇要重構(gòu)的方法,選中重構(gòu)菜單的更改方法簽名項(xiàng),會出現(xiàn)更改方法簽名對話框。

在此對話框中選擇方法的修飾詞,返回類型,參數(shù)。參數(shù)的添加,修改,移動,刪除可以通過右邊的按鈕控制。當(dāng)添加新的參數(shù)時(shí),會自動賦予默認(rèn)值。凡是調(diào)用此方法的地方都會用此默認(rèn)值作為參數(shù)輸入。

改變方法簽名可能在方法中導(dǎo)致問題,如果有問題,當(dāng)你點(diǎn)擊預(yù)覽或OK時(shí),會被標(biāo)記出來。

Move Members Type to New File

此重構(gòu)將嵌套類轉(zhuǎn)為一個(gè)單獨(dú)類。將會創(chuàng)建一個(gè)新的Java文件包含此嵌套類。選中要重構(gòu)的類,在重構(gòu)菜單上選擇Move Member Type to New File項(xiàng),在彈出的對話框中添入要創(chuàng)建的實(shí)例的名字。

Push Down

此重構(gòu)將算中的方法和成員從父類中移動到它的直接子類中,所有下推的方法都可選作為一個(gè)抽象方法留在父類中。下推重構(gòu)對于重新構(gòu)建項(xiàng)目設(shè)計(jì)十分有用。

選擇若干方法或成員,從重構(gòu)菜單中選擇下推項(xiàng),彈出下推對話框。

在此對話框中,可以分別選擇方法或成員,所有選中元素都會移動到當(dāng)前類的子類中。當(dāng)點(diǎn)擊Add Required按鈕時(shí),所有已選擇元素所必需的元素也會自動選上,此行為并不能保證所有必須的元素都能自動選中,還是需要人工確認(rèn)。當(dāng)有方法被選中時(shí), 編輯按鈕就會可用,點(diǎn)擊編輯按鈕,彈出編輯對話框。在其中可以選擇為選中方法在當(dāng)前類中遺留抽象方法,還是在當(dāng)前類中刪除這些方法。雙擊一天選中的方法, 也可以打開編輯對話框。在方法的Action列點(diǎn)擊,會出現(xiàn)一個(gè)下拉列表,可以在其中選擇遺留抽象方法還是在當(dāng)前類中刪除方法。按回車鍵確認(rèn)編輯結(jié)果。

Pull Up

上移與下推類似,也是在類之間移動方法和成員。上移將方法或成員從一個(gè)類移動到它的一個(gè)父類中。選中若干個(gè)方法或成員,在重構(gòu)菜單中選擇上移項(xiàng),上移向?qū)яR上會出現(xiàn)。

在選擇目標(biāo)類多選框中,列出了當(dāng)前類繼承的所有父類。你只能將方法或成員移動到它們其中的一個(gè)里面。

如果在選中方法的Action列,被設(shè)置成在目標(biāo)類中聲明抽象方法,那么在目標(biāo)類的非抽象子類中創(chuàng)建必須的方法選項(xiàng)變?yōu)榭蛇x。當(dāng)它選中時(shí),目標(biāo)類的所有子類,如果它們中沒有選中的方法,則會為它們創(chuàng)建選中的方法。

和在下推中一樣,選擇多個(gè)方法,點(diǎn)擊編輯按鈕,或者雙擊一個(gè)方法,都會打開編輯成員對話框。其中有兩個(gè)選項(xiàng),上移和在目標(biāo)類中聲明抽象方法。上移只是簡單 的復(fù)制方法到到父類中,并提供選擇是否在當(dāng)前類中刪除該方法。在目標(biāo)類中聲明抽象方法會在父類中創(chuàng)建一個(gè)選中方法的抽象方法,如果父類不是抽象類則置為抽 象類,***選中方法留在當(dāng)前類中。和在下推中一樣,也可以點(diǎn)擊Action列,可以在出現(xiàn)的下拉列表中選擇。

如果方法的Action列選為上移,在下一步的向?qū)е?,將會要求你選擇是否在當(dāng)前類中刪除這些方法,選中的方法會在當(dāng)前類中被刪除。

在向?qū)У娜我庖徊蕉伎梢园赐瓿砂粹o,結(jié)束重構(gòu)操作,此時(shí)按照默認(rèn)規(guī)則進(jìn)行重構(gòu)。

Extract Interface

提煉接口可以從一個(gè)存在的類中創(chuàng)建一個(gè)接口。你可以選擇在接口中包含著個(gè)類的那些方法。選中一個(gè)類,從重構(gòu)菜單選擇提煉接口項(xiàng),就可以打開提煉接口對話框。

這此對話框中添入接口的名字,選擇希望包含的方法,在這個(gè)列表里面只列出了公共方法。選中改變對類[當(dāng)前類名]的應(yīng)用為對接口的引用選擇框,將把所有對當(dāng)前類的引用更新為對此接口的引用。

Generalize Type

泛化類型重構(gòu)可以將一個(gè)聲明對象的類型改變?yōu)樗某?,選擇變量,參數(shù),對象成員,方法返回類型,然后選擇重構(gòu)菜單的泛化類型項(xiàng)。在打開的泛化類型對話框,選擇希望的新類型,然后點(diǎn)擊完成按鈕,結(jié)束重構(gòu)。

Use Supertype Where Possible

使用超類會將對一個(gè)特定類型的引用改變?yōu)閷λ某惖囊?。選擇一個(gè)類,選中重構(gòu)菜單的使用超類項(xiàng),會打開使用超類對話框。選中希望的超類類型,點(diǎn)擊完成按鈕完成重構(gòu)。重構(gòu)后,instanceof 表達(dá)式也會做相應(yīng)的替換。

Inline

內(nèi)聯(lián)是用代碼或值來取代調(diào)用方法的地方,靜態(tài)final對象成員,或局部變量。比如說,如果你內(nèi)聯(lián)一個(gè)方法調(diào)用,這個(gè)調(diào)用的地方就會被替換為該方法體。要 內(nèi)聯(lián)一個(gè)方法,靜態(tài)final對象成員,局部變量,選中這些元素,在重構(gòu)菜單中選擇內(nèi)聯(lián)項(xiàng),或者使用快捷鍵Alt + Ctrl + I。在隨后打開的內(nèi)聯(lián)對話框,你可以選擇是否要內(nèi)聯(lián)所有的調(diào)用,或者是選擇的調(diào)用。如果選擇所有調(diào)用,你還可以選擇是否刪除聲明本身。

Extract Method

如果方法中含有過多特定的操作,方法太長,或者其中的某段代碼被多次使用,這時(shí),可以用提煉方法重構(gòu)將這部分代碼提取到單獨(dú)的方法中。在Eclipse中應(yīng)用此重構(gòu)方便快捷。

選中要提煉的代碼段,從重構(gòu)菜單中選擇提煉方法項(xiàng),或者使用快捷鍵Alt + Shift + M。

在提煉方法對話框中,輸入新方法的名字,選擇修飾詞,選擇是否讓新方法拋出運(yùn)行時(shí)異常。在底部提供了新方法的預(yù)覽。

Extract Local Variable

使用一個(gè)變量來代替一個(gè)表達(dá)式有很多好處。如果表達(dá)式在多處被使用,這樣能夠提高性能,而且也提高了代碼的可讀性。要把一個(gè)表達(dá)式提煉為局部變量,選擇要提煉的表達(dá)式,從重構(gòu)菜單中選擇提煉局部變量項(xiàng),或者使用快捷鍵Alt + Shift + L。

在提煉局部變量對話框中輸入新變量的名字,選擇是否要替換所有的表達(dá)式,是否使此變量為final。在對話框的底部提供變量的預(yù)覽。

Extract Constant

提煉常量與提煉局部變量很相似,唯一的區(qū)別是提煉常量重構(gòu)可以選擇提煉出的常量的修飾詞,而且此常量將作為類的成員變量。

Introduce Parameter

介紹參數(shù)重構(gòu)在方法中創(chuàng)建新的參數(shù),然后用此新參數(shù)取代局部變量或者成員變量的實(shí)例。要是用此重構(gòu),選中方法中一個(gè)成員變量或局部變量的引用,然后從重構(gòu)菜單中選擇介紹參數(shù)項(xiàng)。

Introduce Factory

工廠是用來創(chuàng)建新對象,返回新創(chuàng)建對象的方法。你可以選擇一個(gè)類的構(gòu)造方法,從重構(gòu)菜單中選擇介紹工廠項(xiàng),應(yīng)用此重構(gòu),為此類創(chuàng)建工廠方法。

在介紹工廠對話框,輸入工廠方法的名字和需要工廠方法創(chuàng)建的對象的名字。選擇構(gòu)造方法的修飾詞是否為私有。

點(diǎn)擊OK按鈕后,在指定的類中會出現(xiàn)此指定工廠方法。此方法創(chuàng)建一個(gè)當(dāng)前類的實(shí)例,然后返回此實(shí)例。

Convert Local Variable to Field

轉(zhuǎn)換局部變量為成員變量重構(gòu),將方法內(nèi)的變量聲明移動到方法所在類中,使該變量對整個(gè)類可見。選擇一個(gè)局部變量,從重構(gòu)菜單中選擇轉(zhuǎn)換局部變量為成員變量項(xiàng),隨后打開配置的對話框。

在此對話框中,添入成員變量的名字,選擇修飾詞,選擇在哪里實(shí)例化此成員變量。隨后的聲明為靜態(tài),聲明為final 選擇項(xiàng)是否可以使用,取決于實(shí)例化位置的選擇情況。

Encapsulate Field

要正確的實(shí)踐面向?qū)ο缶幊蹋瑧?yīng)該將成員變量的修飾詞置為私有,提供相應(yīng)的訪問器來訪問這些成員變量。但是這些操作很煩瑣。如果使用了封裝成員變量重構(gòu),則十分方便。選擇一個(gè)成員變量,從重構(gòu)菜單中選擇封裝成員變量項(xiàng)。

在封裝局部變量對話框中,添入Getter, Setter方法的名字,選擇新方法在哪個(gè)方法后出現(xiàn)。選擇合適的修飾詞。應(yīng)用了此重構(gòu)會創(chuàng)建兩個(gè)新方法,將此成員變量的修飾詞置為私有,將對此成員變量的引用改變?yōu)閷π路椒ǖ囊谩?/P>

重構(gòu)項(xiàng)列表:

下表從Eclipse幫助中提取,列出了各種重構(gòu)支持的Java資源類型,對應(yīng)的快捷鍵。

名字 可應(yīng)用的Java元素 快捷鍵

Undo 在一次重構(gòu)后可執(zhí)行 Alt + Shift + Z

Redo 在一次撤銷重構(gòu)后可執(zhí)行 Alt + Shift + Y

Rename 對方法,成員變量,局部變量,方法參數(shù),對象,類,包,源代碼目錄,工程可用。 Alt + Shift + R

Move 對方法,成員變量,局部變量,方法參數(shù),對象,類,包,源代碼目錄,工程可用。 Alt + Shift + V

Change Method Signature 對方法可用。 Alt + Shift + C

Convert Anonymous Class to Nested 對匿名內(nèi)部類可用。

Move Member Type to New File 對嵌套類可用。

Push Down 對同一個(gè)類中成員變量和方法可用。

Pull Up 對同一個(gè)類中成員變量和方法,嵌套類可用。

Extract Interface 對類可用。

Generalize Type 對對象的聲明可用。

Use Supertype Where Possible 對類可用。

Inline 對方法,靜態(tài)final類,局部變量可用。 Alt + Shift + I

Extract Method 對方法中的一段代碼可用。 Alt + Shift + M

Extract Local Variable 對選中的與局部變量相關(guān)的代碼可用。 Alt + Shift + L

Extract Constant 對靜態(tài)final類變量,選中的與靜態(tài)final類變量相關(guān)的代碼可用。

Introduce Parameter 對方法中對成員變量和局部變量的引用可用。

Introduce Factory 對構(gòu)造方法可用。

Convert Local Variable to Field 對局部變量可用。 Alt + Shift + F

Encapsulate Field 對成員變量可用。

這些重構(gòu)易于使用,可以確保代碼重構(gòu)更加方便安全。而且可以自動生成代碼以提高生產(chǎn)率。

某些重構(gòu)改變了某些類的結(jié)構(gòu),但沒有改變項(xiàng)目中其他類的結(jié)構(gòu),如下推,上移重構(gòu)。這時(shí),就要確保項(xiàng)目中所有對改變元素的引用都要被更新。這也是為什么要有 一個(gè)好的測試套。同時(shí),你也要更新測試套中的對改變元素的引用。所以說,重構(gòu)和單元測試的有機(jī)結(jié)合對于軟件開發(fā)是多么的重要。

【編輯推薦】

  1. Eclipse啟動新計(jì)劃:通用的SOA平臺
  2. 下一代Eclipse平臺:Eclipse e4全面介紹
  3. 下一代Eclipse平臺7月推出 搶先版已可下載
  4. Eclipse插件大全介紹及下載地址
責(zé)任編輯:金賀 來源: JavaEye博客
相關(guān)推薦

2009-08-13 18:00:48

Eclipse重構(gòu)功能擴(kuò)展點(diǎn)

2021-08-03 08:13:48

重構(gòu)API代碼

2010-08-16 13:17:47

DIV+CSS

2009-03-27 15:35:49

SwordfishEclipseESB

2011-11-21 15:12:54

Java斷點(diǎn)Eclipse

2010-05-31 09:47:40

2021-07-08 06:08:54

架構(gòu)重構(gòu)開發(fā)

2011-09-13 17:03:16

Eclipse And

2009-06-15 16:35:44

Spring IDEEclipse插件

2009-06-04 20:26:45

2013-09-10 16:02:59

Elipse編輯器

2010-12-23 13:35:05

面向過程

2010-06-23 15:29:52

Eclipse 3.6Java

2009-06-03 16:33:53

安裝jdk tomcaeclipse配置

2009-07-17 13:17:48

部署Eclipse R

2013-07-03 17:41:10

eclipse

2012-05-15 01:16:19

開發(fā)重構(gòu)Java

2010-09-03 11:15:02

CHAPppp

2010-05-18 13:53:34

Subversion插

2012-07-11 13:54:42

網(wǎng)頁重構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號