2017-10-17 119 views
0

我负责的几个函数与一些代码味道:函数返回值或整数状态代码重构

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; 
} 

然后重构功能多变的线条像

return 1;;

return ExampleError::BLABLABLA;

试图使其更具可读性。有更好的方法吗?

回答

1

这取决于应用程序的其余部分是如何编写的以及您称为“错误”的确实是错误还是可预测的合法边缘情况。

第一个代码的气味是“幻数”;是的,用符号常量替换它们。

第二个代码味道是你的返回签名不是“干净的” - 你要么返回一个错误代码,要么返回一个结果集。这样做,您需要调用代码来理解代码的语义 - 它需要知道BLABLABLA是连接到数据库的不可恢复的错误,并且BLEBLEBLE意味着您在某处违反了某些约束。

您的问题表明您的代码在生成结果时可能会遇到错误; “最干净”的方式是使用例外来指示错误。异常具有内置语义或指示出错,可以“包装”并可以在调用堆栈中传播。因此,如果BLABLABLA意味着您无法连接到数据库,则调用您的函数的方法可以将该备份传回到UI,而UI不必知道BLABLABLA意味着“无法连接到数据库”。

当然,异常处理也会变得麻烦,并且可能会使代码不易读,所以您真的只想用它来处理错误,而不是边缘情况。

编辑

(我假设你正在使用PHP,因此取得了特定于语言的链接)

missing ID field听起来像一个典型的argument exception - 这调用此方法具有无效这样做的代码论据。你的函数不能指望这样优雅地处理,所以这是一个合理的例外。

problem updating data听起来像一个数据库异常 - 您已经运行了一条SQL语句,但收到了一条错误消息。你的方法不能做它承诺的事情,并没有明显的恢复方式。可能是regular exception.

invalid status - 可能是另一个无效的论点,或者某种逻辑问题。再一次,你的函数不能处理这个问题,它不是函数通常采取行动的边缘情况。

+0

mmm,错误包括'丢失的ID字段','问题更新数据','无效状态',...(他们是边缘情况?),感谢术语“幻数” – vivoconunxino

+0

谢谢内维尔,我真的感谢你的taughts – vivoconunxino