0

delete(object)削除するオブジェクトに応じて異なるコードを実行するメソッドがあります。

class MyService {

   void delete(Object obj) {
     if (obj instanceof Foo) {
         //execute some foo deletion logic
     } 
     if (obj instanceof Bar) {
         //execute some bar deletion logic
     }
     //if... and so on
   }
}

設計の観点から、instanceofここでチェックを回避するにはどうすればよいですか? delete()オブジェクトは自分自身を削除する方法を認識できないため、実装のすべてにメソッドを導入することはできません。

他には何があるの?

4

3 に答える 3

5

サブクラス化メカニズムを使用することもできます (ジェネリックにすることもできます)。

class MyService<T> {
   void delete(T obj) {
     // Only the delete logic, but nothing specific for any type
   }
}

次に、Foo のサブクラスを作成します。

class MyFooService extends MyService<Foo> {
    void delete(Foo obj) {
        //execute some foo deletion logic
        // finally, invoke super class as it knows how to do the real delete action
        super.delete(obj);
    }
}

このように、Foo固有のロジックは にMyFooServiceあり、Fooロジックは別のクラスに入れられます。追加のボーナスとして、これにより、十分に単体テストできるクラスが提供されます。

于 2013-03-31T16:54:26.570 に答える
0

IMOは、DeleteTypeを表す列挙型を作成する方が良いと言います

public enum DeleteType {

Foo, Bar  //..... }

MyServicedelete メソッドでは、次のように 2 つの引数を取ることができます。

void delete(DeleteType type, Object object) {
switch(type) {
case Foo:
 //Deletion of Foo objects....
 break;
case Bar:
//Deletion of Bar objects....
 break;
 ....
}
}

deleteメソッドの署名をそのままにしたい場合は、 をそれ自体typeの中に格納することができます(のクラスを contract( ) に準拠させることにより、 をそのにします)objobjinterfacereturntype

于 2013-03-31T16:58:03.697 に答える