1

Is it a good practice to use your domain objects as keys in a Dictionary ?

I have a scenario where I populate my domain object using NHibernate.

For performing business logic I need to look-up Dictionary. I can make use of Either

IDictionary<int, ValueFortheObject> 

or

Dictionary<DomainObject, ValueFortheObject>

The second options seems better to me as

  1. I can write easier test cases and can use real domain objects in test cases as well rather than using Mock<DomainObject> (if I go with the first option) since setter on the Id is private on ALL domain objects.

  2. The code is more readable as Dictionary<Hobbit,List<Adventures>> is more readable to me than Dictionary<int,List<Adventures>> with comments suggesting int is the hobbitId especially when passing as parameters

My questions are :

  1. What are advantages of using the first option over the second (which I might be blindly missing) ?

  2. Will be any performance issues using the second approach?

Update 01:

My domain models implement those and they DO NOT get mutated while performing the operations.

Will there be issues with performance using them as keys ? or am I completely missing the point here and performance / memory are not related to what keys are being used?

Update 02:

My question is

  1. Will there be any issues with performance or memory if I use Objects as keys instead of primitive types and WHY / HOW ?
4

2 に答える 2

4

遭遇する最大の問題は、キーとしてのロールを実行している間は、キーオブジェクトを変更してはならないということです。

私が「変異」と言うとき、私はあなたのキーオブジェクトが実装EqualsGetHashCodeれ、辞書のキーとして使用されなければならないことを意味します。キーとして使用されているときにオブジェクトに対して行うことは、コレクション内の他のキーの値を変更したり、trueと評価しGetHashCodeたりしてはなりません。Equals

于 2012-12-15T18:36:28.757 に答える
1

@ScottChamberlain は全体的な問題を提供しますが、ユースケースはどちらの方法でも議論できます。2 つのビジネス オブジェクトが等しいとはどういう意味ですか? それらが辞書のキーとして使用されている場合、または他の場所で比較している場合、これは同じですか、それとも異なりますか? オブジェクトを変更した場合、キーとしての値を変更する必要がありますか、それとも同じままにする必要がありますか? GetHashCode()とのオーバーライドを使用する場合Equals()、これらの関数を計算するコストはいくらですか?

オブジェクトの等価性に関して誤解の余地がたくさんあるので、一般的に私はキーに単純な型を使用することに賛成です。Dictionary<Key,Value>読みやすさが最大の関心事である場合は、適切な方法でいつでもカスタム ディクショナリ (ラッパー アラウンド) を作成できます。次に、オブジェクトの観点からメソッドを記述し、内部で必要な (適切な) プロパティをキーとして使用できます。

于 2012-12-15T18:48:41.420 に答える