Где я могу хранить имена хеш-таблиц или словаря?
-
19-08-2019 - |
Вопрос
Когда я работаю с хэш-таблицами / словарями, я иногда испытываю трудности с указанием ключей.
Например: если я создаю простой словарь (для этого примера используется 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 была бы лучше.
Иногда я создаю отдельный класс для хранения словарных ключей. Это дает им свое собственное пространство имен, а также регулярные преимущества наличия ключей в константных строках, а именно то, что у вас нет риска опечаток, вы получаете завершение кода, и строковое значение легко изменить. Если вы не хотите создавать отдельный класс, вы получаете все преимущества, кроме пространства имен, только из константных строк.
Тем не менее, я думаю, вы приближаетесь к программному кодированию территории. Если ключи в словаре меняются, это нормально для кода, использующего словарь для изменения. Р>
Лично я использую ваш метод. Это довольно разумно, просто и решает актуальную проблему.
Я обычно делаю то же самое; если ключ всегда будет одним и тем же, создайте «постоянную статичность» на любом языке для хранения ключа.