Question

J'ai une méthode de classe qui renvoie une liste d'employés sur laquelle je peux parcourir.Quelle est la meilleure façon de renvoyer la liste ?En général, je renvoie simplement une ArrayList.Cependant, si j'ai bien compris, les interfaces sont mieux adaptées à ce type d'action.Quelle serait la meilleure interface à utiliser ?Aussi, pourquoi est-il préférable de renvoyer une interface plutôt que l’implémentation (par exemple un objet ArrayList) ?Cela me semble simplement que c'est beaucoup plus de travail.

Était-ce utile?

La solution

Personnellement, j'utiliserais un Liste<Employé> pour créer la liste sur le backend, puis utilisez Liste IL lorsque vous revenez.Lorsque vous utilisez des interfaces, cela vous donne la possibilité de modifier l'implémentation sans avoir à modifier qui utilise votre code.Si vous vouliez vous en tenir à une ArrayList, ce serait une liste non générique. Liste IL.

Autres conseils

@ Jason

Vous pouvez aussi bien renvoyer IList<> car un tableau implémente réellement cette interface.

La meilleure façon de faire quelque chose comme ça serait de renvoyer, comme vous le dites, une liste, de préférence en utilisant des génériques, ce serait donc une liste.<Employee>.

Renvoyer une liste plutôt qu'une ArrayList signifie que si plus tard vous décidez d'utiliser, par exemple, une LinkedList, vous n'avez pas besoin de modifier le code autre que l'endroit où vous créez l'objet pour commencer (c'est-à-dire l'appel à "new Liste des tableaux())".

Si tout ce que vous faites est de parcourir la liste, vous pouvez définir une méthode qui renvoie la liste sous la forme IEnumerable (pour .NET).

En renvoyant l'interface qui fournit uniquement les fonctionnalités dont vous avez besoin, si un nouveau type de collection apparaît à l'avenir qui est meilleur/plus rapide/une meilleure correspondance pour votre application, tant qu'il implémente toujours IEnumerable, vous pouvez réécrire complètement votre méthode, en utilisant le nouveau type à l’intérieur, sans changer aucun du code qui l’appelle.

Y a-t-il une raison pour laquelle la collection doit être commandée ?Pourquoi ne pas simplement retourner un IEnumerable<Employee>?Cela donne le strict minimum requis - si vous souhaitez plus tard une autre forme de stockage, comme un sac, un ensemble ou un arbre ou autre, votre contrat restera intact.

Je ne suis pas d'accord avec le principe selon lequel il est préférable de renvoyer une interface.Ma raison est que vous souhaitez maximiser l’utilité d’un bloc de code donné.

Dans cet esprit, une interface fonctionne pour accepter un élément comme argument.Si un paramètre de fonction appelle un tableau ou une ArrayList, c'est la seule chose que vous pouvez lui transmettre.Si un paramètre de fonction appelle un IEnumerable, il acceptera l'un ou l'autre, ainsi qu'un certain nombre d'autres objets.C'est plus utile

La valeur de retour, cependant, fonctionne à l'opposé.Lorsque vous renvoyez un IEnumerable, la seule chose que vous pouvez faire est de l'énumérer.Si vous avez une liste à portée de main et que vous la renvoyez, le code qui appelle votre fonction peut également facilement faire un certain nombre d'autres choses, comme obtenir un décompte.

Je suis cependant uni à ceux qui vous conseillent de vous éloigner de l'ArrayList.Les génériques sont tellement mieux.

Une interface est un contrat entre l’implémentation et l’utilisateur de l’implémentation.

En utilisant une interface, vous permettez à l'implémentation de changer autant qu'elle le souhaite tant qu'elle maintient le contrat pour les utilisateurs.

Il permet également à plusieurs implémentations d'utiliser la même interface afin que les utilisateurs puissent réutiliser le code qui interagit avec l'interface.

Vous ne dites pas de quelle langue vous parlez, mais dans quelque chose de .NETish, alors ce n'est pas plus de travail de renvoyer une IList qu'une List ou même une ArrayList, bien que la simple mention de cette classe obsolète me fasse penser que vous êtes je ne parle pas de .NET.

Une interface est essentiellement un contrat selon lequel une classe possède certaines méthodes ou attributs ;la programmation sur une interface plutôt qu'une implémentation directe permet un code plus dynamique et plus gérable, car vous pouvez complètement échanger les implémentations tant que le "contrat" ​​est toujours en vigueur.

Dans le cas que vous décrivez, passer une interface ne vous donne pas d'avantage particulier, si c'était moi, je passerais l'ArrayList avec le type générique, ou passerais le Array lui-même :liste.toArray()

En fait, vous ne devriez pas renvoyer une liste s'il s'agit d'un framework, du moins pas sans y penser, la classe recommandée à utiliser est une collection.La classe List présente quelques améliorations de performances au prix de problèmes d'extensibilité du serveur.C'est en fait une règle FXCop.

Vous avez le raisonnement pour cela dans Cet article

Le type de retour de votre méthode doit être IList<Employee>.

Cela signifie que l'appelant de votre méthode peut utiliser tout ce qui IList offres mais ne peut pas utiliser des éléments spécifiques à ArrayList.Alors si tu ressens à un moment donné que LinkedList ou YourCustomSuperDuperList offre de meilleures performances ou d'autres avantages, vous pouvez l'utiliser en toute sécurité dans votre méthode et ne pas en tromper les appelants.

Cela correspond à peu près aux interfaces 101.;-)

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