1

アイテムにインデックスを付ける必要があります。このサービスは、同期または非同期を実行する必要があります。

インターフェイスの設計を開始しました

public interface IndexService{
    public void index();
}

2 つの実装 (1 つは非同期インデックス用):

public class AsyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}

もう 1 つは Sync Index に

public class SyncIndex implements IndexService {

    public void index(){
        //... Creates a Thread and index the items
    }

}

しかし、今度は、非同期サービスまたは同期サービスとして実行するためのフラグを持つ IndexService を持つ別の設計があります。

public interface IndexService{
    public void index(int mode);
}

これで、実装はそのフラグに基づいて実行する方法を認識します。

最初のデザインの方が優れていることはわかっていますが、その理由を説明するには長所と短所が必要です。

4

2 に答える 2

1

私は両方と言います。

2 番目の方法を使用する予定であるとします。実装は次のようになります。

public SyncOrAsyncIndex implements IndexService {
public void index(int mode) {
    if(mode == 0) {
        //sync processing code
    } else if (mode == 1) {
        //async procesisng code
    }

}

とはいえ、このインデックス メソッドまたは SyncOrAsyncIndex クラス内にすべての実装を記述しますか。それはおそらく手に負えないものになるでしょう。したがって、 index メソッドは次のようになります。

public void index(int mode) {
    if(mode == 0) {
        new SyncIndex().index(); //for example
    } else if (mode == ) {
        new AsyncIndex().index(); //for example
    }
}

3 番目のモードをサポートすることを決定したとします。index メソッドまたは SyncOrAsyncIndex クラスの窮状を想像してみてください。したがって、最初のアプローチが必要です。

したがって、「インターフェイスへのコード」戦略に従って、最初のアプローチが提案されます。呼び出し元がインデックス作成のタイプを認識している場合、特定のタイプをインスタンス化して使用するだけです。

それ以外の場合、最初のアプローチとともに、渡されたパラメーターに基づいて使用するインデックスの種類を計算するためのファクトリまたは戦略として、2 番目のアプローチが必要になる場合があります。呼び出し元は、SyncOrAsyncIndex を介して SyncIndex または AsyncIndex を使用します。

于 2013-04-26T02:54:33.703 に答える
1

私は最初のアプローチに行きます

1- コードがよりクリーン AsyncInex クラスには非同期呼び出しに関連するコードのみが含まれ、syncIndex には独自のコードが含まれます。2-次の場合は、他に避けることができます

...
public void runService(IndexService service) {
     service.index()
}

// some where in your code
runService(new AsyncIndex());
// or
runService(new SyncIndex());

インターフェイス「IndexService」を使用しているため、クライアント コードを変更せずにいつでも実装を変更できます。特に、DI フレームワークを使用している場合は、そのキックを使用できます ;)。

これは、クライアント コードに実装を認識させないために非常に重要です。たとえば、データベースのインデックスを作成している状況を想定してください。データが大きい場合は非同期インデックスを実行し、データが小さい場合は同期インデックスを実行します。呼び出し元は、インデックスが呼び出される方法について何も知らないはずです。このようにして、呼び出し元のコードを変更することなく、さまざまな状況でさまざまな戦略を立てることができます。2 番目のアプローチを取る場合は、追加の作業を行う必要があります。

于 2013-04-26T09:22:28.637 に答える