Was sind die Entwurfsprobleme beim Zurückgeben einer Hashtabelle von einer öffentlichen Methode, wenn Sie mehrere Elemente zurückgeben möchten, anstatt eine Klasse zu erstellen und ein Objekt davon zurückzugeben?
Wenn es Probleme gibt, unter welchen Umständen ist es sinnvoll, dies zu tun?
Wie ändert sich die Antwort auf diese Frage, je nachdem, ob die Sprache dynamisch ist oder nicht?
Bearbeiten: Hiermit wird klargestellt, dass die Schlüssel konstant sind und Teil des Codes und nicht der Daten sind. Etwas, für das wir normalerweise eine Klasse erstellen. Die Frage ist, warum es falsch wäre, stattdessen Hashtable zu verwenden, wenn das Erstellen einer Klasse tatsächlich die richtige Wahl zu sein scheint.
quelle
Eines der Probleme wäre, dass in vielen Fällen der Schlüssel für die Hash-Tabelle eine Zeichenfolge ist. Die Verbraucher der Methode müssten also vorher wissen, welche Schlüssel zum Extrahieren der Daten verwendet werden sollen. Dies würde zu Fehlern aufgrund von Rechtschreibfehlern beim Zugriff auf die Daten führen.
Ein weiterer Nachteil ist die Refaktorierbarkeit. Wenn Sie sich später entscheiden, den Namen eines Mitglieds zu ändern, haben Sie eine Reihe magischer Zeichenfolgen, die ebenfalls geändert werden müssen. Es ist viel einfacher, ein Klassenmitglied mit Refactoring-Tools umzubenennen, die von den meisten guten IDEs bereitgestellt werden. Mit einer Hash-Tabelle müssten Sie wahrscheinlich einen Such- / Ersetzungsvorgang für alle Quelldateien durchführen, was problematisch sein könnte.
Schließlich verlieren Sie die Kompilierungszeit für die Überprüfung des Mitgliederzugriffs - sowohl hinsichtlich des Namens als auch des Typs. Letzteres ist kein solches Problem, wenn Ihre Hash-Tabelle nur einen Objekttyp enthält, aber wenn sie viele enthält (auch in derselben Hierarchiekette), möchten Sie das Typensystem Ihrer Sprache wirklich nutzen und dort die Kompilierungszeit überprüfen lassen. In den meisten IDEs gibt es eine Art Intellisense- / Autocomplete-Funktionen - diese funktionieren anhand des Typsystems, können Ihnen jedoch bei der Verwendung von Hash-Tabellenschlüsseln nicht helfen.
In Zeiten, in denen es angebracht wäre , eine Hash-Tabelle (oder eine andere solche Sammlung von Schlüsselwertpaaren) zurückzugeben, würden Sie dies verwenden, wenn sowohl die Werte als auch die Schlüssel zur Kompilierungszeit nicht bekannt sind. Wenn Sie beispielsweise eine Methode haben, die eine Abfragezeichenfolge analysiert und die Schlüssel und entsprechenden Werte zurückgibt, ist eine Hash-Tabelle eine gute Wahl. In diesem Fall möchten Sie auch darüber nachdenken, eine unveränderliche oder schreibgeschützte Hash-Tabelle zurückzugeben.
Bearbeiten - Die meisten Punkte in dieser Antwort gelten nicht mehr, wenn Sie über dynamische Sprachen sprechen :)
quelle
Das wichtigste Argument dagegen wäre, dass Sie dem Verbraucher zu viele Informationen zur Verfügung stellen. Der konsumierende Code muss nur wissen, dass es sich um eine Schlüsselwertsammlung (Wörterbuch) handelt. Ob es als Hashmap, Assoziationsliste, Trie oder was auch immer implementiert ist, ist relativ uninteressant. Der richtige Weg wäre also, über eine geeignete Schnittstelle (
IDictionary
oder was auch immer Ihre Sprache Ihrer Wahl verwendet) anstelle des tatsächlichen Typs zurückzukehren.All dies unter der Annahme, dass Sie tatsächlich ein Wörterbuch benötigen, um Ihre Daten darzustellen, dh Ihre Daten bestehen aus Schlüssel / Wert-Paaren, wobei die Schlüssel innerhalb des Datasets eindeutig sind und zur Kompilierungszeit nicht festgelegt werden können. Wenn Sie bereits bekannte Schlüssel haben, sollten Sie einen geeigneten Typ (oder mehrere, je nach Bedarf) für Ihre Daten erstellen. Es kommt darauf an, ob Sie die Schlüssel selbst als Teil der Daten oder als Teil des Codes betrachten.
EDIT :
Zur Verdeutlichung verwende ich den Begriff Wörterbuch , um hier den allgemeinsten Typ der Schlüsselwertdatenstruktur zu bezeichnen. Ich meine keine sprachspezifische Implementierung wie Pythons
dict
oder .NETsDictionary
.quelle
Eine Frage, die ich mir stellen würde, lautet: "Ändern sich die Schlüssel in diesem Wörterbuch?" Wenn sie konstant sind, sollten Sie ein Objekt oder eine andere geeignete Datenstruktur zurückgeben. Wenn sie dynamisch sind, möchten Sie möglicherweise eine Art Wörterbuchstilstruktur zurückgeben. Wenn es einige Schlüssel gibt, die konstant sein sollen, und einen unbekannten Satz dynamischer Schlüssel, möchten Sie möglicherweise eine hybride Datenstruktur mit einigen festen Werten und einer Art Wörterbuch für den Überlauf zurückgeben.
quelle