Sembra esserci una crescente comunità di persone che dice che non si dovrebbe mai restituire null e si dovrebbe sempre utilizzare il modello di oggetto nullo. Riesco a vedere l'utilità del NOP quando si utilizza una raccolta/mappa/array o la chiamata di funzioni booleane come isAuthenticated(), which is shown here.Modello oggetto nullo
Non ho trovato nulla su questo che sia pienamente convincente. Resta con me qui mentre cerco di organizzare i miei pensieri.
La mia comprensione è che invece di restituire un oggetto nullo, si restituisce un oggetto valido che è stato "azzerato".
Così, per esempio, il client sarebbe effettuare una chiamata per ottenere un oggetto:
Car car = getCar();
Se non si utilizza il NOP si avrebbe bisogno di controllare se l'oggetto restituito dal getCar() è nullo prima di chiamare qualsiasi metodo su di esso:
if (car != null){
color = car.getColor();
doScreenStuff(color);
}
Utilizzando il NOP, invece di getCar()
restituire nulla, ora restituisce un oggetto che è stato effettivamente "azzerato". Così ora non abbiamo più bisogno di fare if (car != null)
e possiamo solo richiedere il colore. Quindi, suppongo che il nostro oggetto "azzerato" restituisca "nessuno" quando chiamiamo il colore.
Come può essere d'aiuto? Sembra che andare avanti e chiamare metodi su un oggetto vuoto causi altrettanta sofferenza quanto semplicemente il controllo di null. Ora, quando arriva il momento di visualizzare le informazioni, dobbiamo controllare che il colore non sia "none", che l'altezza non sia 0, o qualunque altro valore tu abbia. Quindi, in sostanza, invece di controllare l'inizio dell'elaborazione se l'auto è nullo, si verifica in seguito se l'oggetto della macchina che abbiamo è un'automobile reale o un sostituto. OSSIA non vogliamo mostrare un mucchio di oggetti vuoti, quindi abbiamo bisogno di un modo per filtrare tutti i nostri oggetti vuoti.
Questo filtro è un passaggio aggiunto, proprio come chiamare se (auto! = Null). L'unica differenza è che con il controllo di null, possiamo arrestare l'elaborazione non appena scopriamo che l'oggetto car è nullo generando un'eccezione, mentre con NOP chiamiamo metodi sull'oggetto vuoto e continuiamo a fare chug finché non arriva il momento di mostra l'oggetto e a questo punto filtriamo i vuoti. Inoltre, è necessario conoscere i valori restituiti dall'oggetto vuoto. OSSIA getColor() restituisce "nessuno" o "vuoto".
Ovviamente deve esserci qualcosa che sto trascurando. Grazie in anticipo.
Il modello di oggetto nullo e facoltativo non hanno lo stesso scopo. Opzionale è usato per indicare che un valore può o non può essere presente. Il modello di oggetto nullo sta semplicemente codificando il fatto che potrebbe esserci un oggetto "niente lì" che ha ancora un comportamento utile. – Cubic
Scusate, forse non mi sono chiarito, stavo dicendo che l'alternativa ai controlli nulli è opzionale, e quindi "questo non è affatto una sostituzione per il modello di oggetto nullo" per il modello di oggetto nullo. Non ho usato il modello di oggetto nullo in un po 'perché non ho avuto un caso di utilizzo recente, ma non intendo assolutamente che gli optionals sostituiscano il modello di oggetto nullo. –