Dove posso memorizzare i nomi delle chiavi della tabella hash o del dizionario
-
19-08-2019 - |
Domanda
Quando lavoro con tabelle hash / dizionari a volte faccio fatica a specificare le chiavi.
Ad esempio: se creo un dizionario semplice (usando Python per questo esempio),
foo = {'bar': 'baz', 'foobar': 'foobaz' }
Posso accedere ai valori (in altri moduli) con i valori chiave: ( foo ['bar']
) e ottenere baz
.
Nelle parole del Dr. Evil, "abbastanza standard, davvero."
Sfortunatamente, l'uso di stringhe statiche per chiavi accoppia strettamente tutti i moduli che usano questo Dizionario alla sua implementazione. Naturalmente, ciò può valere anche quando si usano altri tipi di chiave (ad es. Enum, Oggetti, ecc.); comunque lo tagli, tutti i moduli che accedono al Dizionario devono conoscere i valori delle chiavi.
Per risolvere questo problema, in genere utilizzo valori stringa costanti statici (o Enum se disponibili nella lingua) per le chiavi e li memorizzo pubblicamente nella classe / modulo locale o in un modulo / classe separato. Pertanto, eventuali modifiche alle stesse chiavi del dizionario vengono conservate in un'unica posizione.
Questo di solito appare così:
BAR_KEY = 'bar'
foo[BAR_KEY] = 'foobar'
Esistono modi migliori per specificare le chiavi in ??modo tale che l'uso del Dizionario non accoppi necessariamente un modulo / classe alla sua implementazione?
Nota: ho visto alcune risposte in SO che affrontano questo problema (ad es. proprietà-a-riferimento-una-chiave-valore-coppia-in-un-dizionario ), ma gli argomenti non sembrano affrontare questo problema in modo specifico. Le risposte sono state utili, ma vorrei un'esperienza più ampia.
Soluzione
Perché non creare una classe per questo, che contiene solo proprietà? Questo è fatto bene con Python (da quello che so), e funziona bene anche con altre lingue. Rifattorizzare i nomi è banale anche con gli strumenti di oggi.
Altri suggerimenti
Nei casi in cui sto passando l'oggetto e ho chiavi conosciute, preferirei sempre aggiungere un attributo a un oggetto. IMO, il caso d'uso dei dizionari è quando non sai quali sono le chiavi.
Python è banale:
foo.bar=baz
Java è praticamente lo stesso:
class Foo { public String bar="baz"; }
Le prestazioni di Python sarebbero praticamente identiche, poiché una ricerca di proprietà è solo una ricerca nel dizionario e le prestazioni di Java sarebbero migliori.
A volte creo una classe separata per contenere le chiavi del dizionario. Ciò fornisce loro il proprio spazio dei nomi, nonché i normali vantaggi di avere le chiavi nelle stringhe const, vale a dire che non si ha il rischio di errori di battitura, si ottiene il completamento del codice e il valore della stringa è facile da modificare. Se non si desidera creare una classe separata, si ottengono tutti i vantaggi tranne uno spazio dei nomi da avere stringhe const.
Detto questo, penso che ti stai avvicinando al soft coding . Se le chiavi nel dizionario cambiano, va bene per il codice usare il dizionario per cambiare.
Personalmente, io uso il tuo metodo. È abbastanza sensato, semplice e risolve il problema reale.
Di solito faccio la stessa cosa; se la chiave sarà sempre la stessa, crea una "costante statica" in qualsiasi lingua per contenere la chiave.