juillet
2008
J’avais déjà parlé d’une solution pour factoriser dans ce billet à l’aide des delegate qui s’avère pratique notamment lorsqu’on veut passer en paramètre un bout de code qui change dans un algorithme complet.
Une autre solution est d’utiliser le design pattern Patron de méthode (Template method pattern).
Je vous renvoi à Wikipédia pour une définition plus complète, sachez simplement qu’il s’agit d’avoir une méthode qui définit un algorithme (découpé en plusieurs méthodes) dont les implémentations peuvent être redéfinies dans les classes enfants.
A travers un exemple c’est encore plus simple, soit la classe suivante :
{
protected virtual void Methode1() { Console.WriteLine("Methode 1"); }
protected virtual void Methode2() { Console.WriteLine("Methode 2"); }
protected virtual void Methode3() { Console.WriteLine("Methode 3"); }
public void Execute()
{
Methode1();
Methode2();
Methode3();
}
}
La méthode Execute correspond à notre méthode qui effectue un algorithme.
On peut l’appeler ainsi :
algo.Execute();
Les méthodes sont marquées comme étant virtuelles, donc surchargeable, mais fournissent une implémentation par défaut des étapes de l’algo.
Maintenant, imaginons que je veuille un algo légèrement différent. J’ai juste à créer une nouvelle classe qui hérite de la classe de base, et à surcharger la méthode que je veux modifier.
{
protected override void Methode2()
{
Console.WriteLine("Ma méthode 2 de algo 1");
}
}
Et je peux l’appeler ainsi :
algo1.Execute();
Si on veut forcer une des étapes à être obligatoirement implémentée, il suffira de ne pas fournir d’implémentation par défaut pour la méthode, par exemple :
{
protected virtual void Methode1() { Console.WriteLine("Methode 1"); }
protected virtual void Methode2() { throw new NotImplementedException(); }
protected virtual void Methode3() { Console.WriteLine("Methode 3"); }
public void Execute()
{
Methode1();
Methode2();
Methode3();
}
}
On peut bien sur, si besoin, empecher d’utiliser directement la classe de base pour forcer à utiliser une classe dérivée en marquant la classe de base comme étant abstraite :
{
protected virtual void Methode1() { Console.WriteLine("Methode 1"); }
protected virtual void Methode2() { throw new NotImplementedException(); }
protected virtual void Methode3() { Console.WriteLine("Methode 3"); }
public void Execute()
{
Methode1();
Methode2();
Methode3();
}
}
Voilà pour le patron de méthode.
Dès qu’on le peut, il faut toujours essayer de factoriser et éviter la duplication de code. Moins d’erreur, moins de maintenance … adieu le copier/coller
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007