1

所以我有一个值object,(随意说钱),我想为它实现平等。我知道==.Equals()(引用和数据相等)的预期/默认行为。

不过,在这种情况下,我希望能够比较两个对象,并说它们对于计算是等效的(例如 1m 和 3 ft 是等效的)但是对于持久性(使用NHibernateisDirty我认为取决于相等性)、用户显示和选择货币,我希望它们被认为是不同的。

在这种情况下,我是否应该

  1. ==.Equals()(应该做什么)有不同的行为,
  2. 无论我想在哪里检查等效性,只需检查每个属性(意味着额外的代码)
  3. 实现类似的方法.IsEquivalent()(我不想做后者)
  4. 我想念的其他东西

是否有我应该遵循的最佳实践/模式?谢谢

编辑:我收到了一些关于改变汇率的回应。为了清楚起见,所以更新。让我们说身高,而不是货币

  • 我想澄清一些假设:
  • //忽略:值对象包含十进制金额,字符串/类货币
  • // 忽略:汇率不变。
  • // 忽略:类货币知道它与其他货币的汇率
  • 值对象包含十进制数量,字符串/类单位
  • 班级单位知道它与另一个单位的转换
  • 我不打算扩大费率/转换等

我更关心实践和模式,而不是实施货币。基本上,对人的身高采用相同的方法,其中身高是一个值对象,({1,m} 到 {3,ft},其中 1m 始终“等于”/“等价于”到 3ft)

4

3 回答 3

5

我不会将 1.0 美元视为等于0.63 英镑。为了检查货币价值是否相等,您需要的信息不仅仅是两个值 - 您还需要当前汇率等。尤其如此,因为相同的两个值不会始终相等, 如果两个值永远相等,则相等应该始终为真。

因此,诸如 之类的方法AreEquivalentMonitaryValues()似乎是合适的——尤其是考虑到需要额外的信息。

于 2013-01-24T17:15:49.940 回答
2

由于您需要不同的相等定义,具体取决于您想要使用的上下文IEqualityComparer

正如Reed 建议类型本身的平等应该真正意味着“永远和永远平等”而不是当前汇率平等,但拥有 IEqualityComparer 只是意味着“从这个比较器的角度来看,它们是平等的” . 从那里你可以让你的ExchangeRate类型,或者给定汇率的东西,能够创建一个代表给定汇率IEqualityComparer<Money>相等的对象。然后可以使用该相等比较器来比较各种类型的货币是否相等。

另一种方法完全是创建“不变货币”,并提供您的类ToInvariantFromInvariant方法,以便非不变货币不相等(永远),并且不变货币可以相等,尽管产生不变值的货币。

于 2013-01-24T17:22:17.273 回答
0

创建一个MoneyExchangeRates具有方法的类IsWorthApproximatelyTheSame(Money m1, Money m2)

汇率会随着时间而变化,不要让它们成为全局可变状态。

于 2013-01-24T17:17:50.820 回答