这个问题:Best way to return status flag and message from a method in Java与我的相似,不过我会用PHP而不是Java(这可能会略有不同)。
问题:
有一种方法可以有一个成功的结果(这可能会变成更成功的结果)或一个“有问题”的结果。后者意味着操作失败,但知道原因也很重要。 想象一下Authentication类的方法:
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
对于成功和失败,返回真假都是微不足道的,但如何报告失败的原因呢?
可能的解决方案:
成功时返回true,失败时返回一个字符串,错误代码表示问题:使用PHP可以通过这种方式获得漂亮的干净块,如下所示:
$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];
}
返回一般状态(状态)对象:非常优雅的解决方案,也是面向未来的(如果状态数量不同或以后需要返回其他数据,则没有问题),也许是最好的一个:
$loginStatus = $auth->login('name', 'pass')
if ($loginStatus->isSuccess)
...
else
echo $errorMessages[$loginStatus->errorCode]; // $errorMessages as by the previous example
以上两种情况中的任何一种,但不是普通字符串而是类常量:
$loginStatus = $auth->login('name', 'pass')
if ($loginStatus->isSuccess)
...
elseif ($loginStatus->errorCode == Auth::ERR_USER_BANNED)
...
有了这个,就没有必要在文档中解释错误代码,并且感觉更自然“(至少对我而言)。
问题:
你会使用什么(上述或其他任何解决方案)?从长远来看,已经证明什么是好方法?
提前谢谢!
答案 0 :(得分:2)
抛出异常。如果需要检查返回值,那么任何失败都将允许未经授权的登录。如果没有检查异常将会导致整个事情发生,这在这种情况下似乎更为可取。
在不太关键的地方,如果我正在对一个已经存在的对象进行检查,我可能只返回结果代码并有一个单独的函数来检索消息,但我不会忘记做一些事情。只是使用该技术的对象。否则,我会使用包含结果代码和消息的状态对象。
答案 1 :(得分:2)
这就是我记忆中PEAR一直在做的事情。所以这是一种久经考验的方法。
class LoginError {
private $reason;
public function __construct($reason)
{
$this->reason = $reason;
}
public function getReason()
{
return $this->reason;
}
}
function isError($response)
{
return ($response instanceof LoginError);
}
public function login($name, $password)
{
if (successful_authentication)
{
return true;
}
else
{
return new LoginError('The password is incorrect');
}
}
$loginStatus = login('name', 'pass');
if (!isError($loginStatus))
{
doSomething();
}
else
{
echo $loginStatus->getReason();
}
答案 2 :(得分:1)
我会选择“返回一般状态(状态)对象”的变体,其中状态由您的身份验证对象描述。
所以$ auth-> login('name','pass')是一个简单的bool,$ auth-> getState()是一个枚举或字符串(可能是针对最终用户)描述状态。 / p>