当我使用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),但这些主题似乎没有具体解决这个问题。答案很有帮助,但我希望有更广泛的经验。
答案 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)
我通常做同样的事情;如果密钥总是相同的话,用任何语言制作一个“常量静态”来保存密钥。