Guard (информатика) - Guard (computer science)

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

Независимо от языка программирования используется, пункт охранник , код охранник или сторож заявление , является проверка целостности предпосылок , используемых ошибок во избежание во время выполнения. Типичный пример - проверка того, что ссылка, которая должна быть обработана, не является нулевой, что позволяет избежать сбоев нулевого указателя. Другие варианты использования включают использование логического поля для идемпотентности (поэтому последующие вызовы являются nops), как в шаблоне удаления . Защита обеспечивает ранний выход из подпрограммы и является часто используемым отклонением от структурированного программирования , устраняя один уровень вложенности и приводя к более плоскому коду: замена if guard { ... }на if not guard: return; ....

Этот термин используется с определенным значением в языках программирования APL , Haskell , Clean , Erlang , occam , Promela , OCaml , Swift , Python с версии 3.10 и Scala . В системе Mathematica защитные меры называются ограничениями . Охрана - это фундаментальное понятие в Guarded Command Language , языке формальных методов . Стражи могут использоваться для увеличения сопоставления с образцом с возможностью пропустить образец, даже если структура совпадает. Булевы выражения в условных операторах обычно также подходят под это определение защиты, хотя их называют условиями .

В следующем примере Haskell охранники встречаются между каждой парой "|" и "=":

f x
 | x > 0 = 1
 | otherwise = 0

Это похоже на соответствующие математические обозначения:

В этом случае меры предосторожности находятся в пунктах «если» и «иначе».

Если есть несколько параллельных охранников, как в приведенном выше примере, они обычно проверяются в порядке сверху вниз, и выбирается ветвь, которая пройдет первым. Охранники в списке дел обычно параллельны.

Однако в понимании списков Haskell охранники расположены последовательно, и если какой-либо из них выходит из строя, элемент списка не создается. Это будет то же самое, что объединить отдельные средства защиты с помощью логического И , за исключением того, что среди средств защиты могут быть другие пункты понимания списка.

Эволюция

Простое условное выражение, уже присутствующее в CPL в 1963 году, имеет защиту первого подвыражения и другое подвыражение, которое используется в случае, если первое не может быть использовано. Некоторые распространенные способы написать это:

(x>0) -> 1/x; 0
x>0 ? 1/x : 0

Если второе подвыражение может быть еще одним простым условным выражением, мы можем дать больше альтернатив, которые нужно попробовать перед последним провалом :

(x>0) -> 1/x; (x<0) -> -1/x; 0

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

KRC , «уменьшенная версия» SASL (1976 г.), был одним из первых языков программирования, в котором использовался термин «охрана». Его определения функций могут иметь несколько предложений, и тот, который нужно применить, выбирался на основе мер защиты, следующих за каждым предложением:

 fac n = 1,               n = 0
       = n * fac (n-1),   n > 0

Использование защитных оговорок и термина «защитная оговорка» восходит, по крайней мере, к практике Smalltalk в 1990-х годах, как это было кодифицировано Кентом Беком .

В 1996 году Dyalog APL принял альтернативный чисто функциональный стиль, в котором охрана является единственной управляющей структурой. В этом примере в APL вычисляется четность входного числа:

parity{
        2 : 'odd'
              'even'
        }

Узор охранник

Помимо защиты, прикрепленной к шаблону, защита шаблона может относиться к использованию сопоставления с образцом в контексте защиты. Фактически, совпадение с шаблоном означает «пройден». Это значение было введено в предложение для Haskell Саймоном Пейтоном Джонсом под названием «Новый взгляд на охранников» в апреле 1997 года и использовалось при реализации этого предложения. Эта функция предоставляет возможность использовать выкройки в щитках выкройки.

Пример в расширенном Haskell:

 clunky env var1 var2
 | Just val1 <- lookup env var1
 , Just val2 <- lookup env var2
 = val1 + val2
 -- ...other equations for clunky...

Это будет выглядеть так: «Неуклюжие для среды и двух переменных, в случае, если поиск переменных из среды дает значения , это сумма значений ...» Как и в понимании списков , охранники идут последовательно, и если ни один из них выходит из строя, ветка не берется.

Пример

public string Foo(string username) {
    if (username == null) {
        throw new ArgumentNullException(nameof(username));
    }
    // Rest of the method code follows here...
}

Смотрите также

использованная литература

внешние ссылки