2012-12-15 61 views
1

将您的域对象用作词典中的键是一种好的做法吗?使用对象作为词典中的键

我有一个场景,我使用NHibernate填充我的域对象。

对于执行业务逻辑,我需要查找字典。我可以利用 无论

IDictionary<int, ValueFortheObject> 

Dictionary<DomainObject, ValueFortheObject> 

第二个选择似乎更把我当成

  1. 我可以写容易测试用例,并可以使用真正的域对象测试用例,而不是使用Mock<DomainObject>(如果我选择第一个选项),因为Id上的setter对所有域对象都是private

  2. 的代码更易读为Dictionary<Hobbit,List<Adventures>>更具有可读性对我来说比Dictionary<int,List<Adventures>>与意见建议INT为hobbitId尤其是路过的时候作为参数

我的问题是:

  1. 第二种方法使用第一种方法的优点是什么(我可能会盲目失踪)?

  2. 使用第二种方法会出现任何性能问题吗?

更新01:

我的域模型实现这些并同时进行操作,他们没有得到突变。

使用它们作为密钥的性能会有问题吗?或者我在这里完全忽略了这一点,性能/内存与正在使用的密钥无关?

更新02:

我的问题是

  1. 会有与性能或内存中的任何问题,如果我使用对象作为键,而不是原始类型和为什么/如何
+0

你是否熟悉Dictionary ..?它利用键/值对..也不应该允许重复的键..你有没有想过哈希表例如..你的词典>看起来更可读,但没有看到任何真正的代码,很难确定它是什么你正试图完全按照我的意见 – MethodMan

+0

你能提供一个例子,你想如何具体使用字典? – CSharpie

+0

我用一种快速和肮脏的方法来计算数组中出现次数的方法,它使用来自另一种方法的索引 – aremvee

回答

1

@ScottChamberlain给你的整体问题,但你的用例可能会争论任何一种方式。您应该问自己的一些问题是:两个业务对象是平等的意味着什么?如果它们被用作字典中的关键字,或者如果我将它们与别处进行比较,它们是相同还是不同?如果我改变一个对象,它应该是一个关键变化的价值还是保持不变?如果您使用替代GetHashCode()Equals(),那么计算这些函数的成本是多少?

一般来说,我赞成使用简单的键类型,因为在对象平等方面存在很大的误解空间。如果可读性是您最关心的问题,您可以使用适当的方法创建自定义词典(围绕Dictionary<Key,Value>包装)。然后你可以用对象的方式编写方法,然后在内部使用你想要的任何(适当的)属性作为关键字。

+0

我的其他问题是测试业务逻辑。使用域对象使我可以自由编写更简单的测试用例。 +1为暗示围绕dictonary使用包装解决我的问题:) – frictionlesspulley

4

您将要运行的最大问题是,在执行滚动键作为键时,您不得变更键对象。

当我说“mutate”时,我的意思是您的密钥对象必须实现EqualsGetHashCode才能用作字典的关键字。在对象用作关键字时,对对象所做的任何操作都不得改变GetHashCode的值,也不能使Equals与集合中的任何其他关键字的值相同。

+0

是的,我的域模型确实实现了这些,并且在执行操作时不会发生变异。使用它们作为关键点会有性能问题吗?还是我完全忽略了这一点,性能/内存在使用什么键方面没有太大区别? – frictionlesspulley