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(上移)
上移與下推類似,也是在類之間移動方法和成員。上移將方法或成員從一個類移動到它的一個父類中。