什么是在存储API中定义奇异与多重获取的理想方式?

Hou*_*ell 6 java api data-access-layer

我的应用程序中有一个内部存储层,用于处理Foo对象.在Get操作期间,数据层对群集获取具有显着的好处,但实际上我只有10%的时间会执行多次获取.以下是我考虑过的各种方法:

方法A:

interface FooStorage {
  Foo getFoo(String name);
  List<Foo> getFoos(List<String> names);
}
Run Code Online (Sandbox Code Playgroud)

方法B:

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

方法C:

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

方法A的缺点是需要支持更大的表面.
方法B的缺点是让消费者在90%的时间不需要时建立一个List.方法C的缺点是10%的时间将列表复制到数组的开销.

有没有规范的正确方法来做到这一点?

and*_*ndy 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) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

您的客户每次都应该使用最合适的方法,如果您后来发现性能需要更有针对性的方法getFoo(name),您可以重新实现该单一方法。

我认为保持消费者代码的可读性(避免仅仅为了满足 API 而创建列表)比在存储系统的接口/实现中保存几行代码更重要。