Pregunta

Cuando trabajo con Hash Tables / Dictionaries a veces me cuesta cómo especificar las teclas.

Por ejemplo: si creo un diccionario simple (usando Python para este ejemplo),

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

Puedo acceder a los valores (en otros módulos) con los valores clave: ( foo ['bar'] ) y recuperar baz .

En palabras del Dr. Evil, "bastante estándar, de verdad."

Desafortunadamente, el uso de cadenas estáticas para teclas acopla estrechamente cualquier módulo que use este Diccionario para su implementación. Por supuesto, esto también puede aplicarse cuando se usan otros tipos de clave (por ejemplo, enumeraciones, objetos, etc.); de todos modos, lo corta, todos los módulos que acceden al Diccionario necesitan conocer los valores de las claves.

Para resolver esto, normalmente uso valores de cadena constantes estáticos (o Enums si están disponibles en el idioma) para las claves, y los almaceno públicamente en la clase / módulo local, o en un módulo / clase separado. Por lo tanto, cualquier cambio en las teclas del diccionario se mantiene en una única ubicación.

Esto generalmente se ve así:

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

¿Hay mejores formas de especificar claves de manera que el uso del Diccionario no necesariamente combine un módulo / clase con su implementación?

Nota: He visto algunas respuestas en SO que abordan esto (por ejemplo, propiedad-a-referencia-una-clave-valor-par-en-un-diccionario ), pero los temas no parecen abordar este problema específicamente. Las respuestas fueron útiles, pero me gustaría una experiencia más amplia.

¿Fue útil?

Solución

¿Por qué no hacer una clase para esto, que solo contiene propiedades? Esto se hace muy bien con Python (por lo que sé), y también funciona bien con otros lenguajes. Refactorizar los nombres también es trivial con las herramientas actuales.

Otros consejos

En los casos en que estoy pasando el objeto y tengo claves conocidas, siempre preferiría agregar un atributo a un objeto. En mi opinión, el caso de uso de los diccionarios es cuando no sabes cuáles son las claves.

Python es trivial:

foo.bar=baz

Java es más o menos lo mismo:

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

El rendimiento de Python sería bastante idéntico, ya que una búsqueda de propiedades es solo una búsqueda de diccionario y el rendimiento de Java sería mejor.

A veces creo una clase separada para contener las teclas del diccionario. Eso les da su propio espacio de nombres, así como los beneficios regulares de tener las claves en cadenas constantes, es decir, que no tiene el riesgo de errores tipográficos, se completa el código y el valor de la cadena es fácil de cambiar. Si no desea crear una clase separada, obtiene todos los beneficios, excepto un espacio de nombres solo de tener cadenas constantes.

Dicho esto, creo que te estás acercando al territorio codificación suave . Si las claves en el diccionario cambian, está bien que el código que usa el diccionario cambie.

Personalmente, uso tu método. Es bastante sensato, simple y resuelve el problema real.

Usualmente hago lo mismo; si la clave siempre va a ser la misma, haga una 'estática constante' en cualquier idioma para mantener la clave.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top