Где я могу хранить имена хеш-таблиц или словаря? - PullRequest
2 голосов
/ 18 марта 2009

Когда я работаю с хэш-таблицами / словарями, я иногда испытываю трудности с указанием ключей.

Например: если я создаю простой словарь (для этого примера используется Python),

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

Я могу получить доступ к значениям (в других модулях) с помощью ключевых значений: (* ​​1006 *) и получить baz обратно.

По словам доктора Зла, "на самом деле довольно стандартно".

К сожалению, использование статических строк для ключей тесно связывает любые модули, использующие этот Словарь, с его реализацией. Конечно, это также может применяться при использовании других типов ключей (например, Enums, Objects и т. Д.); в любом случае, если вы нарежете его, все модули, которые обращаются к Словарю, должны знать значения ключей.

Чтобы решить эту проблему, я обычно использую строковые значения статических констант (или Enums, если они доступны на языке) для ключей и храню их публично в локальном классе / модуле или в отдельном модуле / классе. Поэтому любые изменения в самих словарных ключах хранятся в одном месте.

Обычно это выглядит так:

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

Существуют ли более эффективные способы указания ключей, чтобы использование словаря не обязательно связывало модуль / класс с его реализацией?

Примечание: я видел несколько ответов в SO, которые касаются этого (например, свойство-ссылка-ключ-значение-пара-в-словаре ), но темы не Похоже, что этот вопрос не решен конкретно. Ответы были полезны, но я хотел бы получить более широкий опыт.

Ответы [ 5 ]

2 голосов
/ 18 марта 2009

В тех случаях, когда я передаю объект и получаю известные ключи, я всегда предпочитаю добавить атрибут к объекту. ИМО, случай использования словарей - это когда вы не знаете, что это за ключи.

Python тривиален:

foo.bar=baz

Java почти такая же:

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

Производительность Python была бы в значительной степени идентична, поскольку поиск свойства - это просто поиск по словарю, а производительность Java была бы лучше.

2 голосов
/ 18 марта 2009

Почему бы не создать для этого класс, который содержит только свойства? Это сделано хорошо с Python (из того, что я знаю), и хорошо работает и с другими языками. Рефакторинг имен тоже тривиален с современными инструментами.

1 голос
/ 18 марта 2009

Я иногда создаю отдельный класс для хранения словарных ключей. Это дает им свое собственное пространство имен, а также регулярные преимущества наличия ключей в константных строках, а именно: у вас нет риска опечаток, вы получаете завершение кода, и строковое значение легко изменить. Если вы не хотите создавать отдельный класс, вы получаете все преимущества, кроме пространства имен, только из константных строк.

Тем не менее, я думаю, вы приближаетесь к программному кодированию территории. Если ключи в словаре меняются, это нормально для кода, использующего словарь для изменения.

0 голосов
/ 18 марта 2009

Я обычно делаю то же самое; если ключ всегда будет одним и тем же, сделайте «постоянный статический» на любом языке, чтобы удерживать ключ.

0 голосов
/ 18 марта 2009

Лично я использую ваш метод. Это довольно разумно, просто и решает актуальную проблему.

...