57 votes

Pourquoi est-il considéré comme mauvais d'exposer List<T> ?

Selon FXCop, List ne doit pas être exposé dans un modèle d'objet d'API. Pourquoi cela est-il considéré comme une mauvaise pratique ?

52voto

Jon Limjap Points 46429

Je suis d'accord avec moose-in-the-jungle ici : List<T> est un objet non contraint et gonflé qui contient beaucoup de "bagages".

Heureusement, la solution est simple : exposer IList<T> à la place.

Il expose une interface simple qui possède la plupart des éléments suivants List<T> (à l'exception de choses telles que AddRange() ) et il ne vous contraint pas à l'utilisation spécifique de la List<T> ce qui permet à vos consommateurs d'API d'utiliser leurs propres implémentations personnalisées du type IList<T> .

Pour encore plus de flexibilité, envisagez d'exposer certaines collections à IEnumerable<T> le cas échéant.

26voto

edgi Points 1969

Il y a les 2 raisons principales :

  • List<T> est un type plutôt gonflé avec de nombreux membres non pertinents dans de nombreux scénarios (il est trop "chargé" pour les modèles d'objets publics).
  • La classe n'est pas scellée, mais n'est pas spécifiquement conçue pour être étendue (vous ne pouvez pas surcharger les membres).

6voto

Scott Wisniewski Points 14420

Ce n'est considéré comme une mauvaise pratique que si vous écrivez une API qui sera utilisée par des milliers ou des millions de développeurs.

Les directives de conception du cadre .NET sont destinées aux API publiques de Microsoft.

Si vous disposez d'une API qui n'est pas utilisée par un grand nombre de personnes, vous devez ignorer l'avertissement.

3voto

leora Points 5626

Je pense que vous ne voulez pas que vos consommateurs ajoutent de nouveaux éléments dans votre retour. Une API doit être claire et complète et si elle renvoie un tableau, elle doit renvoyer la structure de données exacte. Je ne pense pas que cela ait quelque chose à voir avec T, mais plutôt avec le fait de renvoyer directement une liste<> au lieu d'un tableau [].

2voto

Anthony Kolesov Points 1156

L'une des raisons est que l'utilisateur pourra modifier la liste et que le propriétaire de la liste n'en saura rien, alors que dans certains cas, il doit faire certaines choses après avoir ajouté/supprimé des éléments de la liste. Même si ce n'est pas nécessaire maintenant, cela peut le devenir à l'avenir. Il est donc préférable d'ajouter la méthode AddXXX / RemoveXXX au propriétaire de la classe et d'exposer la liste comme un IEnumerable ou (ce qui est mieux à mon avis) de l'exposer comme un IList et d'utiliser ObservableCollection de WindowsBase.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X