Function 函数返回值或整数状态代码重构
我正在处理几个带有某种代码味道的函数:Function 函数返回值或整数状态代码重构,function,refactoring,Function,Refactoring,我正在处理几个带有某种代码味道的函数: public function example($a, $b, $c) { $something = doSomething($a); $more = doMoreStuff($b,$c); $evenMore = doEvenMoreStuff($a,$c); if(!$something) { //error code because blablabla return 1; }
public function example($a, $b, $c) {
$something = doSomething($a);
$more = doMoreStuff($b,$c);
$evenMore = doEvenMoreStuff($a,$c);
if(!$something) {
//error code because blablabla
return 1;
}
if(!$something and $more == "whatever") {
//another different error because blebleble
return 2;
}
if(!$more) {
//this means another error because bliblibli
return 3;
}
if(!$evenMore) {
//yep, error, returning code error 4
return 4;
}
//etc...
//if no errors
return $something + $more + $evenMore;
}
我应该如何处理这些错误代码?我想创建一个具有常量值的类,如下所示:
class ExampleError {
const BLABLABLA = 1;
const BLEBLEBLE = 2;
const BLIBLIBLI = 3;
const BLOBLOBLO = 4;
}
然后重构函数更改行,如
返回1代码>
到
返回ExampleError::BLABLABLA代码>
试图让它更具可读性。有更好的解决方案吗?这取决于应用程序的其余部分是如何编写的,取决于您所称的“错误”是真正的错误,还是可预测的合法边缘情况
第一种代码气味是“神奇的数字”;是,用符号常量替换它们
第二种代码味道是返回的签名不是“干净的”——返回错误代码或结果集。在这样做的过程中,您需要调用代码来理解代码的语义——它需要知道bla是连接到数据库的一个不可恢复的错误,bleble表示您在某个地方违反了某些约束
您的问题表明您的代码在生成结果时可能会遇到错误;“最干净”的方法是使用异常来指示错误。异常具有内置语义或指示出错原因,可以“包装”并向上传播调用堆栈。因此,如果blabla
表示您无法连接到数据库,那么调用函数的方法可以将其传递回UI,而UI不必知道blabla
表示“无法连接到数据库”
当然,异常处理也会变得混乱,并且会降低代码的可读性,因此您确实希望仅将其用于处理错误,而不是边缘情况
编辑
(我假设您使用的是PHP,因此我们制作了特定于该语言的链接)
缺少ID字段
听起来像是经典之作-调用此方法的代码使用了无效参数。您的函数不能期望优雅地处理此问题,因此这是一个合法的例外
更新数据时出现问题
听起来像是数据库异常-您运行了一条SQL语句,但返回了一条错误消息。您的方法无法实现其承诺的功能,并且没有明显的恢复方法。可能是
无效状态
-可能是另一个无效参数,或者可能是某种逻辑问题。同样,您的函数无法处理此问题,并且这不是函数正常运行方式的边缘情况。mmm,错误如缺少id字段
,更新数据时出现问题
,无效状态
,。。。(它们是边缘案例吗?),谢谢“神奇数字”这个词谢谢内维尔,我真的很感谢你的嘲弄