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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top