1

ですから、私には価値objectがあり(任意にお金と言います)、それに対して平等を実装したいと思います。==and .Equals()(参照とデータの同等性)の意図された/デフォルトの動作を認識しています。

ただし、この場合、2つのオブジェクトを比較できるようにしたいので、計算では同等です(たとえば、1mと3 ftは同等です)が、永続性(同等性に依存すると思わNHibernateれる場合は、を使用)、ユーザーの表示、および選択については同等です。isDirty通貨の、私はそれらが異なると見なされることを望みます。

この場合、私はすべきですか、

  1. ==との動作が異なります.Equals()(そしてどちらが何をする必要がありますか)、
  2. 同等性を確認したい場合は、各プロパティを確認するだけです(追加のコードを意味します)
  3. 次のようなメソッドを実装し.IsEquivalent()ます(後者は実行したくない)
  4. 私が見逃している他の何か

従うべきベストプラクティス/パターンはありますか?ありがとう

編集:為替レートの変更に関していくつかの回答がありました。わかりやすくするために更新します。通貨ではなく高さを言うことができます

  • いくつかの仮定を明確にしたいと思います。
  • //無視:値オブジェクトには小数、文字列/クラス通貨が含まれます
  • //無視:為替レートは変更されません。
  • //無視:クラス通貨は、他の通貨との間の交換レートを認識しています
  • 値オブジェクトには、10進数の数量、文字列/クラス単位が含まれます
  • クラスユニットは、他のユニットとの間の変換を認識しています。
  • レート/コンバージョンなどを拡大するつもりはありません

通貨を実装するのではなく、慣行やパターンに関心があります。基本的に、身長が値オブジェクトである人の身長への同じアプローチ({1、m}から{3、ft}、1mは常に3ftと「等しい」/「同等」)

4

3 に答える 3

5

私は1.0米ドルを0.63ポンドに等しいとは扱いません。金銭的価値が等しいかどうかを確認するには、2つの値だけでなく、現在の為替レートなども必要です。同じ2つの値が一貫して等しくないため、これは特に当てはまります。 、および2つの値が等しい場合、等式は常に真である必要があります。

そのため、特に追加情報が必要な場合は、などの方法がAreEquivalentMonitaryValues()適切と思われます。

于 2013-01-24T17:15:49.940 に答える
2

コンテキストに応じて異なる平等の定義が必要なため、を使用しIEqualityComparerます。

リードが示唆しているように、タイプ自体の同等性は、現在の為替レートではなく「常にそして永遠に等しい」ことを意味するはずですが、IEqualityComparerがあるということは、「この比較者の観点からは、それらは等しい」ということを意味します。 。そこから、あなたはあなたのExchangeRateタイプ、または為替レートが与えられた何かを持つことができ、与えられた為替レートのIEqualityComparer<Money>平等を表すオブジェクトを作成することができます。次に、その平等比較器を使用して、さまざまな種類の通貨を比較して平等にすることができます。

もう1つのアプローチは、完全に「不変通貨」を作成し、クラスToInvariantFromInvariantメソッドを指定して、非不変通貨が(これまでに)等しくなく、不変値を生成した通貨にもかかわらず不変通貨が等しくなるようにすることです。

于 2013-01-24T17:22:17.273 に答える
0

MoneyExchangeRatesメソッドを持つクラスを作成しますIsWorthApproximatelyTheSame(Money m1, Money m2)

為替レートは時間とともに変化します。グローバルに変更可能な状態にしないでください。

于 2013-01-24T17:17:50.820 に答える