Стандарты проверки аргументов функций / методов - PullRequest
10 голосов
/ 03 августа 2010

Я просто спрашивал о стандартной практике синтаксиса проверки аргументов.На данный момент я работаю с 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 ]

6 голосов
/ 03 августа 2010

Я предпочитаю первый пример, который вы приводите по ряду причин:

  • Код не имеет ненужных отступов, как это происходит с вложенными операторами if.
  • Вложено, если операторы могут добавить к логической цепочке кучу сложных ветвей, которыми становится трудно управлять
  • Предварительные условия понижаются по природе операторов if.Я предпочитаю иметь все предварительные условия сразу в начале метода

Проектирование по контракту - это общий подход к обеспечению выполнения определенных условий (обычно посредством утверждений), таких как:

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

Если утверждение не выполнено, создается исключение с указанным сообщением.

Используя тот же подход, вы можете сделать определенные утверждения в конце метода (постусловия), чтобы гарантировать, что метод выполняется какожидается.

1 голос
/ 03 августа 2010

В качестве альтернативы, сгруппируйте набор тестов if в один оператор if:

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

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