Вопрос

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

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

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Python тривиален:

foo.bar=baz

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top