2016-11-26 41 views
2

我有一個本質上是數據庫上的大型數據對象的包裝類。看起來像這樣:爲另一個類做事情的類

public class ServerWrapper { 
    private DataObject object; 

    public ServerWrapper(DataObject object) { 
     this.object = object; 
    } 

    public void doAThing1() { 
     getSomeStuff(); 
     // do stuff that modifies this object 
    } 

    public void doAThing2() { 
     getSomeStuff(); 
     // do other stuff that modifies this object 
    } 

    private List<> getSomeStuff(); 
} 

這是問題:有很多很多「doathing」方法。其中一些非常大。另外,它們中的很多還在ServerWrapper中使用其他私有方法。理想情況下,我想將這些公共方法分解爲他們自己的類,如ThingDoer1,ThingDoer2,但我不知道這樣做的最佳方式。

事情是這樣的:

public class ThingDoer1{ 
    public void doAThing1(ServerWrapper wrapper) { 
     wrapper.getSomeStuff(); 
     // do the thing to wrapper 
    } 

似乎很臭;它與ServerWrapper(ServerWrapper調用它並調用ServerWrapper)緊密耦合,並且它需要對其給定的對象(這是壞的)執行任何操作,或者創建副本,執行操作,然後返回副本。

真的,我想我正在尋找的是一組局部類的,只是爲了一類更易於管理的這個怪物;但我使用的是Java,但不支持它。

有沒有一些標準的做法來打破這樣的大班?提前致謝!

編輯: 包裝紙的要點是服務器側功能添加到數據庫對象。例如,這個對象需要「過期」。這需要獲取數據庫表的所有關聯,然後對對象和這些關聯進行多次驗證,然後在對象及其關聯中設置一堆字段,然後在對象和所有這些關聯上調用數據庫更新。將所有代碼放在ServerWrapper中對我來說是有意義的,但是有幾個相當複雜的操作,比如需要發生,所以類本身變得相當大。

+3

你的要求太籠統。這個包裝的目的是什麼?它更像一個裝飾者嗎?一個適配器?你爲什麼需要它? – chrylis

+0

@chrylis謝謝,請參閱我的編輯。 – Evan

+0

這種事情聽起來像一個非常複雜的類,沒有作爲裝飾者的建築業務。我通常會說,如果您手動過期對象,則將過期過程作爲單獨的服務編寫,然後按某種計劃啓動。 – chrylis

回答

2

不過,這並不需要進行緊密結合ServerWrapper

public class ThingDoer1() { 
    public void doAThing1(List<> theList) { 
     // do the thing to object 
    } 

然後在ServerWrapper

public void doAThing1() { 
    new ThingDoer1().doAThing1(getSomeStuff()); 
} 

我會走的更遠也許:

public class ThingDoer1() { 
    private final List<> theList; 
    public ThingDoer1(List<> theList) { 
     this.theList = theList; 
    } 
    public void doAThing() { 
     // do the thing to object 
    } 
} 

ServerWrapper

public void doAThing1() { 
    new ThingDoer1(getSomeStuff()).doAThing(); 
} 

這更是一個Replace Method with Method Object refactor的。

+0

我在我的spring應用程序中做了類似的事情......我創建了一個名爲IComponentBA的接口,並在我的控制器中創建了這些對象的列表,以便在需要時可以激怒並執行.... – Jay