Validación de entrada y patrón de objeto nulo: ¿copiar la implementación real o aceptar todo silenciosamente?

8

Tengo un WifiComponent en mi Camera en mi aplicación cliente. Es responsable de manejar la funcionalidad de la cámara relacionada con Wifi. La cámara representa una cámara del mundo real.

Este WifiComponent se puede habilitar (en cuyo caso puedo hacer cosas con él, como verificar el estado de la conexión y escanear) o deshabilitar (en cuyo caso no se puede hacer nada con eso, aparte de preguntar si está habilitado).

Al crear un Camera en mi aplicación cliente , le pregunto a la cámara si su WifiComponent está habilitado. Luego construyo la subclase apropiada de WifiComponent , ya sea WifiComponentImpl o NullWifiComponent .

La implementación de los métodos supportedWifiTypes() y wifiScan() es fácil. NullWifiComponent no admite ningún tipo, se realiza instantáneamente con el escaneo y no encuentra resultados.

Pero ahora tengo que implementar un método bool connect(WifiNetwork network, String password) . Quiero decir que no pude conectarme ... ¡Pero ni siquiera admito el WifiEncryptionType proporcionado en el WifiNetwork ! La implementación real arroja un IllegalArgumentException si lo pasas a una red no compatible WifiEncryptionType wifi.

¿Yo ...

  • ¿Desea tirar IllegalArgumentException porque no apoyo el WifiEncryptionType solicitado?
  • Fallo en la conexión ( return false ), ¿no importa lo que se proporciona?

Pregunta generalizada:

Si la implementación real cumple con un contrato, y parte de este contrato es lanzar excepciones para ciertos insumos, ¿debería una implementación nula priorizar su neutralidad o el contrato?

    
pregunta Pimgd 17.11.2014 - 16:08

1 respuesta

4

Como se supone que la implementación nula es un reemplazo directo de la implementación funcional completa, la implementación nula debería adherirse totalmente a la interfaz que implementa.

Si la interfaz WifiComponent especifica que connect() lanza una excepción si se invoca con un WifiEncryptionType no compatible, entonces eso es exactamente lo que debe hacer su implementación nula, especialmente si la aplicación debe usar el mismo WifiComponent de interfaz para saber qué WifiEncryptionType s son compatibles.

Si la lista de WifiEncryptionType s admitida no proviene de su implementación nula, entonces su implementación nula solo debería lanzar una excepción si también se requiere una implementación funcional para lanzarla.

Si la interfaz WifiComponent no especifica que se debe lanzar una excepción, entonces es mejor asumir que el valor sería aceptable para una implementación funcional e informar un error de conexión genérico ( return false ).

    
respondido por el Bart van Ingen Schenau 17.11.2014 - 16:33

Lea otras preguntas en las etiquetas