Eclipse重構功能(Refactor)

Eclipse 重構

何爲重構

重構,在《重構,改善既有代碼的設計》這本經典的書中給出了定義,大概就是:在不改變代碼對外的表現的情況下,修改代碼的內部特徵。說白了,就是我們的測試用例不變,然後我們對既有的代碼的結構進行修改。重構在軟件開發中是經常遇到的,也是非常重要的。
當項目做到一定程度後,代碼重構是必然的。重構可以改善既有代碼的可讀性,可擴展性,可維護性。

Eclipse的重構

重構一般都涉及到比較大量的改動。手工重構很容易引起代碼錯誤,如果是編譯問題還比較容易發現,如果是導致運行期問題那就很糟糕。本來是想把代碼重構的更好,最後卻引起生產問題,那是得不償失的。
Eclipse作爲Java開發利器,提供了很多方便重構的功能。能夠爲Java類、成員、方法、代碼塊進行多種類型的自動重構。

常用重構方法

重構Eclipse功能都在“Refactor”菜單下,下面就講解中常用的幾種重構方法。

Rename(重命名)

修改Java元素的名字,包括:類名、變量名、方法名。當然你也可以自己手動修改,但是當一個元素被多個地方引用到時,那就需要改動很多地方。Eclipse則可以將引用到的地方統統一起改了。快捷鍵:Alt+Shift+R

如圖,寫完名字後回車即可:

Move(移動)

用來將類從一個包移動到另一個包。當然引用的地方也會跟着改。

如圖,選完要移入的包,確認即可:

Change Method Signature(修改方法簽名)

這個功能在重構時很有用,修改方法簽名包括方法的作用域,返回類型,名稱,入參的類型、名稱、數量、順序。而且如果是在接口或父類上改了,它的實現類和子類也會跟着改。需要注意的是,如果增加了一個參數,那麼這個方法原來調用的地方默認會傳null,這很可能不是我們想要的。

如圖:

Extract Method(提取方法)

當我們的一個方法裏面的代碼很長時,我們總是會需要將裏面的代碼塊抽取出來,單獨作爲一個方法維護。“提取方法”功能可以快速方便的實現。

選中需要提取的代碼塊,如圖,提取前:

提取後:

Extract Local Variable(提取局部變量)

使用一個變量來代替一個表達式有很多好處。如果表達式在多處被使用,這樣能夠提高性能,而且也提高了代碼的可讀性。選擇需要提取爲局部變量的表達式,在彈出框中輸入變量名即可:

比如,提取前:

public String method1(String arg0, String arg1) {
    return "hello " + "world";
}

選中:"hello " + "world",提取後:

public String method1(String arg0, String arg1) {
    String helloWorld = "hello " + "world";
    return helloWorld;
}

Extract Constant(提取常量)

提煉常量與提取局部變量很相似,不過提取出來的是類的static final成員變量。

比如,提取前:

public String method1(String arg0, String arg1) {
    return "hello " + "world";
}

選中:"hello " + "world",提取後:

private static final String HELLO_WORLD = "hello " + "world";

public String method1(String arg0, String arg1) {
    return HELLO_WORLD;
}

Convert Local Variable to Field(轉換局部變量爲常量)

轉換局部變量爲成員變量,將方法內的變量聲明移動到方法所在類中,使該變量對整個類可見。選擇一個局部變量,從重構菜單中選擇轉換局部變量爲成員變量項,隨後打開配置的對話框。在此對話框中,添入成員變量的名字,選擇修飾詞等。

如圖,轉換前:

轉換後:

Move Type to New File(移動類到新的文件)

當一個文件中有多個類,或類下面有內部類時。我們可以將此類提取出來,創建一個新文件類維護該類。

比如,A類和B類都在A.java文件中,我們可以將B類提取出來。提取前:

public class A {

    private String helloWorld = "hello " + "world";

    public String method1(String arg0, String arg1) {
        return helloWorld;
    }
}

class B {
    private String name = "張三";
}

提取後,生成了B.java文件:

Extract interface(提取接口)

顧名思義,就是從這個類中提取出接口。在重構需要抽象時用到。

比如:提取前,A類下有個method1方法。選中method1方法,彈出“Extract interface”對話框,填入接口名。

提取後:

public interface InterfaceA {
    String method1(String arg0, String arg1);
}

public class A implements InterfaceA {

    @Override
    public String method1(String arg0, String arg1) {
        return "hello " + "world";
    }
}

Extract Superclass(提取父類)

提取父類和提取接口類似,當我們需要抽象出父類或抽象類時用。

Push Down(下推)

此功能可以將類中的方法和成員從父類中移動到它的子類中,在彈出的對話框中選擇哪些方法下推到子類中。下推重構對於重新構建項目設計十分有用。

比如:下推前,B類繼承A類,我們可以將A類下的method1方法下推到B類中。

public abstract class A {

    protected String helloWorld = "hello " + "world";

    public String method1(String arg0, String arg1) {
        return helloWorld;
    }
}

public class B extends A {

}

下推後:

public abstract class A {

    protected String helloWorld = "hello " + "world";
}

public class B extends A {

    public String method1(String arg0, String arg1) {
        return helloWorld;
    }

}

Push Up(上移)

上移與下推類似,也是在類之間移動方法和成員。上移將方法或成員從一個類移動到它的一個父類中。

更多幹貨,可訪問我的個人網站:https://zhangzw.com,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章