Question

Je suis en train de coder une simple couche d'accès aux données et je me demandais quel type je devrais exposer aux autres couches.

Je vais implémenter les données en interne en tant que liste < > ;, mais je me souviens d'avoir lu quelque chose sur le fait de ne pas exposer le type de liste aux consommateurs s'il n'était pas nécessaire.

public List<User> GetAllUsers() // non C# users: that means List of User :)

Savez-vous pourquoi (Google n'a pas aidé)? Qu'exposez-vous habituellement pour ce genre de choses? IListe? IEnumerable?

Était-ce utile?

La solution

Habituellement, il est préférable d’exposer l’interface la moins puissante avec laquelle l’utilisateur peut encore travailler de manière significative. Si l'utilisateur n'a besoin que de données énumérables, retournez IEnumerable < User > . Si cela ne suffit pas, car l'utilisateur doit pouvoir modifier la liste (attention! Ne devrait pas souvent être le cas), renvoyez un IList < User > .

/ EDIT:

Joel pose une question valide dans son commentaire: Pourquoi exposer l’interface la moins puissante au lieu d’accorder le maximum de puissance à l’utilisateur? (paraphrasé)

L'idée sous-jacente est que la méthode qui renvoie les données ne s'attend pas à ce que l'utilisateur modifie son contenu: une autre méthode de la classe peut toujours s'attendre à ce que la liste soit non vide après le renvoi d'une référence. Imaginez que l'utilisateur supprime toutes les données de la liste. L’autre méthode doit maintenant vérifier que c’est peut-être inutile.

Plus important encore, cela expose des parties de l'implémentation interne via le type de retour. Si j’ai besoin de changer l’implémentation à l’avenir pour qu’elle n’utilise plus de conteneur IList , j’ai un problème: je dois soit changer le contrat de méthode, en introduisant une modification révolutionnaire. Ou j'ai besoin de copier les données dans un conteneur de liste.

Par exemple, imaginez qu’une implémentation efficace utilise un dictionnaire et ne renvoie que la collection Values ?? qui n’implémente pas IList .

Autres conseils

Certainement un ISomething. L'utilisation d'une interface réduira le couplage et facilitera la modification ultérieure des détails de la mise en œuvre de votre couche de données. Quelle interface dépend des circonstances. IList est bon, mais vous pouvez parfois avoir besoin de la fonctionnalité ICollection ou vouloir spécifier des valeurs en lecture seule.

Vous devez bien réfléchir avant de retourner IEnumerable. Si le code sous-jacent utilise " rendement " pour générer IEnumerable ou si vous utilisez LINQ, vous devrez alors ouvrir toutes les ressources utilisées.

Vous devez copier le IEnumerable dans un autre IEnumerable avant de le renvoyer. En utilisant IList, vous en faites une exigence, afin que personne ne puisse par inadvertance retourner un IEnumerable.

D'autre part, renvoyer un IList implique pour l'appelant qu'il peut modifier la liste renvoyée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top