函数/方法参数验证标准

时间:2010-08-03 04:40:31

标签: php function arguments standards validation

我刚刚询问了参数验证语法的标准做法。我目前正在使用PHP,但任何被认为是平台/语言无关的解决方案都会很棒。

截至目前,我知道两种非常常见的语法。例如(我的偏好):

function foo($a, $b, $c){
    if(!$a){ throw new Exception(); }
    if($b < 0){ throw new Exception(); }
    if(!check($c)){ throw new Exception(); }

    //do stuff with $a, $b, and $c

}

另外:

function foo($a, $b, $c){
    if($a){
        if($b >= 0){
            if(check($c)){

                //do stuff with $a, $b, and $c

            }else{ throw new Exception(); }
        }else{ throw new Exception(); }
    }else{ throw new Exception(); }
}

在任何情况下,如果有人知道说明任何标准的文件或有关此的常见做法,我将非常感谢参考。

当然,个人偏好和意见更受欢迎,但推理您的选择将是一种资产。

2 个答案:

答案 0 :(得分:6)

我更喜欢你给出的前一个例子有很多原因:

  • 代码不会像嵌套的if语句那样不必要地缩进。
  • 嵌套if语句可以将一堆复杂的分支添加到难以管理的逻辑流程中
  • 前提条件因if语句的性质而降低。我希望在方法开始时立即拥有所有先决条件

按合同设计是确保满足某些条件的一般方法(通常通过断言),例如:

Assert.IsNotNull($a, '$a must not be null');

如果断言失败,则会抛出指定消息的异常。

使用相同的方法,您可以在方法结束时(后置条件)进行某些断言,以确保方法按预期执行。

答案 1 :(得分:1)

或者,将if一组测试组合在一个“if语句”中:

function foo($a, $b, $c) {
    if ((!$a) ||
        ($b < 0) ||
        (!check($c))) {
       throw new Exception();
    } 

    //do stuff with $a, $b, and $c
}