Comportamento previsto quando una richiesta per una raccolta avrà zero elementi

13

Diciamo che ti viene dato il seguente ...

List<Thing> theThings = fubar.Things.All();

Se non ci fosse nulla da restituire, cosa ti aspetti da fubar.Things.All () per tornare?

Modifica: Grazie per le opinioni. Aspetterò un po 'e accetterò la voce con i più alti.

Sono d'accordo con le risposte finora, in particolare quelle che suggeriscono una raccolta vuota. Un fornitore ha fornito un'API con diverse chiamate simili all'esempio sopra. Un venditore che ha fatto $ 4,6 milioni di entrate tramite le proprie API l'anno scorso, a proposito. Fanno qualcosa con cui fondamentalmente non sono d'accordo - lanciano un'eccezione.

    
posta abscode 16.08.2012 - 18:58
fonte

6 risposte

29

Tra le due possibilità (cioè restituire un null o restituire una raccolta vuota) sceglierei restituire una raccolta vuota, perché consente al chiamante di saltare un controllo del valore restituito. Invece di scrivere questo

List<Thing> theThings = fubar.Things.All();
if (theThings != null) {
    for (Thing t : theThings) {
        t.doSomething();
    }
}

sarebbero in grado di scrivere questo:

List<Thing> theThings = fubar.Things.All();
for (Thing t : theThings) {
    t.doSomething();
}

Questo secondo frammento di codice è più breve e più facile da leggere, perché il livello di nidificazione è inferiore di uno.

    
risposta data 16.08.2012 - 19:06
fonte
6

Mi aspetterei una lista vuota. theThings sarebbe ancora un oggetto, ma theThings.Count o theThings.size() restituire 0 .

    
risposta data 16.08.2012 - 19:02
fonte
5

Problemi di progettazione del genere sono risolti da Modello oggetto nullo

...Instead of using a null reference to convey absence of an object (for instance, a non-existent customer), one uses an object which implements the expected interface, but whose method body is empty. The advantage of this approach over a working default implementation is that a Null Object is very predictable and has no side effects: it does nothing.

For example, a function may retrieve a list of files in a directory and perform some action on each. In the case of an empty directory, one response may be to throw an exception or return a null reference rather than a list. Thus, the code which expects a list must verify that it in fact has one before continuing, which can complicate the design...

Suggerimento particolarmente applicabile nel tuo caso (restituendo List quando non ci sono Thing s) è:

...By returning a null object (i.e. an empty list) instead, there is no need to verify that the return value is in fact a list. The calling function may simply iterate the list as normal, effectively doing nothing. It is, however, still possible to check whether the return value is a null object (e.g. an empty list) and react differently if desired.

    
risposta data 16.08.2012 - 19:32
fonte
3

Dovresti, IMHO, restituire un valore VUOTO. Non so di C #, ma in Java abbiamo questo:

  List list = Collections.EMPTY_LIST;
  Set set = Collections.EMPTY_SET;
  Map map = Collections.EMPTY_MAP;

  // For the type-safe 
  List<String> s = Collections.emptyList();
  Set<Long> l = Collections.emptySet();
  Map<Date> d = Collections.emptyMap();

link

    
risposta data 16.08.2012 - 19:26
fonte
2

Vorrei restituire una raccolta vuota oltre a restituire un valore nullo perché in questo modo è possibile evitare di scrivere una verifica nulla nel codice chiamante.

    
risposta data 16.08.2012 - 19:17
fonte
2

Le due soluzioni significano cose diverse.

Se ci sono solo zero della cosa che stai restituendo, restituisci SEMPRE una collezione vuota! Prendi il caso di un elenco di directory. Se non ci sono file nella directory, si restituisce una raccolta vuota di file.

D'altra parte, se la directory non esiste, non è proprio appropriata. "Non posso restituire nulla" significa qualcosa di assolutamente diverso. In tal caso dovresti restituire null o generare un'eccezione a seconda della situazione, non solo restituire una raccolta vuota come se nulla fosse sbagliato.

    
risposta data 17.08.2012 - 03:29
fonte

Leggi altre domande sui tag