价值对象可以有行为吗?

8

我有两个值对象Money和ExchangeRatio。我想使用ExchangeRatio将一个Money转换为另一个Money。在Value Object ExchangeRatio上建立一个转换行为是否可行:

ExchangeRatio.Convert(Money)返回Money。

或者,我应该将其委托给某个域服务吗?换句话说,我可以在Value Object上建立一个行为,它不会改变其状态,但具有一些逻辑、数学或其他不同的对象创建(基于其状态)吗?

1个回答

4
你正在做的事情在我看来完全合理。Eric Evans在他的书中使用了一个Paint对象的例子,它也是做同样的事情。mixIn方法将另一个Paint对象作为输入,并返回一个新的Paint对象。在这个Paint示例中,他展示了书中的无副作用函数。

好的,因为Paint只知道他行为中的Paint实例。在这里ExchangeRatio知道Money,所以情况不同。 - Radek
3
我会把转换方法放在货币对象上,因为你正在处理的是货币,而不是汇率。 因此,应该写成 Money.ConvertTo(ExchangeRatio) - SneakyPeet
3
雷德克,进一步优化了“Paint”以包含“Pigment”。 因此,“Paint”知道颜料并在内部使用比例。 只要“操作的闭合性”业务保持不变,我们就应该没问题。 无论如何,正如SneekyPeet所提到的,你可以稍微调整一下事物的顺序,因为你的示例实际上看起来更像是一个域服务 ;) --- 然而,答案仍然是:你可以在你的VO上添加行为。 - Eben Roux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接