问题是:
有一种方法可以有一个成功的结果(这可能会变成更成功的结果)或者一个“有问题的”结果。后者意味着操作失败,但知道原因也很重要。
public function login($name, $password)
{
if (successful_authentication)
{
report success
}
else
{
report failure, explain why (e.g. wrong name/pass, user banned)
}
}
对于成功和失败来说,返回真假是微不足道的,但是如何报告失败的原因呢?
返回true或false并编写另一个方法(getStatus())以获得特定的问题:这对我来说有点尴尬
使用异常:由于被禁止的用户并不例外(例外情况是当用户在本网站上以另一位作者的身份键入时死亡),在这些情况下使用异常是完全错误的(但是如果查询失败,该方法可能会引发数据库异常)
$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];
}
返回一个通用状态(state)对象:非常优雅的解决方案,而且可以证明将来的情况(如果状态的数量不同或以后应该返回其他数据,则没有问题),可能是最好的解决方案:
$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)
...
这样就不需要在文档中解释错误代码,而且感觉也更“自然”(至少对我来说)。
问题是:
你会用(上述的)什么方法或其他方法?从长远来看,什么已经被证明是一个好方法?
提前谢谢你!