Me pregunto si debería defenderme contra el valor de retorno de una llamada al método al validar que cumplan mis expectativas, incluso si sé que el método al que llamo cumplirá tales expectativas.
DADO
User getUser(Int id)
{
User temp = new User(id);
temp.setName("John");
return temp;
}
DEBERIA HACER
void myMethod()
{
User user = getUser(1234);
System.out.println(user.getName());
}
O
void myMethod()
{
User user = getUser(1234);
// Validating
Preconditions.checkNotNull(user, "User can not be null.");
Preconditions.checkNotNull(user.getName(), "User's name can not be null.");
System.out.println(user.getName());
}
Estoy preguntando esto a nivel conceptual. Si conozco el funcionamiento interno del método que estoy llamando. Ya sea porque lo escribí o lo inspeccioné. Y la lógica de los posibles valores que devuelve cumple mis condiciones previas. ¿Es "mejor" o "más apropiado" omitir la validación, o aún debería defenderme de los valores incorrectos antes de continuar con el método que estoy implementando actualmente, incluso si siempre debe pasar?
Mi conclusión de todas las respuestas (siéntase libre de responder):
Afirmar cuando- El método ha demostrado comportarse mal en el pasado
- El método es de una fuente no confiable
- El método se usa desde otros lugares y no establece explícitamente sus condiciones posteriores.
- El método está muy cerca del suyo (vea la respuesta elegida para más detalles)
- El método define explícitamente su contrato con algo como el documento adecuado, la seguridad de tipo, una prueba unitaria o una verificación posterior a la condición
- El rendimiento es crítico (en cuyo caso, una afirmación de modo de depuración podría funcionar como un enfoque híbrido)
Null
)? Probablemente sea igualmente problemático si el nombre es ""
(no nulo pero la cadena vacía) o "N/A"
. O puedes confiar en el resultado, o tienes que ser apropiadamente paranoico.