Что такое защитные методы/классы?

я только что заметил метод/класс защиты, упомянутый в этом вопросе, и я действительно не понимаю понятие из ответов. И, увы, ссылка Джона Скита на сайт MS так и не загрузилась. Несколько быстрых поисков в Google, казалось, выдали только продукты, а не концепции разработки программного обеспечения.

Буду признателен за любое объяснение и/или образцы. (Особенно со стороны .Net.)


person Paul Sasik    schedule 20.10.2009    source источник
comment
Ссылка из ответа Джона работает для меня - возможно, вам стоит попробовать еще раз :)   -  person Andrew Hare    schedule 21.10.2009
comment
Это были только вы: http://downforeveryoneorjustme.com/http://research.microsoft.com/en-us/projects/contracts/   -  person Chris Lutz    schedule 21.10.2009


Ответы (3)


Предложения Guard являются частью аспектно-ориентированного программирования, где вы можете определить, что является допустимым входом для метода.

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

public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j)
{
   // Will never need to check for null values on i or j!
}

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

myMethod(input i) where i is an int
{
 return i + 10
}
myMethod(input i) where i is an int and i > 10
{
 return i - 10
}

var i = myMethod(1) // returns 11
var i = myMethod(i) // returns 1

Как может быть неочевидно, вы можете указать выражение в Guard, которое оценивается во время отправки. Довольно аккуратно, а?

person Khanzor    schedule 21.10.2009
comment
Интересно. Что происходит, когда ввод недопустим? Например, в вашем примере псевдокода вы начинаете со значения -5? - person Paul Sasik; 21.10.2009
comment
Что ж, если все охранники не работают, то и вызов метода завершается ошибкой. Этому нет равных. Это то же самое, что когда вы пытаетесь вызвать метод, для которого у вас нет соответствующей подписи в C#. Но в моем примере -5 является допустимым вводом, поэтому сначала вы получите 5, затем 15, вызов метода в третий раз даст 5. Надеюсь, это проясняет ситуацию? - person Khanzor; 21.10.2009

Если вы не укажете исключение, .NET выдаст RaiseContractFailedEvent, но вы можете указать ArgumentOutOfRangeException или ArgumentNullException.

Если вы посмотрите на ссылку Джона Скита, в документации в формате pdf вы увидите много примеров, один из них:

Contract.Requires( x ! = null );

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

person James Black    schedule 21.10.2009

Это довольно хорошее краткое изложение того, как выглядит типичный вариант использования сторожевого предложения:

Рефакторинг сторожевых оговорок, или "Как вежливо попросить"

person gn22    schedule 20.10.2009
comment
я посмотрел на эту статью по ссылке и, честно говоря, из последующего обсуждения это больше похоже на то, как НЕ делать защитные оговорки. - person Paul Sasik; 21.10.2009