2011-10-18 6 views
6

Tengo una capa de almacenamiento interno en mi aplicación, que maneja los objetos Foo. Durante las operaciones de obtención, la capa de datos tiene importantes beneficios para la agrupación, pero solo realizo varias veces aproximadamente el 10% del tiempo. Aquí hay varios enfoques he considerado:¿Cuál es la forma ideal de definir un singular frente a un plural en una API de almacenamiento?

Enfoque A:

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

Enfoque B:

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

Enfoque C:

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

La desventaja de acercarse a una está teniendo una superficie más grande que necesito apoyar.
La desventaja del Método B es que el consumidor cree una Lista cuando el 90% del tiempo no la necesito. La desventaja de Approach C es la sobrecarga de copiar una lista en una matriz el 10% del tiempo.

¿Existe una forma correcta de hacer esto?

Respuesta

1

En este tipo de situación, yo tendería ir con la construcción siguiente:

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

Su cliente debe utilizar el método más adecuado en cada ocasión, y si este último descubre que el rendimiento requiere un enfoque más específico para getFoo(name), puede volver a implementar ese único método.

Argumentaría que es más importante mantener legible el código del consumidor (evite crear listas solo para satificar la API), que guardar algunas líneas de código en la interfaz/implementación del sistema de almacenamiento.

Cuestiones relacionadas