<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent

    Vicent's blog
    隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
    數據加載中……

    利用Eclipse進行重構(上)

    重構和單元測試是程序員的兩大法寶,他們的作用就像空氣和水對于人一樣,平凡,不起眼,但是意義深重。預善事,必先利器,本文就介紹怎樣在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???????? Rename
    l???????? Move
    l???????? Change Method signature
    l???????? Convert Anonymous Class to Nested
    l???????? Convert Member Type to New File
    ?
    類型2 類層次結構
    l???????? Push Down
    l???????? Push Up
    l???????? Extract Interface
    l???????? Generalize Type (Eclipse 3)
    l???????? User Supertype Where Possible
    類型3 類內部結構
    l???????? Inline
    l???????? Extract Method
    l???????? Extract Local Variable
    l???????? Extract Constant
    l???????? Introduce Parameter
    l???????? 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。在隨后打開的內聯對話框,你可以選擇是否要內聯所有的調用,或者是選擇的調用。如果選擇所有調用,你還可以選擇是否刪除聲明本身。

    posted on 2006-08-24 15:00 Binary 閱讀(645) 評論(0)  編輯  收藏 所屬分類: Eclipse


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲免费网站在线观看| 国产精品亚洲综合| 亚洲色偷偷偷鲁综合| 亚洲精品专区在线观看| 国产成人亚洲综合无码精品 | 亚洲av日韩片在线观看| 亚洲人成影院在线观看| 亚洲视频免费一区| 亚洲日本VA午夜在线电影| 一区二区三区精品高清视频免费在线播放 | 亚洲&#228;v永久无码精品天堂久久| 亚洲AV日韩AV无码污污网站 | 19禁啪啪无遮挡免费网站| 午夜国产大片免费观看| 亚洲成AV人片一区二区密柚| 青柠影视在线观看免费高清| 久久久久国色AV免费观看性色 | 国内精品免费久久影院| 黄页网站免费在线观看| 国产在线观看免费完整版中文版| 午夜影视日本亚洲欧洲精品一区| 亚洲性色精品一区二区在线| 一级毛片免费不卡在线| 免费视频淫片aa毛片| 亚洲成AV人片在线观看| 国产免费的野战视频| 亚洲国产精品无码久久久蜜芽| AAA日本高清在线播放免费观看| 精品亚洲麻豆1区2区3区| 日韩精品无码免费专区午夜不卡| 亚洲免费精彩视频在线观看| 三年片免费高清版 | 国产小视频免费观看| 久久av免费天堂小草播放| 免费观看a级毛片| 一个人免费观看日本www视频| 青青久在线视频免费观看| 色老头综合免费视频| 亚洲蜜芽在线精品一区| 国产精品国产自线拍免费软件| 中文字幕无码毛片免费看|