2011-10-18 20 views
6

Nella mia applicazione ho un livello di archiviazione interno che gestisce gli oggetti . Durante le operazioni di acquisizione, il livello dati presenta vantaggi significativi per il clustering, ma in realtà realizzo solo più di circa il 10% delle volte. Qui ci sono diversi approcci Ho considerato:Qual è il modo ideale per definire singolare o plurale in un'API di archiviazione?

Approccio A:

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

Approccio B:

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

Approccio C:

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

L'aspetto negativo di avvicinarsi ad un sta avendo una superficie più ampia che devo supportare.
Lo svantaggio dell'approccio B è che il consumatore costruisca una lista quando il 90% delle volte non ne ho bisogno. Il lato negativo di Approach C è il sovraccarico di copiare un elenco su un array il 10% delle volte.

Esiste un modo canonico per farlo?

risposta

1

In questo tipo di situazione, tenderei andare con il seguente costrutto:

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

Il suo cliente dovrebbe utilizzare il metodo più appropriato ogni volta, e se quest'ultimo scopre che le prestazioni richiede un approccio più mirato per getFoo(name), è possibile ri-implementare quel singolo metodo.

Direi che è più importante mantenere il codice del consumatore leggibile (evitare di creare liste solo per saturare l'API), piuttosto che salvare poche righe di codice nell'interfaccia/implementazione del sistema di archiviazione.

Problemi correlati