2009-03-18 15 views
2

Wenn ich mit Hashtabellen/Wörterbüchern arbeite, habe ich manchmal Probleme mit der Angabe von Schlüsseln.Wo speichere ich Hashtabellen- oder Dictionary-Schlüsselnamen?

Zum Beispiel: Wenn ich ein einfaches Wörterbuch erstellen (unter Verwendung von Python für dieses Beispiel),

foo = {'bar': 'baz', 'foobar': 'foobaz' } 

Ich kann Wert zugreifen (in anderen Modulen) mit den Schlüsselwerten: (foo['bar']) und baz zurück.

In den Worten von Dr. Evil, "ziemlich Standard, wirklich."

Leider verbindet die Verwendung von statischen Strings für Keys alle Module, die dieses Dictionary verwenden, eng an die Implementierung. Dies kann natürlich auch bei Verwendung anderer Schlüsseltypen (z. B. Enums, Objekte usw.) gelten; Wie auch immer Sie es schneiden, alle Module, die auf das Wörterbuch zugreifen, müssen die Werte für die Schlüssel kennen.

Um dies zu beheben, verwende ich normalerweise statische String-Werte (oder Enums, falls in der Sprache verfügbar) für Schlüssel und speichern sie entweder öffentlich in der lokalen Klasse/Modul oder in einem separaten Modul/Klasse. Daher werden alle Änderungen an den Wörterbuchschlüsseln selbst an einem einzigen Ort gespeichert.

Das sieht in der Regel wie folgt aus:

BAR_KEY = 'bar' 
foo[BAR_KEY] = 'foobar' 

Gibt es bessere Möglichkeiten der Schlüssel, so dass die Verwendung des Wörterbuchs nicht unbedingt Paar ein Modul/Klasse zu deren Umsetzung Angabe?

Hinweis: Ich habe einige Antworten in SO gesehen, die sich mit diesem Thema befassen (z. B. property-to-reference-a-key-value-pair-in-a-dictionary), aber die Themen scheinen dieses Problem nicht speziell zu beheben. Die Antworten waren hilfreich, aber ich hätte gerne mehr Erfahrung.

Antwort

2

Warum nicht eine Klasse für diese, die nur Eigenschaften enthält? Dies ist gut mit Python gemacht (von dem, was ich weiß), und funktioniert auch gut mit anderen Sprachen. Das Refactoring der Namen ist auch mit heutigen Tools trivial.

+0

guter Punkt, wenn die Schlüssel immer bekannt und konstant sind, wäre es besser, sie in eine Klasse/Struktur mit Eigenschaften zu setzen. – CodingWithSpike

+0

Nun, normalerweise mache ich das, wenn das Wörterbuch von mehreren (3+) Modulen benutzt wird. Aber wenn ich nur ein einfaches Wörterbuch von einem Modul zum anderen gebe, scheint das nicht etwas übertrieben zu sein? Sie könnten mit einer Reihe von Property-Klassen enden :) – bedwyr

+1

@bedwyr, Sicherlich nicht zu viel für Python (siehe Jensens Antwort). Erleichtert auch das Verständnis, da die Struktur definiert ist. (Natürlich können Sie in einer dynamisch typisierten Sprache damit herumspielen ...) – strager

0

Persönlich verwende ich Ihre Methode. Es ist ziemlich vernünftig, einfach und löst das eigentliche Problem.

0

Normalerweise mache ich das gleiche; Wenn der Schlüssel immer der gleiche sein wird, machen Sie eine "konstante statische" in welcher Sprache auch immer, um den Schlüssel zu halten.

1

Ich erstelle manchmal eine separate Klasse, um die Wörterbuchschlüssel zu halten. Das gibt ihnen ihren eigenen Namespace, sowie die regelmäßigen Vorteile der Schlüssel in const Strings, nämlich dass Sie nicht das Risiko von Tippfehlern haben, Sie erhalten Code-Vervollständigung, und der Zeichenfolgenwert ist einfach zu ändern. Wenn Sie keine separate Klasse erstellen möchten, erhalten Sie alle Vorteile außer einem Namespace nur aus Const-Strings.

Das sagte, ich glaube, Sie sind in der Nähe von soft coding Territorium. Wenn sich die Schlüssel im Wörterbuch ändern, kann der Code, der das Wörterbuch verwendet, geändert werden.

2

In Fällen, in denen ich das Objekt übergebe und bekannte Schlüssel habe, würde ich immer ein Attribut zu einem Objekt hinzufügen. IMO, der Anwendungsfall von Wörterbüchern ist, wenn Sie nicht wissen, was die Schlüssel sind.

Python ist trivial:

foo.bar=baz 

Java so ziemlich das gleiche ist:

class Foo { public String bar="baz"; } 

Die Python-Leistung wäre ziemlich identisch sein, da eine Eigenschaft Lookup nur ein Wörterbuchsuche und die Java Leistung wäre besser.

Verwandte Themen