Question Une liste devrait-elle être privée?


J'ai besoin de votre avis à ce sujet car j'ai lu beaucoup de choses différentes sur le sujet. Si tu as un List<T> ou toute sorte de liste dans une déclaration de classe le rendez-vous privé et puis ajoutez ou supprimez des éléments en utilisant des méthodes spécifiques ou le rendez-vous public?

Vos points de vue seraient très appréciés avec tous les inconvénients / avantages de chaque option.

Pour donner un exemple, disons que nous avons un class Employer avec champs privés name et List<Employees>. Ma question est la suivante: devrions-nous faire en sorte que la liste des employés soit privée ou publique et quels en seraient les avantages et les inconvénients?


11
2017-10-05 11:50


origine


Réponses:


pour List explicitement, oui, il devrait être privé en fonction des fonctionnalités que vous exposez, les interfaces telles que IEnuemerable, ICollection ou IList seraient un meilleur choix ou si vous exposez une collection Voir la réponse de SLaks.

En général, exposer la structure interne et l'état est une mauvaise idée et comme votre objet de type Liste est les deux, vous souhaitez le garder interne. Il peut être judicieux de donner à l'utilisateur la possibilité de l'itérer, d'ajouter ou de supprimer des éléments, mais vous devez toujours garder la liste interne et exposer des méthodes d'ajout / suppression ou au minimum exposer une interface permettant de modifier la liste. type de la représentation interne sans affecter l'interface publique.

De plus, si vous exposez en utilisant une interface, vous devez choisir l'interface la plus étroite possible.

Donc, si le code client doit seulement l'énumérer. utilisez IEnumerable si le code client doit utiliser l'indexation ICollection, etc.

de plus, si vous exposez en tant que IEnumerable, vous devez vous assurer que tout ce que vous retournez est en fait uniquement lu en utilisant une classe de collection en lecture seule ou en utilisant un bloc itérateur

EDIT après la mise à jour En ce qui concerne votre exemple. Demandez-vous s'il est logique que quelqu'un, à l'exception de l'employeur, puisse changer qui sont ses employés. pour moi c'est dans les mots que vous avez déjà choisis. L'employeur emploie l'employé et devrait avoir un contrôle total sur ses employés. Donc, dans ce cas particulier, je le garderais privé et exposerais Engager (employé IEmployee) et Fire (employé IEmployee) de cette manière, le code indique clairement l'intention


6
2017-10-05 12:00



Si vous devez exposer une collection aux utilisateurs de votre classe, vous devez créer une propriété en lecture seule avec un System.Collections.ObjectModel.Collection<T>.

Vous pouvez ensuite hériter de cette classe et remplacer InsertItem, RemoveItem, et SetItem exécuter une logique personnalisée lorsque l'utilisateur manipule la collection.

Si vous ne voulez pas que l’utilisateur puisse modifier la collection, vous devez exposer une ReadOnlyCollection<T>.

Dans votre exemple spécifique, vous devriez probablement exposer un ReadOnlyCollection<Employee> avec des méthodes de mutateur séparées dans Employer.


4
2017-10-05 11:52



Et si tout ce que vous voulez, c'est que quelqu'un puisse énumérer la liste, vous pouvez exposer un iEnumerable dont la fonction GetEnumerator appelle simplement la fonction GetEnumerator de la liste.


3
2017-10-05 14:12



Selon le catalogue de refactoring, il est toujours préférable d’encapsuler les collections. Cela évite que quelqu'un écrase accidentellement les données en ajoutant ou en supprimant des éléments de la liste. Si vous n'avez pas besoin de protéger vos données contre les modifications accidentelles, vous pouvez retourner une liste normale.

En exposant les méthodes d'ajout et de suppression, vous obtenez l'avantage de ne modifier que par ces méthodes.


1
2017-10-05 12:08



Dépend de la fonctionnalité que vous voulez. Si vous voulez simplement que les gens puissent manipuler la liste, vous pouvez l'exposer via une propriété en lecture seule (sans le setter). Si vous souhaitez que du code supplémentaire soit exécuté lorsque les utilisateurs manipulent la liste, vous devez écrire vos propres méthodes et ne pas exposer la liste.


0
2017-10-05 11:56