货币作为值
2003年8月26日
有很多常见的值对象示例,我最喜欢的是货币 - 货币与货币密切相关。
对于许多系统来说,货币作为值非常有效,您需要的主要部分是国际公认的货币代码(例如,美元的 USD)。
但是,我曾经参与过一个系统,它变得更加有趣。如果我的记忆没错,他们想要从货币中获得的一件事是“点值”。在他们的 UI 上,他们有按钮可以将货币的值上下调整。每种货币都有自己的点值,并且这个点值可能会改变。它并不经常改变,但确实会改变。这违反了值对象的一个非常有用的规则 - 它们是不可变的。
我们采用的解决方案是使用两个货币类。一个是值对象,它包含货币代码以及其他一些不可变的东西。第二个是引用对象(我认为我们称之为 CurrencyValue 和 CurrencyReference)。值对象在大多数情况下被传递,但值对象中的一些方法,例如点值,委托给引用对象 - 引用对象主要是静态数据。引用对象保存在一个以货币代码为索引的查找表中(这不是唯一的实现方式)。
这种双语义行为很不寻常 - 这是我唯一一次看到它。当然,大多数系统都可以使用简单的货币值对象。