Quels sont les problèmes de conception liés au renvoi d'une table de hachage à partir d'une méthode publique lorsque vous souhaitez renvoyer plusieurs éléments au lieu de créer une classe et d'en renvoyer un objet?
S'il a des problèmes, dans quelles circonstances est-il logique de le faire?
Comment la réponse à cette question change-t-elle selon que la langue est dynamique ou non?
Modifier: c'est pour clarifier que les clés seraient constantes et font partie du code, pas des données. Quelque chose pour lequel nous créons généralement une classe. La question est de savoir pourquoi serait-il mal d'utiliser la table de hachage à la place si la création d'une classe semble effectivement être le bon choix.
la source
L'un des problèmes serait que dans de nombreux cas, la clé de la table de hachage serait une chaîne. Ainsi, les consommateurs de la méthode devraient savoir à l'avance quelles clés utiliser pour extraire les données. Cela donnerait le potentiel d'erreurs dues à des fautes d'orthographe lors de l'accès aux données.
Un autre inconvénient est la refactorabilité. Si vous décidez plus tard de changer le nom d'un membre, vous avez alors un tas de cordes magiques qui doivent également changer. Il est beaucoup plus simple de renommer un membre de la classe à l'aide des outils de refactoring fournis par la plupart des bons IDE. Avec une table de hachage, vous devrez probablement effectuer une opération de recherche / remplacement dans tous les fichiers source, ce qui pourrait être problématique.
Enfin, vous perdrez le temps de compilation pour vérifier l'accès des membres - à la fois en termes de nom et de type. Ce dernier n'est pas un problème si votre table de hachage ne contient qu'un seul type d'objet, mais s'il en contient plusieurs (même dans la même chaîne de hiérarchie), vous voulez vraiment tirer parti du système de types de votre langue et y obtenir du temps de compilation. Dans la plupart des IDE, vous aurez une sorte de fonctionnalités d'intellisense / de saisie semi-automatique - celles-ci fonctionnent en regardant le système de type, mais elles ne pourront pas vous aider avec les clés de table de hachage.
En ce qui concerne les moments où il serait approprié de renvoyer une table de hachage (ou une autre collection de paires de valeurs de clés), vous l'utiliseriez lorsque les valeurs et les clés ne sont pas connues au moment de la compilation. Par exemple, si vous avez une méthode qui analyse une chaîne de requête et renvoie les clés et les valeurs correspondantes, une table de hachage serait un bon choix. Dans ce cas, vous voudrez également penser à renvoyer une sorte de table de hachage immuable ou en lecture seule.
Modifier - La plupart des points soulevés dans cette réponse ne s'appliquent plus lorsque vous parlez de langues dynamiques :)
la source
L'argument le plus important contre cela serait que vous exposez trop d'informations au consommateur. Le code consommateur a seulement besoin de savoir qu'il s'agit d'une collection clé-valeur (dictionnaire) d'une certaine sorte; qu'il soit implémenté sous forme de table de hachage, de liste d'association, de trie ou autre, est relativement peu intéressant. Donc, la bonne façon serait de retourner par une interface appropriée (
IDictionary
, ou quelle que soit la langue de votre choix) plutôt que par type réel.Tout cela en supposant que vous avez réellement besoin d'un dictionnaire pour représenter vos données, c'est-à-dire que vos données sont constituées de paires clé / valeur, où les clés sont uniques parmi l'ensemble de données et ne peuvent pas être corrigées au moment de la compilation. Si vous avez des clés pré-connues, vous devez créer un type approprié (ou plusieurs, selon les besoins) pour vos données. Il s'agit de savoir si vous considérez les clés elles-mêmes comme faisant partie des données ou comme faisant partie du code.
MODIFIER :
Pour clarifier, j'utilise ici le terme dictionnaire pour désigner le type le plus générique de structure de données de valeur-clé; Je ne veux pas dire d'implémentation spécifique au langage comme Python
dict
ou .NETDictionary
.la source
Une question que je me poserais est "les clés changent-elles dans ce dictionnaire?" S'ils sont constants, vous devez renvoyer un objet ou une autre structure de données appropriée. S'ils sont dynamiques, vous souhaiterez peut-être renvoyer une sorte de structure de style de dictionnaire. Enfin, s'il y a des clés qui vont être constantes et un ensemble inconnu de clés dynamiques, vous souhaiterez peut-être renvoyer une structure de données hybride comprenant des valeurs fixes et une sorte de dictionnaire pour le débordement.
la source