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,謝謝!