2011-10-18 9 views
6

私のアプリケーションには、Fooのオブジェクトを扱う内部ストレージ層があります。 Get操作中に、データレイヤーはクラスター取得に大きな利点がありますが、実際には、複数回は約10%の時間しかかかりません。Storage APIに特異点と複数点を定義する理想的な方法は何ですか?

アプローチA:

interface FooStorage { 
    Foo getFoo(String name); 
    List<Foo> getFoos(List<String> names); 
} 

アプローチB:

interface FooStorage { 
    List<Foo> getFoos(List<String> names); 
} 
class StorageUtility { 
    public static <T> T firstOrNull(List<T> data) { ... } 
} 

アプローチC:

interface FooStorage { 
    List<Foo> getFoos(String... names); 
} 
class StorageUtility { 
    public static <T> T firstOrNull(List<T> data) { ... } 
} 

Aにアプローチする欠点がある。ここで私が考えられてきた様々なアプローチがあります私がサポートする必要があるより大きな表面。
アプローチBの欠点は、私がそれを必要としない時間の90%を消費者がリストを構築していることです。 アプローチCの欠点は、リストを配列の10%時間コピーするオーバーヘッドです。

正規の正しい方法がありますか?この種の状況で

答えて

1

、私は次の構文で行く傾向があるが:

Foo getFoo(String name) { 
    return firstOrNull(getFoos(name)); 
} 
List<Foo> getFoos(String ... names) { 
    return getFoos(Arrays.asList(names)); 
} 
List<Foo> getFoos(List<String> names) { 
    .... 
} 

あなたのクライアントは、最も適切な方法を毎回使用する必要があり、そしてあなたが後者はパフォーマンスがために、よりターゲットを絞ったアプローチが必要であることを発見した場合getFoo(name)の場合、その1つのメソッドを再実装できます。

私は、ストレージシステムのインターフェイス/実装に数行のコードを保存するよりも、コンシューマコードを読みやすい状態に保つこと(APIを提供するだけでリストを作成しないようにすること)が重要であると主張します。

関連する問題