標籤:
今天開始對一個別人寫的項目進行最佳化,我先把類之間的關係想好好,開始移動方法,相應的再移動相應的類屬性,改到後面,發現越改越多,基本上改完了所有方法重構就全部完成了,但是改動很大,而且中間沒有測試的機會,一直有錯誤,耦合的太緊密了,沒法一步一步的做,完成了大概一半的樣子,發現做不下去了,即使硬著頭皮做下去出錯的可能太大了,我沒把握重構後不出錯。
沒辦法,又重新checkout了一份代碼,想了下,如果先移動方法,方法中包含了屬性,就要求屬性也進行相應的移動。但是如果只移動屬性,就可以通過如下方法很容易實現移動屬性,而相應的方法還在原來的位置。例如A類的a屬性,移動到B類中,A類的do()方法操作了a。這種情況可以將B類型的一個引用傳給A,把a移動到B類中並提供set/get方法。然後將A類中給a屬性賦值的地方全部替換成b.setA(),相應的擷取a的值的地方替換成b.getA(),這樣就實現了類屬性的移動。完成了這一步,整個程式跟原來是等價的,可以直接驗證。因為沒有修改方法的調用,且邏輯不複雜,故出錯的幾率要小很多。
public class A { private T a; public String do() { a = new T(); System.out.println("a:"+a.getValue()); return a.getValue(); } }class T { private String value;
// setValue/getValue ……}
移動屬性後的結果
public class A { private B b; public String do() { b.setA(new T()); System.out.println("a:"+b.getA().getValue()); return b.getA().getValue(); } }class B { private T a; // setA/getA ……}
如果只是看這個小例子,看不出移動屬性後有什麼好處,但是在一個遺留項目中的某一個類包含多許多不應該在該類中的屬性時,且該類的許多方法都要用到這些屬性時,這樣將屬性移到本來應該的位置中,就能夠清晰每個類的職責,對後面的重構是一個基礎。
重構的體會——類屬性優先移動