Null Object Pattern e Input validation - copia l'implementazione reale o accetta tutto in silenzio?

8

Ho un WifiComponent nel mio Camera nella mia applicazione client. È responsabile della gestione della funzionalità Wifi della fotocamera. La fotocamera rappresenta una fotocamera reale.

Questo WifiComponent può essere abilitato (nel qual caso posso fare qualcosa con esso, come controllare lo stato della connessione e la scansione) o disabilitato (nel qual caso non puoi fare nulla con esso, a parte chiedere se è abilitato).

Quando creo un Camera nella mia applicazione client , chiedo alla telecamera se il suo WifiComponent è abilitato. Quindi costruisco la sottoclasse appropriata di WifiComponent , WifiComponentImpl o NullWifiComponent .

L'implementazione dei metodi supportedWifiTypes() e wifiScan() è semplice. NullWifiComponent non supporta alcun tipo, viene immediatamente eseguito con la scansione e non trova risultati.

Ma ora devo implementare un metodo bool connect(WifiNetwork network, String password) . Voglio dire che non sono riuscito a connettermi ... Ma non supporto nemmeno il WifiEncryptionType fornito in WifiNetwork ! La vera implementazione genera un IllegalArgumentException se la passi con una rete wifi WifiEncryptionType non supportata.

I I ...

  • Aumenta IllegalArgumentException , perché non suppongo che WifiEncryptionType sia richiesto?
  • Non riesci a connettere in modo silenzioso ( return false ), indipendentemente da cosa viene fornito?

Domanda generalizzata:

Se l'implementazione reale soddisfa un contratto e parte di questo contratto consiste nel generare eccezioni per determinati input, l'implementazione nulla deve dare priorità alla sua neutralità o al contratto?

    
posta Pimgd 17.11.2014 - 16:08
fonte

1 risposta

4

Poiché l'implementazione nulla dovrebbe essere una sostituzione drop-in per l'implementazione full-functional, l'implementazione null dovrebbe rispettare completamente l'interfaccia che implementa.

Se l'interfaccia WifiComponent specifica che connect() genera un'eccezione se viene richiamata con un WifiEncryptionType non supportato, allora è esattamente ciò che deve fare l'implementazione null, specialmente se l'applicazione deve utilizzare lo stesso WifiComponent interfaccia per sapere quali WifiEncryptionType s sono supportati.

Se l'elenco di WifiEncryptionType s supportato non proviene dall'implementazione nulla, la tua implementazione null deve generare un'eccezione solo se è richiesta un'implementazione funzionale per lanciarla.

Se l'interfaccia WifiComponent non specifica che deve essere generata un'eccezione, allora è meglio assumere che il valore sia accettabile per un'implementazione funzionale e segnalare un errore di connessione generico ( return false ).

    
risposta data 17.11.2014 - 16:33
fonte

Leggi altre domande sui tag