Pergunta

Quando estou trabalhando com tabelas de hash / Dicionários I às vezes luta com a forma de especificar chaves.

Por exemplo: se eu criar um dicionário simples (usando Python para este exemplo),

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

Eu posso acessar valores (em outros módulos) com os valores fundamentais:. (foo['bar']) e obter baz volta

Nas palavras do Dr. Evil, "bastante normal, realmente."

Infelizmente, usando cordas estáticas para chaves firmemente casais quaisquer módulos usando este dicionário para a sua implementação. Naturalmente, isto também pode ser aplicado quando se utiliza outros tipos de chaves (por exemplo enumerações, objetos, etc); de qualquer maneira você cortá-lo, todos os módulos que acessam a necessidade dicionário conhecer os valores para as chaves.

Para resolver isso, eu normalmente usar valores estáticos string constante (ou enumerações se disponíveis na língua) para chaves, e armazená-los publicamente na classe / módulo local, ou em um módulo / classe separada. Portanto, quaisquer alterações às chaves de dicionário em si são mantidos em um único local.

Isso geralmente se parece com isso:

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

Existem melhores maneiras de especificar chaves de modo que o uso do dicionário não necessariamente casal um módulo / classe para a sua implementação?

Nota: Eu vi algumas respostas em SO que abordam este (por exemplo, propriedade-to-referência-a-key-value-par-em-um dicionário-), mas os tópicos não parecem abordar esta questão especificamente. As respostas foram úteis, mas eu gostaria de uma ampla gama de experiência.

Foi útil?

Solução

Por que não fazer uma classe para isso, que só contém propriedades? Isto é feito muito bem com Python (pelo que sei), e funciona bem com outras línguas também. Refatoração os nomes é trivial com ferramentas de hoje, também.

Outras dicas

Nos casos em que eu estou passando o objeto ao redor e eu tenho as chaves conhecidas, eu sempre preferem adicionar um atributo para um objeto. IMO, o caso de uso de dicionários é quando você não sabe quais são as chaves.

Python é trivial:

foo.bar=baz

Java é praticamente o mesmo:

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

O desempenho Python seria praticamente idêntica, uma vez que uma pesquisa de propriedade é apenas uma pesquisa de dicionário e o desempenho Java seria melhor.

Às vezes eu criar uma classe separada para armazenar as chaves de dicionário. Isso dá-lhes o seu próprio espaço de nomes, bem como os benefícios regulares de ter as chaves estar em cordas const, ou seja, que você não tem o risco de erros de digitação, você começa a conclusão do código, e o valor da cadeia é fácil mudar. Se você não quiser criar uma classe separada, você recebe todos os benefícios, exceto um espaço de nomes só de ter cordas const.

Dito isso, eu acho que você está chegando perto macio codificação território . Se as chaves na mudança dicionário, é OK para o código usando o dicionário para mudar.

Pessoalmente, eu uso o método. É muito sensível, simples e resolve o problema real.

Eu costumo fazer a mesma coisa; se a chave é sempre vai ser o mesmo, fazer um 'estática constante' em qualquer língua para segurar a chave.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top