'Considerare la possibilità di restituire oggetto Null' si applica a un metodo di lettura DAO?

2

Stavo cercando una risposta alla domanda su cosa dovrebbe restituire un DAO quando una ricerca finisce per essere un'entità che non esiste.

Ci sono alcuni generici domande precedenti relative al rinvio di null, ma sto cercando una risposta specifica nel contesto dello scenario di recupero DAO.

Per essere chiari, quando dico Oggetto Nullo mi riferisco al modello Oggetto Nullo . Nello spazio Java, Josh Bloch raccomanda una soluzione di raccolta vuota nel libro Java efficace (vedi articolo 43) che fornisce un'ottima introduzione al problema / soluzione.

Nonostante sia stato a conoscenza del consiglio di Bloch quando ho scritto per la prima volta questa domanda ho pensato di restituire un valore nullo appropriato in uno scenario di lettura / recupero. Sono in buona compagnia e faccio un errore con i null .

    
posta Crowie 14.05.2013 - 19:04
fonte

2 risposte

8

Nell'elemento "Java efficace" 43 p. 201, Joshua Bloch afferma, "Non c'è alcun motivo per restituire null da un metodo basato su array o valore di raccolta." Raccomanda di restituire un array di lunghezza zero o una collezione vuota (Collections.emptyXxx) quando non ci sono legittimamente risultati. Per prima cosa, è un dolore per il cliente controllare due volte tutto:

if ( (retVal == null) || (retVal.size() < 1) ) {
    ...
}

Prima di restituire null, chiediti se il valore di ritorno nullo è il risultato di un errore di programmazione nella parte del codice chiamante. Tale controllo viene generalmente eseguito nelle prime righe di una procedura come controllo difensivo per valori di input non validi e può legittimamente risultare nel generare un'eccezione non controllata invece di restituire null. Per il mio ragionamento su questo, si prega di consultare la voce Controllata vs Eccezioni non controllate nel mio blog.

Scala e Haskell evitano di restituire null con una classe Option. Non vedo immediatamente come sia meglio di null (oltre ad essere sicuro per il tipo solo per il gusto di farlo), ma ho pensato di doverlo menzionare come un altro punto di vista:

val nameMaybe = request getParameter "name"
nameMaybe match {
  case Some(name) =>
    println(name.trim.toUppercase)
  case None =>
    println("No name value")
}

Bloch suggerisce che null è un ritorno appropriato invece di una raccolta vuota in C perché le lunghezze dell'array sono memorizzate separatamente dagli array e non vi è alcun vantaggio nell'assegnare una matrice vuota. Ma un null non è sempre la risposta giusta in tutte le lingue.

    
risposta data 14.05.2013 - 19:30
fonte
5

Una ricerca suggerisce che ci saranno più risultati che è un caso facile - sempre restituisce una collezione. Se ci non ci sono risultati, quindi la raccolta non avrà semplicemente elementi.

Se può esserci 0 o 1 risultato, dipende dalla semantica della ricerca. Può esserci solo un risultato perché limiti artificialmente i risultati della ricerca a 1? Vorrei andare con una collezione con 0 o 1 elementi, il limite potrebbe probabilmente cambiare ad un certo punto.

Se può esserci veramente solo il risultato 0 o 1, probabilmente stai cercando di "cercare" con un identificatore univoco o simile. In condizioni normali utilizzo dell'applicazione, questa "ricerca" non fallirà mai. Non è davvero una ricerca. La tua applicazione non genera collegamenti con id non validi o altro.

Tuttavia, in situazioni eccezionali come:

  • Una pagina con collegamenti è stata caricata ed è rimasta inattiva per un po '. Alcune delle risorse dietro i collegamenti sono state eliminate nel frattempo. Ora quando fai clic su tale link, la "ricerca" fallirebbe.
  • L'utente "aggira" manualmente l'applicazione e utilizza direttamente la barra degli indirizzi per inserire numeri di identificazione arbitrari.
  • ...

Tutte le precedenti sono eccezioni. Quindi è molto facile, lanciare un'eccezione. Probabilmente un NotFoundException che non ha bisogno di essere catturato ovunque che può solo bolla in alto per una pagina di errore 404 automatico.

    
risposta data 14.05.2013 - 22:33
fonte

Leggi altre domande sui tag