Esta pregunta: Best way to return status flag and message from a method in Java es similar a la mía, sin embargo lo haría en PHP, no en Java (lo que podría hacer una pequeña diferencia aquí).Estado de devolución del método: bool, string, const ... (PHP)
El problema:
No es un método que puede tener ya sea un resultado exitoso (esto puede cambiar para ser los más exitosos) o una "problemática" uno. Esto último significa que la operación falló, pero también es importante saber por qué. Imagínese un método de una clase de autenticación:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
sería trivial para volver verdadero y falso para el éxito y el fracaso, pero la manera de informar la causa del fracaso?
soluciones posibles: true
- Retorno o falsas y escribir otro método (getStatus()) para obtener el problema específico: esto se siente un poco incómodo para mí
- Use excepciones: ya que no es excepcional para que un usuario sea prohibido (una excepción sería si el usuario muriera mientras teclea como ha señalado otro autor en este sitio) el uso de excepciones aquí en estos casos sería completamente incorrecto (sin embargo, el método podría arrojar una excepción de base de datos si falla una consulta)
Volver cierto en el éxito y una cadena en caso de fallo con un código de error que indica el problema: con PHP es posible de esta manera tener buenos bloques limpios de la siguiente manera:
$loginStatus = $auth->login('name', 'pass'); if ($loginStatus === true) { doSomething(); } else { if ($loginStatus == 'wrong_login_data') ... elseif ($loginStatus == 'banned') ... // or with an array full of error messages: echo $erroMessages[$loginStatus]; }
devolver un estado general (estado) de objeto: muy solución elegante y también a prueba de futuro (no hay problema si el número de estados varía o temprano debe ser devuelto datos adicionales), tal vez la mejor:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... else echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example
Cualquiera de los dos anteriores, pero no con una cuerda simple pero constantes de clase:
$loginStatus = $auth->login('name', 'pass') if ($loginStatus->isSuccess) ... elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED) ...
Con esto no sería necesario explicar los códigos de error en la documentación y se sentiría más "natural" también (al menos para mí).
La pregunta:
Lo usaría (de los anteriores o cualquier otra solución)? ¿Qué se ha demostrado a largo plazo que es una buena manera?
¡Gracias de antemano!
Es una lástima que haya esperado tanto tiempo para aceptar la respuesta :-). – Piedone