2009-10-20 7 views
2

Je viens de remarquer la méthode de protection/classe mentionnée dans ce question et je ne comprends pas vraiment le concept des réponses. Et hélas, le lien de Jon Skeet vers un site MS n'a jamais été chargé. Quelques recherches rapides sur Google semblaient ne donner que des produits, pas des concepts de génie logiciel.Que sont les méthodes/classes de garde?

Une explication et/ou des échantillons seraient appréciés. (. Surtout du côté .Net des choses)

+0

Le lien de la réponse de Jon fonctionne pour moi - peut-être que vous devriez l'essayer à nouveau :) –

+0

C'était juste vous: http://downforeveryoneorjustme.com/http://research.microsoft.com/en-us/projects/ contrats/ –

Répondre

1

clauses de garde sont une partie d'un aspect orienté programmation, où vous pouvez définir ce qu'est une entrée admissible à une méthode. D'après ce que je sais de l'implémentation .Net (que je n'ai pas vraiment étudiée), vous faites cela avec des attributs, par ex. Je connais en fait les expressions de garde d'Erlang, où la répartition des méthodes dépend des méthodes de garde. Je vais vous donner un peu de psuedocode ci-dessous pour illustrer ce point:

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 

Comme on pouvait ne pas être évidente, vous pouvez fournir une expression dans la garde qui est évaluée au cours de l'expédition. Assez soigné, hein?

+0

Intéressant. Que se passe-t-il lorsque l'entrée n'est pas autorisée? Comme dans votre exemple de pseudo-code, vous commencez avec une valeur de -5? –

+0

Eh bien, si tous les gardes échouent, alors l'appel de méthode échoue. Il n'y a pas de correspondance pour ça. C'est la même chose que lorsque vous essayez d'appeler une méthode pour laquelle vous n'avez pas de signature correspondante en C#. Mais dans mon exemple, -5 est une entrée valide, donc d'abord vous obtiendriez 5, puis 15, appelant la méthode une troisième fois donnerait 5. Espérons que cela l'efface? – Khanzor

0

Ceci est un très bon aperçu de ce qu'est un cas d'utilisation de la clause de garde typique ressemble à:

Refactoring guard clauses, or “How to ask politely”

+0

J'ai regardé cet article à partir du lien et honnêtement de la discussion par la suite, il semble plus comme comment ne pas faire des clauses de garde. –

1

Si vous ne spécifiez pas d'exception, .NET lancera un RaiseContractFailedEvent, mais vous pouvez spécifier ArgumentOutOfRangeException ou ArgumentNullException.

Si vous regardez le lien de Jon Skeet, la documentation pdf, vous verrez de nombreux exemples, on est:

Contract.Requires(x ! = null); 

Cela fait partie du contrat de conception, vous permet de spécifier des conditions préalables et postconditions. L'avantage est que vous n'avez pas à faire beaucoup de validation avant d'utiliser les paramètres d'entrée, et cela aide la fonction appelante à savoir que le résultat sera en accord avec le contrat, donc, si le retour de chaîne n'est pas autorisé à être nul, alors vous n'avez pas besoin de tester null lorsque vous appelez la fonction, en raison de la vérification préalable.

Questions connexes