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

- Technofolies, votre évènement numérique de l'année par Le Blog (Vert) d'Arnaud JUND le 09-26-2014, 18:40

- Xamarin : From Zero to Hero par Fathi Bellahcene le 09-24-2014, 17:35

- Conférences d’Automne 2014 par Le blog de Patrick [MVP SharePoint] le 09-24-2014, 14:53

- [TFS] Supprimer un projet de Visual Studio Online par Blog de Jérémy Jeanson le 09-22-2014, 20:42

- Nouveau blog en anglais / New blog in english ! par Le blog de Patrick [MVP SharePoint] le 09-18-2014, 18:42

- [ #Yammer ] From Mailbox to Yammer and back / De votre messagerie vers Yammer et retour ! par Le blog de Patrick [MVP SharePoint] le 09-15-2014, 11:31

- [ #Office 365 ] New service settings panel / Nouveau panneau de paramétrage des services par Le blog de Patrick [MVP SharePoint] le 09-11-2014, 08:50

- Problème de déploiement pour une démo SharePoint/TFS? par Blog de Jérémy Jeanson le 09-10-2014, 21:52

- [ #Office365 ] Delve first impressions / Premières impressions sur Delve par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 16:57

- [ #Office365 ] How to change Administration console language ? / Comment changer la langue de la console d’administration ? par Le blog de Patrick [MVP SharePoint] le 09-09-2014, 08:25