【问题标题】:What's the Ideal Way to Define Singular vs Plural Gets in a Storage API?在存储 API 中定义单数与复数的理想方法是什么?
【发布时间】:2011-12-10 07:02:34
【问题描述】:

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

方法 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% 的时间将列表复制到数组的开销。

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

【问题讨论】:

    标签: java api data-access-layer


    【解决方案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) 的性能需要更有针对性的方法,您可以重新实现该单一方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-26
      • 2021-10-24
      • 2011-12-30
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      相关资源
      最近更新 更多