9

我想通過將某個類拆分爲其他幾個類來重新考慮一些代碼。 要這樣做,我想將舊類中已有的一些方法移到新類中。 但是,這些方法正在很多地方被引用,手動更新引用似乎令人厭煩。那麼有什麼方法可以移動方法以及在eclipse中更新它們的引用嗎?如何將一個方法從一個類從一個類移動到另一個類當兩個類完全不相關

+2

雖然它很難說什麼沒有看到代碼,我想繼承應解決您的目的 –

+0

,但我不想繼承。一旦創建了新課程,我將刪除舊課程。 –

+0

我會移動參考,然後遍歷所有顯示錯誤的文件,並按Ctrl + Shift + O自動組織導入。 – Meredith

回答

1

如果您使用任何標準IDE(例如EclipseIntelliJ IDEA),它們都有一個簡單的菜單選項來執行此操作(取決於代碼的組織方式)。

如果您轉到每種方法並右鍵單擊其名稱,菜單中會出現一個「重構」選項,這會導致「移動」選項。選擇它並按照說明進行操作。

以上對於靜態方法特別容易。對於非靜態的,你可能需要做子類化,或者將引用傳遞給適當的對象。即便如此,「重構 - >移動」選項是一個好的開始。

+0

試過「重構 - >移動」,但不適合我。它說沒有目標存在移動。我認爲一些關係是必需的B/W類 –

+0

目標類必須可以從要移動的方法內訪問,並符合許多其他規則(例如,不要調用super關鍵字)。很難猜測你的代碼是什麼樣的。如果它全部在1個類中,則創建目標類,從原始類中的這些類聲明一些虛擬變量,然後再次嘗試重構 - >移動路徑。 – PNS

+0

我試過..方法被移動,但引用didnt ...例如.... Class1有方法abc()被移動到Class2。現在方法已移動,但使用此方法的類3仍將其用作class1Obj.abc()而不是class2obj.abc()。 –

4

如果你使用eclipse IDE,那麼重構會幫助你。

enter image description here

8

我會做這種方式:

  1. 確保您的測試工作,並重新分解覆蓋的代碼。如果你沒有測試寫測試。他們是你的安全繩。
  2. 使用重新分解模式提取超類來創建您想要移動某些方法的新類。
  3. 使用重新分解模式上拉方法將方法和它們需要的變量一起移動到超類。現在你會看到你想移動的方法和實例變量是否依賴於你不想移動的其他方法。如果是這樣,你必須首先打破這種依賴關係。
  4. 查找應該使用新提取的類而不是「舊」類並將其重寫到新提取的類的所有客戶端代碼。
  5. 刪除兩個類之間的「擴展」關係。現在客戶端代碼應該可以工作,否則你錯過了一些東西

另外一本好書,學習如何運用再保模式是Working Effectively with Legacy Code

1

它有任何你滿意

package com.hussi.stackOverFlow; 
class ClassOne { 

    public void methodInClassOne(String stringParam) 
    { 
     ClassTwo classTwoObj = new ClassTwo(); 
     classTwoObj.methodInClassTwo(stringParam); 
    } 

} 


class ClassTwo { 

    public void methodInClassTwo(String stringParam) 
    { 
     System.out.println(stringParam); 
    } 

} 


public class ClassThree { 

    public static void main(String[] args) 
    { 
     ClassOne objClassOne = new ClassOne(); 
     // calling method of class two in class one 
     objClassOne.methodInClassOne("pass this String value"); 

    } 

} 
1
  1. 複製的方法到新類的。
  2. 將舊類中的方法體替換爲新類中的調用。
  3. 內聯舊方法。

這就是你需要的。這可能不是那麼簡單,因爲在步驟1和2中,您可能需要添加參數和/或使該方法成爲靜態,但這是如何做到這一點的本質。

3

我會告訴你我遵循的過程。 考慮這樣的代碼:

public class GodClass { 
    public someInstanceMethodToMove() { 
     // some code 1 
    } 

    public static someStaticMethodToMove() { 
     // some code 2 
    } 

    public static void main(String[] args) { 
     GodClass c = ...; 
     c.someInstanceMethodToMove(); 
     GodClass.someStaticMethodToMove(); 
    } 
} 

創建新的類:

public class SingleResponsibilityClass { 
} 

靜態方法可以通過使用Eclipse的Refactor>Move...重構由普拉巴卡蘭描述被直接移動到SingleResponsibilityClass

public class GodClass { 
    public someInstanceMethodToMove() { 
     // some code 1 
    } 

    public static void main(String[] args) { 
     GodClass c = ...; 
     c.someInstanceMethodToMove(); 
     SingleResponsibilityClass.someStaticMethodToMove(); 
    } 
} 

public class SingleResponsibilityClass { 
    public static someStaticMethodToMove() { 
     // some code 2 
    } 
} 

對於實例方法,該過程稍微複雜一些。參見下文。

解壓出來的someInstanceMethodToMove()的方法,讓我們將其命名爲someInstanceMethodToMove2()

public class GodClass { 
    public someInstanceMethodToMove() { 
     someInstanceMethodToMove2(); 
    } 

    private someInstanceMethodToMove2() { 
     // some code 1 
    } 

    // ... 
} 

使用SingleResponsibilityClass在原來的方法:

public class GodClass { 
    public someInstanceMethodToMove() { 
     someInstanceMethodToMove2(new SingleResponsibilityClass()); 
    } 

    private someInstanceMethodToMove2(SingleResponsibilityClass obj) { 
     // some code 1 
    } 

    // ... 
} 

注:重要的是SingleResponsibilityClass是的參數實例方法移動,否則Eclipse不會將其移動到此類型。 從那裏,右鍵單擊someInstanceMethodToMove2(),並選擇Refactor>Move...,在嚮導中選擇SingleResponsibilityClass類型,然後應用:

public class GodClass { 
    public someInstanceMethodToMove() { 
     new SingleResponsibilityClass().someInstanceMethodToMove2(); 
    } 

    // ... 
} 

public class SingleResponsibilityClass { 
    private someInstanceMethodToMove2() { 
     // some code 1 
    } 

    public static someStaticMethodToMove() { 
     // some code 2 
    } 
} 

然後右鍵點擊SingleResponsibilityClasssomeInstanceMethodToMove2()方法和Refactor>它RenamesomeInstanceMethodToMove(): 公衆class GodClass public SomeInstanceMethodToMove(){ new SingleResponsibilityClass()。someInstanceMethodToMove(); }

// ... 
} 

public class SingleResponsibilityClass { 
    private someInstanceMethodToMove() { 
     // some code 1 
    } 

    public static someStaticMethodToMove() { 
     // some code 2 
    } 
} 

然後右鍵單擊GodClass'someInstanceMethodToMove()方法和Refactor>Inline

public class GodClass { 
    public static void main(String[] args) { 
     GodClass c = ...; 
     new SingleResponsibilityClass().someInstanceMethodToMove(); 
     SingleResponsibilityClass.someStaticMethodToMove(); 
    } 
} 

public class SingleResponsibilityClass { 
    private someInstanceMethodToMove() { 
     // some code 1 
    } 

    public static someStaticMethodToMove() { 
     // some code 2 
    } 
} 
相關問題