Jump to content

Охранник (информатика)

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

Использование

[ редактировать ]

Типичным примером является проверка того, что ссылка, которая будет обработана, не является нулевой, что позволяет избежать сбоев нулевого указателя .

Другие варианты использования включают использование логического поля для идемпотентности (поэтому последующие вызовы являются nops ), как в шаблоне удаления .

public   string   Foo  (  string   username  )  {      if   (  username   ==   null  )   {          throw   new   ArgumentNullException  (  nameof  (  username  ),   "Username is null."  );      }      // Далее следует остальная часть кода метода...  } 

Более плоский код с меньшим количеством вложений

[ редактировать ]

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

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

Например, в Python :

# Эта функция не имеет защитного предложения  def   f_noguard  (  x  ):      if   isinstance  (  x  ,   int  ):          #code          #code          #code          return   x   +   1      else  :          return   None  # Эквивалентная функция с защитным предложением. Обратите внимание, что большая часть кода имеет меньший отступ, и это хорошо.  def   f_guard  (  x  ):      если   не   isinstance  (  x  ,   int  ):          return   None      #code      #code      #code      return   x   +   1 

Другой пример, написанный на C :

// Эта функция не имеет защитного предложения  int   funcNoGuard  (  int   x  )   {    if   (  x   >=   0  )   {      //код      //код      //код      return   x   +   1  ;     }   Еще   {      возврат   0  ;    }  }  // Эквивалентная функция с защитным предложением  int   funcGuard  (  int   x  )   {    if   (  x   <   0  )   {      return   0  ;    }    //код    //код    //код    return   x   +   1  ;   } 

Терминология

[ редактировать ]

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

Математика

[ редактировать ]

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

ж   х   |   х   >   0   =   1   |   иначе   =   0 

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

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

Несколько охранников

[ редактировать ]

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

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

Эволюция

[ редактировать ]

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

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

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

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

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

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

 делать   n   =   1  ,                 n   =   0         =   n   *   делать   (  n  -  1  ),     n   >   0 

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

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

четность  {          2   :   'нечетный'                'четный'          } 

Узорная охрана

[ редактировать ]

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

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б Бек, Кент (1997). «Охранная статья». Шаблоны передового опыта Smalltalk, . стр. 178–179.
  2. ^ Кук, Нейт. «охранять и откладывать» . НШипстер . Проверено 26 февраля 2016 г.
  3. ^ Тернер, Д.А. «Некоторые истории языков функционального программирования» (PDF) .
  4. ^ Скоулз, Джон. «Прямые функции в Dyalog APL» (PDF) .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 964c6c92e92c6f373174c2251793a4a3__1721779260
URL1:https://arc.ask3.ru/arc/aa/96/a3/964c6c92e92c6f373174c2251793a4a3.html
Заголовок, (Title) документа по адресу, URL1:
Guard (computer science) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)