Стандарты проверки функции/аргумента метода

Я просто справлялся об общепринятой практике синтаксиса проверки аргумента. Я работаю с 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(); }
}

В любом случае, если кто-либо знает о документации, которая иллюстрирует любой вид стандартов или общие методы относительно этого, я был бы очень признателен за ссылку.

Конечно, персональные предпочтения и мнения больше затем приветствуются, но обоснование для Вашего выбора было бы активом.

10
задан palacsint 16 June 2012 в 17:59
поделиться

2 ответа

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

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

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

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

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

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

6
ответ дан 4 December 2019 в 02:49
поделиться

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

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

    //do stuff with $a, $b, and $c
} 
1
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: