Quais são os métodos/classes de guarda?

acabei de notar o método de guarda/classe mencionado nesta Pergunta e eu realmente não entendo o conceito a partir das respostas. E infelizmente, a ligação do Jon Skeet a um site da MS nunca foi carregada. Algumas pesquisas rápidas do Google pareciam produzir apenas produtos, não conceitos de engenharia de software.

qualquer explicação e/ou amostra seria apreciada. (Especialmente do lado. Net das coisas.)

Author: Community, 2009-10-21

3 answers

As cláusulas de guarda são uma parte da programação orientada a aspectos, onde você pode definir o que é uma entrada permitida para um método.

Pelo que eu sei sobre a implementação. Net (que eu realmente não olhei), você faz isso com atributos, por exemplo

public static void NeverGetNull([ThisParamNotNull]MyClass i, [ThisParamNotNull]OtherClass j)
{
   // Will never need to check for null values on i or j!
}
Na verdade, sei que expressões de guarda são de Erlang, onde o método de expedição depende dos métodos de guarda. Vou dar um pouco de psuedocode abaixo para ilustrar o ponto:
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

Como pode não ser óbvio, você poderia fornecer uma expressão no guarda que é avaliada durante a expedição. Muito fixe, não é?

 1
Author: Khanzor, 2009-10-21 00:04:56

Se não indicar uma excepção, então o. NET irá lançar um RaiseContractFailedEvent, mas poderá indicar ArgumentOutOfRangeException ou ArgumentNullException.

Se você olhar para o link de Jon Skeet, na documentação pdf você verá muitos exemplos, um é:

Contract.Requires( x ! = null );

Isto faz parte da concepção do contrato, onde se especificam pré-condições e pós-condições. A vantagem é que você não tem que fazer muita validação antes de usar os parâmetros de entrada, e ajuda a função de chamada para saber que o resultado será de acordo com o contrato, então, se a string return não é permitido ser um null, então você não tem que testar para null ao chamar a função, devido à verificação do pré-requisito.

 1
Author: James Black, 2009-10-21 01:29:02

Este é um bom resumo do que uma típica cláusula de uso-case de guarda se parece:

Cláusulas de reforço da guarda, ou "como pedir educadamente"

 0
Author: gn22, 2009-10-20 23:50:02