Eclipse重構(gòu)功能(Refactor)

Eclipse 重構(gòu)

何為重構(gòu)

重構(gòu),在《重構(gòu),改善既有代碼的設(shè)計》這本經(jīng)典的書中給出了定義,大概就是:在不改變代碼對外的表現(xiàn)的情況下,修改代碼的內(nèi)部特征。說白了,就是我們的測試用例不變,然后我們對既有的代碼的結(jié)構(gòu)進行修改。重構(gòu)在軟件開發(fā)中是經(jīng)常遇到的,也是非常重要的。
當(dāng)項目做到一定程度后,代碼重構(gòu)是必然的。重構(gòu)可以改善既有代碼的可讀性,可擴展性,可維護性。

Eclipse的重構(gòu)

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

常用重構(gòu)方法

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

Rename(重命名)

修改Java元素的名字,包括:類名、變量名、方法名。當(dāng)然你也可以自己手動修改,但是當(dāng)一個元素被多個地方引用到時,那就需要改動很多地方。Eclipse則可以將引用到的地方統(tǒng)統(tǒng)一起改了??旖萱I:Alt+Shift+R。

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


Move(移動)

用來將類從一個包移動到另一個包。當(dāng)然引用的地方也會跟著改。

如圖,選完要移入的包,確認(rèn)即可:


Change Method Signature(修改方法簽名)

這個功能在重構(gòu)時很有用,修改方法簽名包括方法的作用域,返回類型,名稱,入?yún)⒌念愋?、名稱、數(shù)量、順序。而且如果是在接口或父類上改了,它的實現(xiàn)類和子類也會跟著改。需要注意的是,如果增加了一個參數(shù),那么這個方法原來調(diào)用的地方默認(rèn)會傳null,這很可能不是我們想要的。

如圖:

Extract Method(提取方法)

當(dāng)我們的一個方法里面的代碼很長時,我們總是會需要將里面的代碼塊抽取出來,單獨作為一個方法維護?!疤崛》椒ā惫δ芸梢钥焖俜奖愕膶崿F(xiàn)。

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

提取后:

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(轉(zhuǎn)換局部變量為常量)

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

如圖,轉(zhuǎn)換前:

轉(zhuǎn)換后:

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

當(dāng)一個文件中有多個類,或類下面有內(nèi)部類時。我們可以將此類提取出來,創(chuàng)建一個新文件類維護該類。

比如,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(提取接口)

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

比如:提取前,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(提取父類)

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

Push Down(下推)

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

比如:下推前,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(上移)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如何實施重構(gòu) 稍微復(fù)雜的重構(gòu)過程,都是由一系列的基本重構(gòu)手法組成. 《重構(gòu)》一書中針對各種重構(gòu)場景,給出了大量的重...
    MagicBowen閱讀 4,490評論 0 3
  • 人為什么活著?今天看了一篇文章,說是人就是為了活著而活著。很多有不凡經(jīng)歷的人,往往不愿意說起自己的過去,因為太過于...
    哲達閱讀 774評論 4 7
  • 南昌人以“人杰地靈”自居,“人杰地靈”講得通俗一點,就是小伙子們“煞火”,小姑娘們“喀[kie]氣”。 大家都覺得...
    這很南昌閱讀 313評論 0 1
  • 她覺得云南的風(fēng)俗很好,愛她給她一塊溫潤的玉。 不像戒指,聽名字就有一股戾氣。 她覺得很好,他的愛...
    皮皮魯_閱讀 257評論 0 2

友情鏈接更多精彩內(nèi)容