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.)
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 é?
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.
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"