利用Eclipse進行重構(上)

來源:互聯網
上載者:User
重構和單元測試是程式員的兩大法寶,他們的作用就像空氣和水對於人一樣,平凡,不起眼,但是意義深重。預善事,必先利器,本文就介紹怎樣在Eclipse中進行重構。 本文介紹了Eclipse支援的重構種類,它們的含義,以及怎樣重構。本文同時也可以作為學習重構知識的快速手冊。 什麼是重構重構是指在保持程式的全部功能的基礎上改變程式結構的過程。重構的類型有很多,如更改類名,改變方法名,或者提取代碼到方法中。每一次重構,都要執行一系列的步驟,這些步驟要保證代碼和原代碼相一致。 為什麼重構很重要             手工重構時,很容易在代碼中引入錯誤,例如拼字錯誤或者漏掉了重構的某一步。為了防止引入錯誤,在每次重構前後,都要執行充分的測試。你可能會好奇重構是否是值得的。重構的理由很多。你可能想要更新一段代碼很爛的程式。或者最初的設計隊伍都不在了,現在隊伍中每人瞭解這些程式。為了更新,你必須要重新設計構建程式來滿足你的需求。另一個原因是原來的設計無法使你將新的特性添加進去。為了添加進去,你要重構這些代碼。第三個原因是一個自動重構的工具可以為你自動產生代碼,例如Eclipse中的重構功能。使用重構,你可以在重寫盡量少的代碼和仍保持軟體功能的同時,使代碼的邏輯性更好。  測試在重構時,測試是十分重要的。應為重構改變了代碼的結構,你要保證重構後代碼的功能沒有被改變。手工重構時,一個好的測試套是必須的。使用自動重構工具是,測試也是必要的,但不需要很頻繁,應為自動重構工具不會產生手工重構時的那些錯誤,如拼字錯誤。在Eclipse中可以使用JUnit方便的為程式建立測試代碼,具體方法不在本文描述。  Eclipse中的重構JDT,Eclipse中的Java外掛程式,能夠對Java項目,類,或成員進行多種類型的自動重構。可以採取多種方法快速的為Java項目中的某個元素進行重構。為某些元素進行重構的前提是你必須選中他們。你可以在多個視圖中選擇這些元素,像大綱視圖或包瀏覽視圖。可以按住Ctrl或Shift鍵,在視圖中選擇多個元素。另外一種選擇的方法是使該元素的編輯區高亮顯示,或者把滑鼠定位到來源程式檔案。在選中希望重構的元素後,可以從重構菜單的下拉項選擇重構,也可以從按右鍵後快顯功能表中選擇重構子功能表。同時,Eclipse還提供了重構的快速鍵操作。某些重構可以應用在任意元素上,有些則只能用在特定類型的元素上,如類或方法。在本文的最後的表格中,列出了重構能夠應用的元素類型,以及重構的快速鍵。在Eclipse中,所有的重構都能夠在正式執行之前預覽一下。在重構對話方塊中點擊“預覽”按鈕,可以查看所有將要被改變的地方。唯一沒有預覽按鈕的的重構是Pull Up,在它的重構嚮導中,到最後,預覽面板總會出現。可以將其中的個別變化反選掉,這樣這些改變就不會生效。  撤銷和重做       在重構菜單中有撤銷和重做項。他們和編輯菜單中的撤銷重做不同。即使重構改變了很多檔案,編輯菜單中的撤銷重做只會更改當前檔案。重構菜單中的撤銷和重做則會對一次重構的所有檔案進行撤銷和重做操作。但是在使用時,它們有一定的限制。重構後,無論重構改變了檔案與否,如果任一個檔案被另外改變而且儲存了,你就無法撤銷或重做這個重構。假如一個檔案在重構中被修改了,然後又被編輯了,但是還沒有儲存,這時就會有錯誤資訊提示,如果你想要撤銷或重做該重構,必須撤銷未儲存的檔案。只要注意到以上的限制條件,你就可以隨心所欲的對重構進行撤銷或重做。你甚至能夠編譯,運行你的程式測試一下,然後再撤銷該重構,只要你沒有改變並儲存任何檔案。 Eclipse中的重構類型       如果你看一下Eclipse的重構菜單,可以看到四部分。第一部分是撤銷和重做。其他的三部分包含Eclipse提供的三種類型的重構。第一種類型的重構改變代碼的物理結構,像Rename和Move。第二種是在類層次上改變代碼結構,例如Pull Up和Push Down。第三種是改變類內部的代碼,像Extract Method和Encapsulate Field。這三部分的重構列表如下。 類型1 物理結構l         Renamel         Movel         Change Method signaturel         Convert Anonymous Class to Nestedl         Convert Member Type to New File  類型2 類階層l         Push Downl         Push Upl         Extract Interfacel         Generalize Type (Eclipse 3)l         User Supertype Where Possible類型3 類內部結構l         Inlinel         Extract Methodl         Extract Local Variablel         Extract Constantl         Introduce Parameterl         Introduce Factory l         Encapsulate Field   Rename:       Rename用來改變一個Java元素的名字。雖然你可以手工改變Java檔案Java元素的名字,但是這樣不能自動更新所有引用它們的檔案或Java元素。你必須在項目中搜尋檔案然後手工替換這些引用。很可能你就會漏掉一個或者改錯一個。Rename重構會智能的更新所有有此引用的地方。       有時候,Java元素的名字不是很明了,或者它的功能已經改變了。為了保持代碼的可讀性,該元素的名字也要更新。使用Rename重構,能夠十分快捷的更新元素的名字和所有引用它的地方。       要為一個Java元素改名,在包瀏覽視圖或大綱視圖選中該元素,從重構菜單中選擇Rename項,或者使用快速鍵Alt+Shift+R。Rename對話方塊會出現。在這裡添入新的名字,選擇是否更新該元素的引用。點擊預覽按鈕,會開啟預覽視窗,在這裡,你可以看到那些內容會被改變。點擊OK按鈕,重構結束。 Move       Move和Rename很相似。它用來把元素從一個位置移動到另一個位置。它主要用來將類從一個包移動到另一個包。選中要移動的元素,從重構菜單中選擇Move,或者使用快速鍵,Alt+Shift+V,在快顯視窗中選擇要移動的目的地。你仍然可以用預覽功能檢查一下有什麼改變,也可以按OK按鈕直接讓其生效。  Change Method Signature       更改方法簽名能夠改變參數名,參數類型,參數順序,傳回型別,以及方法的可見度。也可以添加,刪除參數。       要執行此重構,選擇要重構的方法,選中重構菜單的更改方法簽名項,會出現更改方法簽名對話方塊。 在此對話方塊中選擇方法的修飾詞,傳回型別,參數。參數的添加,修改,移動,刪除可以通過右邊的按鈕控制。當添加新的參數時,會自動賦予預設值。凡是調用此方法的地方都會用此預設值作為參數輸入。       改變方法簽名可能在方法中導致問題,如果有問題,當你點擊預覽或OK時,會被標記出來。        Move Members Type to New File       此重構將嵌套類轉為一個單獨類。將會建立一個新的Java檔案包含此嵌套類。選中要重構的類,在重構菜單上選擇Move Member Type to New File項,在彈出的對話方塊中添入要建立的執行個體的名字。         Push Down       此重構將算中的方法和成員從父類中移動到它的直接子類中,所有下推的方法都可選作為一個抽象方法留在父類中。下推重構對於重新構建項目設計十分有用。         選擇若干方法或成員,從重構菜單中選擇下推項,彈出下推對話方塊。                在此對話方塊中,可以分別選擇方法或成員,所有選中元素都會移動到當前類的子類中。當點擊Add Required按鈕時,所有已選擇元素所必需的元素也會自動選上,此行為並不能保證所有必須的元素都能自動選中,還是需要人工確認。當有方法被選中時,編輯按鈕就會可用,點擊編輯按鈕,彈出編輯對話方塊。在其中可以選擇為選中方法在當前類中遺留抽象方法,還是在當前類中刪除這些方法。雙擊一天選中的方法,也可以開啟編輯對話方塊。在方法的Action列點擊,會出現一個下拉式清單,可以在其中選擇遺留抽象方法還是在當前類中刪除方法。按斷行符號鍵確認編輯結果。  Pull Up       上移與下推類似,也是在類之間移動方法和成員。上移將方法或成員從一個類移動到它的一個父類中。選中若干個方法或成員,在重構菜單中選擇上移項,上移嚮導馬上會出現。       在選擇目標類多選框中,列出了當前類繼承的所有父類。你只能將方法或成員移動到它們其中的一個裡面。       如果在選中方法的Action列,被設定成在目標類中聲明抽象方法,那麼在目標類的非抽象子類中建立必須的方法選項變為可選。當它選中時,目標類的所有子類,如果它們中沒有選中的方法,則會為它們建立選中的方法。       和在下推中一樣,選擇多個方法,點擊編輯按鈕,或者雙擊一個方法,都會開啟編輯成員對話方塊。其中有兩個選項,上移和在目標類中聲明抽象方法。上移只是簡單的複製方法到到父類中,並提供選擇是否在當前類中刪除該方法。在目標類中聲明抽象方法會在父類中建立一個選中方法的抽象方法,如果父類不是抽象類別則置為抽象類別,最後選中方法留在當前類中。和在下推中一樣,也可以點擊Action列,可以在出現的下拉式清單中選擇。       如果方法的Action列選為上移,在下一步的嚮導中,將會要求你選擇是否在當前類中刪除這些方法,選中的方法會在當前類中被刪除。       在嚮導的任意一步都可以按完成按鈕,結束重構作業,此時按照預設規則進行重構。  Extract Interface       提煉介面可以從一個存在的類中建立一個介面。你可以選擇在介面中包含著個類的那些方法。選中一個類,從重構菜單選擇提煉介面項,就可以開啟提煉介面對話方塊。       這此對話方塊中添入介面的名字,選擇希望包含的方法,在這個列表裡面只列出了公用方法。選中改變對類[當前類名]的應用為對介面的引用選擇框,將把所有對當前類的引用更新為對此介面的引用。  Generalize Type       泛化類型重構可以將一個聲明對象的類型改變為它的超類,選擇變數,參數,對象成員,方法傳回型別,然後選擇重構菜單的泛化類型項。在開啟的泛化類型對話方塊,選擇希望的新類型,然後點擊完成按鈕,結束重構。  Use Supertype Where Possible       使用超類會將對一個特定類型的引用改變為對它的超類的引用。選擇一個類,選中重構菜單的使用超類項,會開啟使用超類對話方塊。選中希望的超類類型,點擊完成按鈕完成重構。重構後,instanceof 運算式也會做相應的替換。   Inline       內聯是用代碼或值來取代調用方法的地方,靜態final對象成員,或局部變數。比如說,如果你內聯一個方法調用,這個調用的地方就會被替換為該方法體。要內聯一個方法,靜態final對象成員,局部變數,選中這些元素,在重構菜單中選擇內聯項,或者使用快速鍵Alt + Ctrl + I。在隨後開啟的內聯對話方塊,你可以選擇是否要內聯所有的調用,或者是選擇的調用。如果選擇所有調用,你還可以選擇是否刪除聲明本身。 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.