J'ai quelques classes dans mon projet actuel où la validation des adresses e-mail / site Web est nécessaire. Les méthodes à faire sont toutes les mêmes. p>
Je me demandais quelle est la meilleure façon de mettre en œuvre cela, donc je n'ai pas besoin de copier ces méthodes collé partout? p>
Les classes elles-mêmes ne sont pas nécessairement liées, elles n'ont que ces méthodes de validation en commun. P>
9 Réponses :
Vous voudrez peut-être mettre tout le code de validation dans une classe de validateur, puis utilisez cette classe n'importe où que la validation est nécessaire. L'accès à la validation devrait être via une méthode unique, Plus tard, vous pouvez avoir des sous-classes de validateur que peut-être plus spécifiques ou faire différents types de validation. P>
Vous pouvez également avoir toutes les classes nécessitant une validation étendre une classe de base ou une classe abstraite qui a 90% de la validation. P> valider (objet quelque chose) code> peut-être. Je pense que cela s'appelle "composition" (jusqu'aux modèles de conception Go). P>
Le meilleur terme est "Association", qui est une relation de classe ( en.wikipedia.org/wiki/ ... ) plutôt qu'un motif. Quant aux modèles, le modèle de stratégie ( en.wikipedia.org/wiki/strategy_pattern ) pourrait être impliqué.
Que diriez-vous d'ajouter une interface et d'utiliser une méthode d'extension?
public interface IFoo { }
public class A : IFoo {}
public class B : IFoo {}
public class C : IFoo {}
public static class FooUtils {
public static void Bar(this IFoo foo) { /* impl */ }
}
À l'intérieur de la classe A, puis-je accéder maintenant à la barre de la méthode?
Yep var a classe = nouveau A (); Classe.bar ();
ressemble à la méthode d'extension abus à moi. pourquoi avez-vous besoin de toutes les classes nécessitant une validation par courrier électronique pour implémenter une interface (vide) et une méthode d'extension de la magie sur celle-ci s'ils pouvaient plutôt appeler une méthode statique d'une classe EmailUtils (ou créer un objet EmailValidator et appelez la méthode de validation. dessus)? Il semble également qu'il ne nécessite que le code de validation par courrier électronique dans les classes - qui ne devraient pas nécessiter la mise en œuvre d'une interface.
C'est certainement une mauvaise utilisation d'interfaces et de méthodes d'extension. Assez effrayant qu'il a reçu le plus de votes et a été marqué comme la réponse.
Cela sonne comme un "exploitant" pour surmonter le manque de héritage de classe multiple dans C #. Cela peut sembler conceptuellement, mais le résultat serait identique à héritier de la classe "FOO" avec sa propre implémentation de "bar". Les problèmes viennent quand vous devez également hériter d'une autre classe, et c'est là que la solution de Marc vient de.
Créez des classes et des interfaces de la logique de validation, et faites-les être injectés dans votre code ... ainsi séparer la logique de la validation afin qu'elle puisse être réutilisée ... P>
Créer une classe d'utilitaire et définir ces méthodes comme méthodes d'extension pour les classes / interfaces appropriées. P>
Oui, la duplication Ce code serait une mauvaise odeur, vous pouvez extraire ces méthodes à une seule classe d'assistance dans des méthodes statiques ou que vous pouvez définir une classe d'interface "validateur" et utiliser cette interface, vous pouvez relier différentes méthodes de validation avec la chaîne de chaîne de Motif de responsabilité. P>
On dirait que vous avez juste besoin d'une classe statique avec une méthode statique
+1 La classe d'utilité semble être la voie à suivre ici. Avoir une classe d'utilité avec des méthodes statiques qui valident des courriels, de vérifier les adresses Web et d'autres types de validations. Et appelez ces méthodes statiques utilitaires chaque fois que vous avez besoin de ces méthodes.
Créer (faire de même pour le site Web). p> email code> comme une classe distincte.
Utilisez email code> comme propriétés / paramètres / valeurs de retour dans vos classes au lieu de chaîne code>.
Créer emailValidator code> pour valider les chaînes comme adresses électroniques.
Créer EmailFactory code> qui renvoie le courrier électronique lors de la réussite d'une adresse e-mail valide et de null sinon. p>
Vous devez vraiment jeter un coup d'œil à la méthodologie de programmation orientée vers l'aspect (AOP). La bibliothèque d'entreprise 4.1 a une implémentation de l'AOP appelée Unity Interception. P>
http://msdn.microsoft.com/en-us/library /dd140045.aspx p>
Ce cadre vous permet de coder une classe de gestionnaire unique pour la validation du courrier électronique. Donc, ce que cela implique, c'est que le code de validation passe dans une classe de gestionnaire et ne fait plus partie de la classe (ES). La prochaine chose que vous faites est de marquer les classes d'interception. p>
Vous pouvez intercepter les classes de différentes manières, y compris la définition d'un attribut sur la méthode souhaitée qui doit être interceptée et manipulée selon vos besoins. Définir un attribut est probablement le moyen le plus simple de faire une interception. P>
Je vous recommanderais de créer une interface Itivalidator puis créez plusieurs validateurs différents qui gèrent différents scénarios. Voici un exemple:
SomeSimpleClass simple = container.Resolve<SomeSimpleClass>(); SomeComplexClass complex = container.Resolve<SomeComplexClass();
Que font les classes d'autre? Pour la clarté, une classe devrait avoir un seul but. La solution frustréeWithFormsDes suit ce principe.