2016-11-26 10 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と結合する必要はありません:ServerWrapperで次に

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

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

私は春のアプリケーションで同様のことをしました... IComponentBAという名前のインターフェイスを作成し、コントローラのこれらのオブジェクトのリストを作成しました。 – Jay

関連する問題