Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

C# 3.0 : Pourquoi il ne faut pas utiliser les extension methods

Dans la lignée de mon message "Pourquoi ne faut il plus utiliser l'héritage de classe", voici la suite. Par contre, celui-ci est très sérieux.

Les méthodes d'extension ont été introduites dans C# 3.0 comme une solution pour permettre au mapping syntaxique (plus d'info sur ça ici) de LINQ de fonctionner correctement avec IEnumerable, sans avoir à modifier IEnumerable (ce qui poserait d'énormes problèmes au code existant). Malheureusement si elles sont pratiques pour ce cas précis (et sont effectivement la meilleure solution), dans 95% des cas, elles posent de graves problèmes de versionning, et doivent donc être utilisées avec une extrême prudence. Voici un exemple du problème.

Supposons qu'un éditeur tierce (ou même un autre développeur de votre équipe) développe un assembly x.dll. Dans cet assembly nous avons une classe MyClass :

public class MyClass
{
    // ...
}

Vous décidez d'écrire une méthode d'extension pour MyClass qui s'appelle par exemple Add :

public static void Add( this MyClass target, object item)
{
    // ...
}

Vous utilisez cette méthode d'extension un peu partout dans votre code.

L'assembly x.dll passe alors en version 2.0, et il se trouve que l'éditeur ajoute une méthode Add à MyClass, qui a un comportement différent de votre méthode d'extension (ce qui sera toujours le cas, à moins d'une grosse coïncidence) :

public class MyClass
{
    // ...

    public void Add( object
item)
    {
        // ...
    }
}

Le code va compiler sans problème (vous n'aurez même pas de Warning), mais le comportement de votre code sera changé. Si vous utilisez la méthode Add pour un objet de type MyClass, c'est maintenant la méthode d'instance qui sera appelée au lieu de la méthode d'extension.

Ce problème très grave n'a pas vraiment de solution. Il y a quelques usages à respecter pour réduire le risque, mais il existera toujours :

  • N'utilisez les méthodes d'extensions qu'en dernier recours
  • Ne définissez des méthodes d'extension que pour des types qui ont relativement peu de chances de changer, comme des types basiques du Framework .NET (comme IEnumerable par exemple).

D'autres blogs parlent de ce problème :

Publié jeudi 6 décembre 2007 11:01 par RaptorXP
Classé sous : , , , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: C# 3.0 : Pourquoi il ne faut pas utiliser les extension methods

L'usage des méthodes d'extension doit se faire avec parcimoni.

Dans le cas où on ne peut pas faire autrement, ce qu'on peut donner comme consigne pour éviter le problème que tu évoques mais aussi pour éviter de se retrouver en conflit par appel ambigu de méthodes d'extension (Dans le cas, où on a deux méthodes d'extension de même signature en dehors de l'espace de nom), c'est de préfixer ou de suffixer ses propres méthodes d'extension par quelques lettres (3 ou 4) indiquant la provenance (l'entreprise par exemple).

jeudi 6 décembre 2007 13:20 by tkfe

# re: C# 3.0 : Pourquoi il ne faut pas utiliser les extension methods

Comme tout un tas de particularité de .NET (en commençant par l'optionnel gestion des exceptions) il faut les utiliser avec parcimonie et en connaissance de cause. Le but n'étant pas de claquer du Linq, des méthodes d'extension et autres nouveautés .NET 3 partout juste pour l'effet de style ;-) Enfin c'est tellement bon aussi ...

jeudi 6 décembre 2007 17:40 by neodante

# re: C# 3.0 : Pourquoi il ne faut pas utiliser les extension methods

L'idée d'utiliser un préfixe/suffixe me parait excellente : Elle garde l'avantage des méthodes d'extension mais protègent des effets néfastes des nouvelles versions !

Mais pour ma part, je préfèrerais un suffixe, car c'est plus naturel de penser au nom de la fonction (Add ici) que de l'entreprise qui l'a développée Wink

jeudi 6 décembre 2007 18:07 by FREMYCOMPANY

# re: C# 3.0 : Pourquoi il ne faut pas utiliser les extension methods

C'est vrai que cette idée de préfixe peut être pas mal, par exemple, on préfixe bien les noms d'interface par "I". On pourrait préfixer les méthodes d'extension par Ext par exemple.

Ce que j'aimerais bien c'est que Microsoft nous donne des guidelines là dessus.

jeudi 6 décembre 2007 19:13 by RaptorXP
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Après Montréal, ce sera Barcelone, rendez-vous à la European SharePoint Conference 2014 ! par Le blog de Patrick [MVP SharePoint] le 04-19-2014, 09:21

- Emportez votre sélection de la MSDN dans la poche ? par Blog de Jérémy Jeanson le 04-17-2014, 22:24

- [ #Office365 ] Pb de connexion du flux Yammer ajouté à un site SharePoint par Le blog de Patrick [MVP SharePoint] le 04-17-2014, 17:03

- NFluent & Data Annotations : coder ses propres assertions par Fathi Bellahcene le 04-17-2014, 16:54

- Installer un site ASP.net 32bits sur un serveur exécutant SharePoint 2013 par Blog de Jérémy Jeanson le 04-17-2014, 06:34

- [ SharePoint Summit Montréal 2014 ] Tests de montée en charge SharePoint par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 20:44

- [ SharePoint Summit Montréal 2014 ] Bâtir un site web public avec Office 365 par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 18:30

- Kinect + Speech Recognition + Eedomus = Dommy par Aurélien GALTIER le 04-16-2014, 17:17

- [ SharePoint Summit Montréal 2014 ] Une méthodologie simple pour concevoir vos applications OOTB SharePoint de A à Z par Le blog de Patrick [MVP SharePoint] le 04-16-2014, 16:51

- //Lean/ - Apprendre à faire des Apps Windows universelles par Blog de Jérémy Jeanson le 04-16-2014, 12:57