Этот вопрос: Лучший способ вернуть флаг состояния и сообщение из метода на Java похож на мой, однако я бы сделал это на PHP, а не на Java (который мог бы сделать здесь небольшая разница).
Проблема:
Там ' метод, который может иметь либо успешный результат (он может измениться на более успешный), либо «проблемный». Последнее означает, что операция не удалась, но также важно знать, почему. Представьте себе метод класса аутентификации:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
Было бы тривиально вернуть истину и ложь в случае успеха или неудачи, но как сообщить о причине сбоя?
Возможные решения:
Возвращает истину в случае успеха и строку в случае ошибки с кодом ошибки, указывающим проблема: с PHP можно получить хорошие чистые блоки следующим образом:
$ loginStatus = $ auth-> login ('name', 'проходить');
если ($ loginStatus === true)
{
сделай что-нибудь();
}
еще
{
если ($ loginStatus == 'неправильный_логин_данные')
...
elseif ($ loginStatus == 'забанен')
...
// или с массивом сообщений об ошибках:
echo $ erroMessages [$ loginStatus];
}
Возвращает объект общего статуса (состояния): очень элегантное решение, а также перспективное (нет проблем, если количество статусов меняется или позже должны быть возвращены дополнительные данные), возможно, лучший вариант:
$ loginStatus = $ auth-> логин ('имя', 'пройти')
если ($ loginStatus-> isSuccess)
...
еще
echo $ errorMessages [$ loginStatus-> errorCode]; // $ errorMessages как в предыдущем примере
Один из двух, но не с простой строкой, а с константами класса:
$ loginStatus = $ auth-> login ('name', 'pass')
если ($ loginStatus-> isSuccess)
...
elseif ($ loginStatus-> errorCode == Auth :: ERR_USER_BANNED)
...
При этом нет необходимости объяснять коды ошибок в документации, и это будет казаться более "естественным" (по крайней мере, для меня).
Вопрос:
Что бы вы использовали (из вышеперечисленного те или любое другое решение)? Что было доказано в долгосрочной перспективе как хороший способ?
Заранее спасибо!