1

これに対するエレガントな解決策を見つけようとしていますが、わかりません。

私はどこかに汎用データプロバイダーを持っています。私はそれを呼び出して任意のオブジェクトを取得したいと思います-そして、リクエストに応じて、キャッシュ、サーバーなどからそれらを取得します。

たとえば、次のように呼び出します。

List<Customer> customers = new DataProvider().getData(new CustomersRequest(20));

これにより、すべての顧客に 20 歳が提供されます。DataProvider は、このデータを取得する方法と場所を決定します。

CustomersRequest は Request クラスを拡張します。

これを機能させるには、getData で Request インスタンスの instanceOf チェックを行い、DB キャッシュまたはリモート プロバイダーから対応するメソッドを呼び出す必要があります。次のようなものです。

if (request instanceof CustomersRequest) {
    DBDataProvider dbDataProvider = new DBDataProvider();
    List<Customer> customers = dbDataProvider.getCustomers(request);

    if (customers == null) {
        RemoteDataProvider removeDataProvider = new RemoteDataProvider();
        customers = removeDataProvider.getCustomers(request);

        if (request.cacheInDB) {
            //save response to db
        }

        return customers;

    }

}

しかし、それはこのメソッドから を返す場合にのみ機能Objectします。これは、呼び出すたびにキャストを行うことになります。私はこれが適切な解決策だと思いますが、返されたデータは内部で行うキャストにも基づいているためです。

そしてのインスタンスは悪いと言われています。

これをジェネリックで解決する方法が見つかりませんでした。

私もできる:

List<Customer> customers = new DataProvider().getCostumers(20);

しかし、これは、すべての異なるオブジェクトとパラメーターに対して、DataProvider で多くのメソッドを作成する必要があることを意味し、これらのメソッドのそれぞれで、キャッシュ チェックなどを行う共通のメソッドを呼び出す必要があります。この一般的な方法では、最初のアプローチと同じ問題があります。

またはまた:

List<Customer> customers = new CustomersDataProvider().getCostumers(20);

ここでは、ジェネリックではないため、インスタンスとジェネリックに問題はありません。しかし、考えられるすべてのデータに対してキャッシュ アクセスと検証を 1 か所で取得するために、これを正しく抽象化できるかどうかはわかりません。

これに対する最善のアプローチは何ですか?

4

3 に答える 3

2

これは、クラスClassが役立つ場合です。次のようなメソッドを使用できます。

List<Customer> customers = new DataProvider().getCostumers(20, Customer.class);

メソッドのシグネチャは次のようになります。

T getCostumer(int age, Class<T> clazz)
于 2013-07-23T11:41:23.737 に答える
0

instanceof、getClass()、または定数文字列を使用する場合は、とにかくスイッチがあります。

外部ユーザーが呼び出すことができる API を設計する場合は、定数文字列の方が適していると思います。

アプリケーションでそれらを乗算しない限り、スイッチを使用することはそれほど悪いことではありません。スイッチを 1 つだけ保持するために、インターフェイスに基づく基本的な oop テクニックを使用できます。

乾杯

于 2013-07-23T18:34:02.470 に答える
0

ここでのエレガントな解決策は、クラスにgetDBDataProviderメソッドを追加することだと思います。が であるかどうかを気にする必要がなくなりRequestました。(戻り値が null であるかどうかのみ。) 正しい値を取得する責任は、in のメソッド オーバーライドにかかっています。これは、実際に.getDataCustomerRequestRequestDBDataProviderCustomerRequestinstanceofCustomerRequest

一般に、エレガントにするために、スーパークラスとインターフェースには、すべてのサブクラス/実装のニーズを処理するのに十分なメソッドが必要だと思います。これは、多くの作業コードがサブクラスを扱う必要がなく、特定の 1 つのサブクラス用に記述されたコードが自動的にすべてのサブクラスで機能することを意味します。

多くの場合、 を使用した方がよいと思いますinstanceof。記述するコードが少なくなり、より早く終了します。null (または単純な) メソッドを、実際には適用されないクラスに配置する必要はありません。しかし、現在行っていることを基に構築することを期待している場合は、このアプローチの方がはるかに優れた方法です。

于 2013-07-23T18:41:36.650 に答える