No hay absolutamente ninguna razón para regresar true
al éxito si no regresa false
al fracaso. ¿Cómo debería ser el código del cliente?
if (result = tryMyAPICall()) {
// business logic
}
else {
// this will *never* happen anyways
}
En este caso, la persona que llama necesita un bloque try-catch de todos modos, pero luego puede escribir mejor:
try {
result = tryMyAPICall();
// business logic
// will only reach this line when no exception
// no reason to use an if-condition
} catch (SomeException se) { }
Por lo tanto, el true
valor de retorno es completamente irrelevante para la persona que llama. Así que solo mantén el método void
.
En general, hay tres formas de diseñar modos fallidos.
- Devuelve verdadero / falso
- Utilizar
void
Excepción de , lanzamiento (marcado)
- devuelve un objeto de resultado intermedio .
Volver true
/false
Esto se usa en algunas API antiguas, en su mayoría de estilo c. Los inconvenientes son obviuos, no tienes idea de lo que salió mal. PHP hace esto con bastante frecuencia, lo que lleva a un código como este:
if (xyz_parse($data) === FALSE)
$error = xyz_last_error();
En contextos multiproceso, esto es aún peor.
Lanzar excepciones (marcadas)
Esta es una buena manera de hacerlo. En algunos puntos, puede esperar el fracaso. Java hace esto con sockets. La suposición básica es que una llamada debe tener éxito, pero todos saben que ciertas operaciones pueden fallar. Las conexiones de socket están entre ellas. Entonces la persona que llama se ve obligada a manejar la falla. es un diseño agradable, porque se asegura de que la persona que llama realmente maneje la falla y le brinda a la persona que llama una forma elegante de lidiar con la falla.
Objeto de resultado devuelto
Esta es otra buena manera de manejar esto. A menudo se usa para analizar o simplemente cosas que deben validarse.
ValidationResult result = parser.validate(data);
if (result.isValid())
// business logic
else
error = result.getvalidationError();
Niza, lógica limpia para la persona que llama también.
Hay un poco de debate sobre cuándo usar el segundo caso y cuándo usar el tercero. Algunas personas creen que las excepciones deben ser excepcionales y que no debe diseñar teniendo en cuenta la posibilidad de excepciones, y casi siempre utilizará las terceras opciones. Así de fino. Pero hemos verificado las excepciones en Java, por lo que no veo ninguna razón para no usarlas. Utilizo las comprobaciones comprobadas cuando la suposición básica es que la llamada debería éxito (como usar un socket), pero es posible que falle, y uso la tercera opción cuando no está claro si la llamada debe tener éxito (como validar los datos). Pero hay diferentes opiniones sobre esto.
En tu caso, iría con void
+ Exception
. Espera que la carga del archivo tenga éxito, y cuando no lo hace, es excepcional. Pero la persona que llama se ve obligada a manejar ese modo de falla, y puede devolver una excepción que describa correctamente qué tipo de error ocurrió.