这个问题: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和false是微不足道的,但是如何报告失败的原因呢?
可能的解决方案:
- 返回true或false并编写另一个方法(getStatus())来获取具体问题:这对我来说感觉有点尴尬
- 使用例外:因为禁止用户并不是例外(例外是如果用户在打字时死亡,正如本网站上的另一位作者所指出的那样)在这些情况下使用例外是完全错误的(但是如果查询失败,方法可能会引发数据库异常)
成功时返回 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) ...
这样就没有必要在文档中解释错误代码,并且也会感觉更“自然”(至少对我而言)。
问题:
您会使用什么(上述解决方案或任何其他解决方案)?从长远来看,什么被证明是好方法?
先感谢您!