Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

f  x  |  x  >  0  =  1  |  в противном случае  =  0

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

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

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

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

Эволюция [ править ]

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

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

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

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

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

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

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

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

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

четность {  2  :  'odd'  'even'  }

Pattern Guard [ править ]

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

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

 неуклюжий  env  var1  var2  |  Just  val1  <-  lookup  env  var1  ,  Just  val2  <-  lookup  env  var2  =  val1  +  val2  - ... другие уравнения для неуклюжего ...

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

Пример [ править ]

общедоступная  строка  Foo ( строка  имя пользователя )  {  if  ( имя пользователя  ==  null )  {  выбросить  новое  исключение ArgumentNullException ( имя ( имя пользователя ));  }  // Остальная часть кода метода следует здесь ... }

См. Также [ править ]

  • Утверждение
  • Логическое условное
  • Заявление о переключении
  • Кронштейн Айверсона
  • Охраняемая подвеска

Ссылки [ править ]

  1. ^ a b Бек, Кент (1997). «Охранная оговорка». Smalltalk Best Practice Patterns, . С. 178–179.
  2. ^ Кук, Нейт. "охранять и откладывать" . NSHipster . Проверено 26 февраля 2016 .
  3. ^ Тернер, Д.А. "Некоторая история языков функционального программирования" (PDF) .
  4. ^ Скоулз, Джон. «Прямые функции в Dyalog APL» (PDF) .

Внешние ссылки [ править ]

  • Охранник в бесплатном он-лайн словаре по вычислительной технике - FOLDOC , Денис Хоу (редактор).
  • Оговорка , WikiWikiWeb
  • Отчет Haskell 98 , глава 3 Выражения .
  • Книга Mathematica, раздел 2.3.5 Установка ограничений на шаблоны
  • Руководство пользователя системы компиляции Glorious Glasgow Haskell , версия 6.4, раздел 7.3.2. Выкройка охранников