我想通過將某個類拆分爲其他幾個類來重新考慮一些代碼。 要這樣做,我想將舊類中已有的一些方法移到新類中。 但是,這些方法正在很多地方被引用,手動更新引用似乎令人厭煩。那麼有什麼方法可以移動方法以及在eclipse中更新它們的引用嗎?如何將一個方法從一個類從一個類移動到另一個類當兩個類完全不相關
回答
如果您使用任何標準IDE(例如Eclipse
或IntelliJ IDEA
),它們都有一個簡單的菜單選項來執行此操作(取決於代碼的組織方式)。
如果您轉到每種方法並右鍵單擊其名稱,菜單中會出現一個「重構」選項,這會導致「移動」選項。選擇它並按照說明進行操作。
以上對於靜態方法特別容易。對於非靜態的,你可能需要做子類化,或者將引用傳遞給適當的對象。即便如此,「重構 - >移動」選項是一個好的開始。
試過「重構 - >移動」,但不適合我。它說沒有目標存在移動。我認爲一些關係是必需的B/W類 –
目標類必須可以從要移動的方法內訪問,並符合許多其他規則(例如,不要調用super關鍵字)。很難猜測你的代碼是什麼樣的。如果它全部在1個類中,則創建目標類,從原始類中的這些類聲明一些虛擬變量,然後再次嘗試重構 - >移動路徑。 – PNS
我試過..方法被移動,但引用didnt ...例如.... Class1有方法abc()被移動到Class2。現在方法已移動,但使用此方法的類3仍將其用作class1Obj.abc()而不是class2obj.abc()。 –
如果你使用eclipse IDE,那麼重構會幫助你。
我會做這種方式:
- 確保您的測試工作,並重新分解覆蓋的代碼。如果你沒有測試寫測試。他們是你的安全繩。
- 使用重新分解模式提取超類來創建您想要移動某些方法的新類。
- 使用重新分解模式上拉方法將方法和它們需要的變量一起移動到超類。現在你會看到你想移動的方法和實例變量是否依賴於你不想移動的其他方法。如果是這樣,你必須首先打破這種依賴關係。
- 查找應該使用新提取的類而不是「舊」類並將其重寫到新提取的類的所有客戶端代碼。
- 刪除兩個類之間的「擴展」關係。現在客戶端代碼應該可以工作,否則你錯過了一些東西
另外一本好書,學習如何運用再保模式是Working Effectively with Legacy Code
它有任何你滿意
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和2中,您可能需要添加參數和/或使該方法成爲靜態,但這是如何做到這一點的本質。
我會告訴你我遵循的過程。 考慮這樣的代碼:
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
}
}
然後右鍵點擊SingleResponsibilityClass
「someInstanceMethodToMove2()
方法和Refactor
>它Rename
到someInstanceMethodToMove()
: 公衆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
}
}
- 1. 在Python中將「從一個類」移動到另一個類
- 2. 試圖將變量從一個類移動到另一個類
- 3. 將對象從一個類移動到另一個類(Java)
- 4. 如何從一個類調用方法到另一個類
- 5. 如何調用從一個類到另一個類的方法
- 6. 將方法從一個類複製到另一個類
- 7. 將所有方法從一個類複製到另一個類
- 8. 將布爾方法從一個類傳遞到另一個類
- 9. 如何從另一個類調用一個類的方法?
- 10. 如何從另一個類中的一個類調用方法
- 11. 如何從一個類中調用另一個類的方法?
- 12. 如何從另一個類中的一個類調用方法
- 13. 如何從一個類調用另一個類的方法?
- 14. 如何將NSMutableArray從一個類傳遞到另一個類
- 15. 如何將對象從一個類調用到另一個類
- 16. 如何將值從一個類傳遞到另一個類?
- 17. 如何將值從一個類傳遞到另一個類GUI
- 18. 如何將NSURL從一個類傳遞到另一個類?
- 19. 如何將變量從一個類傳遞到另一個類?
- 20. 如何將數據從一個類傳遞到另一個類?
- 21. 如何將數據從一個類添加到另一個類
- 22. 如何將信息從一個類傳遞到另一個類
- 23. 如何將值從一個類傳遞到另一個類
- 24. 如何將數據從一個類複製到另一個類
- 25. 從一個類調用方法到另一個類?
- 26. 從另一個類調用一個類
- 27. 將多個LinkedList從一個類傳遞到另一個類 - Java
- 28. 從另一個類調用另一個類和方法
- 29. Xcode - 將變量和相關屬性從一個類移動到另一個
- 30. 如何顯示方法從一個類到另一個類的主要方法
雖然它很難說什麼沒有看到代碼,我想繼承應解決您的目的 –
,但我不想繼承。一旦創建了新課程,我將刪除舊課程。 –
我會移動參考,然後遍歷所有顯示錯誤的文件,並按Ctrl + Shift + O自動組織導入。 – Meredith