avril
2008
Qui n’a jamais eu à écrire des méthodes qui font pratiquement la meme chose, à un détail près …
Dans ce cas, on peut etre tenté de se dire … bon, ben, je copie-colle, et je modifie le détail.
Sauf que c’est mal … si jamais on a une modification à faire, il faudra le faire dans toutes les fonctions qui ont été copier-collées. Risque d’erreur, difficulté de mainteance, bref … que du malheur.
Tant qu’on peut, il faut factoriser.
Alors, comment factoriser ces méthodes ci :
{
// fait l'étape 1
// fait l'étape 2
// fait l'étape 3
}
void uneDeuxiemeMethode()
{
// fait l'étape 1
// fait l'étape 2, mais légèrement modifiée
// fait l'étape 3
}
On pourrait, comme le laisser sugérer l’exemple, découper en méthodes et simplement écrire 2 étapes 2 différentes. Mais dès fois, cela devient compliqué, quand il y a pas mal de if ou de paramètres, etc …
Une autre méthode est de garder l’implémentation générique et fournir la méthode spécifique en paramètre. Ceci est faisable très simplement avec les delegates de C#.
Prenons cet exemple :
{
public delegate void MonHandlerDeMethode();
private void Etape1()
{
Console.WriteLine("Je fais l'étape 1");
}
private void Etape2()
{
Console.WriteLine("Je fais l'étape 2");
}
private void Etape3()
{
Console.WriteLine("Je fais l'étape 3");
}
public void Run()
{
Etape1();
Etape2();
Etape3();
}
}
public class Test
{
public void FaireQQchose()
{
MonObjet obj = new MonObjet();
obj.Run();
}
}
static void Main()
{
new Test().FaireQQchose();
}
l’appel de la méthode Run() affiche successivement les témoins des étapes 1, 2 et 3.
Maitenant, si je veux fournir ma propre implémentation de la méthode 2, je peux écrire ceci :
{
public delegate void MonHandlerDeMethode();
private void Etape1()
{
Console.WriteLine("Je fais l'étape 1");
}
private void Etape2()
{
Console.WriteLine("Je fais l'étape 2");
}
private void Etape3()
{
Console.WriteLine("Je fais l'étape 3");
}
public void Run(MonHandlerDeMethode autreEtape2)
{
Etape1();
autreEtape2();
Etape3();
}
}
public class Test
{
public void FaireQQchose()
{
MonObjet obj = new MonObjet();
obj.Run(delegate
{
Console.WriteLine("Je fais une autre étape 2");
});
}
}
static void Main()
{
new Test().FaireQQchose();
}
on passe en paramètre à la méthode Run() la méthode que je veux exécuter à la place de l’étape 2. Et ca nous affiche bien qu’on execute une autre méthode 2.
Ainsi, dans ma méthode Run(), je peux factoriser les éléments communs tout en gardant une place pour un élément spécifique.
Il est également possible de garder une implémentation par défaut, au cas où on passe null en paramètre de Run()
{
Etape1();
if (autreEtape2 == null)
Etape2();
else
autreEtape2();
Etape3();
}
obj.Run(null);
Bien sur, on peut passer des paramètres, il suffit de modifier la définition du delegate
public delegate void MonHandlerDeMethode(string unParam);
{
Etape1();
autreEtape2("avec un paramètre");
Etape3();
}
{
Console.WriteLine("Je fais une autre étape 2 {0}", unParam);
});
1 Commentaire + Ajouter un commentaire
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
salut,
Je suis d’accord avec toi, la factorisation est un principe essentiel du developpement. Par contre, surtout, ne l’applique pas au SQL!
http://blog.developpez.com/index.php?blog=186&title=sgbd_optimisation_avant_d_optimiser_comm&more=1&c=1&tb=1&pb=1