我在哪里存储哈希表或词典键名称

时间:2009-03-18 02:21:58

标签: language-agnostic dictionary hashtable

当我使用Hash Tables / Dictionaries时,我有时会讨论如何指定密钥。

例如:如果我创建一个简单的Dictionary(在本例中使用Python),

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

我可以使用键值访问值(在其他模块中):( foo['bar'])并返回baz

用邪恶博士的话说,“非常标准,真的。”

不幸的是,使用静态字符串作为键将使用此Dictionary的任何模块紧密地耦合到其实现。当然,这在使用其他密钥类型(例如,枚举,对象等)时也适用;无论如何你切片,所有访问词典的模块都需要知道键的值。

要解决此问题,我通常会使用静态常量字符串值(或语言中的枚举)作为键,并将它们公开存储在本地类/模块中,或者存储在单独的模块/类中。因此,字典键本身的任何更改都保存在一个位置。

通常看起来像这样:

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

是否有更好的方法来指定键,使得Dictionary的使用不一定将模块/类连接到它的实现?

注意:我在SO中看到了一些解决此问题的回复(例如property-to-reference-a-key-value-pair-in-a-dictionary),但这些主题似乎没有具体解决这个问题。答案很有帮助,但我希望有更广泛的经验。

5 个答案:

答案 0 :(得分:2)

为什么不为此创建一个只包含属性的类?这很好地用Python(据我所知)完成,并且与其他语言一起使用也很好。使用今天的工具重构名称也是微不足道的。

答案 1 :(得分:2)

如果我传递对象并且我已经知道了键,我总是更喜欢向对象添加属性。 IMO,字典的用例是当你不知道密钥是什么时。

Python很简单:

foo.bar=baz

Java几乎相同:

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

Python性能几乎完全相同,因为属性查找只是一个字典查找,Java性能会更好。

答案 2 :(得分:1)

我有时会创建一个单独的类来保存字典键。这给了他们自己的命名空间,以及将键放在const字符串中的常规好处,即你没有拼写错误的风险,你得到代码完成,字符串值很容易改变。如果你不想创建一个单独的类,除了命名空间之外,你将获得除const字符串之外的所有好处。

那就是说,我认为你已经接近soft coding领土了。如果字典中的键发生更改,则使用字典进行更改的代码就可以了。

答案 3 :(得分:0)

就个人而言,我使用你的方法。它非常明智,简单,并且解决了实际问题。

答案 4 :(得分:0)

我通常做同样的事情;如果密钥总是相同的话,用任何语言制作一个“常量静态”来保存密钥。