领域模型的某些元素没有任何概念标识,通常用于表征实体(Evans,2003)。这些元素称为值对象,它们的重要性经常被忽视(Vernon,2013)。
值对象的示例有:邮政编码、订单号、电话号码、金钱、货币、日期、日期范围、电子邮件地址、URL 等。值对象表达域概念,是通用语言的一部分(Evans 2003;Vernon, 2013)。

身份的缺乏意味着我们只能通过值对象各自属性的相等性来区分它们(Fowler,2002)。
值对象的另一个重要特征是它们的状态永远不会改变,即它们是不可变的,这允许它们在许多实体之间共享(Evans 2003;Vernon,2013)。

最后,值对象的作用不仅是表征实体,而且还可以减轻计算复杂性,例如电子邮件地址具有格式限制,其有效性可以由其构造函数强制执行,而不是在分配给具有电子邮件的用户实体期间强制执行(Fowler,2002;Evans,2003)。

例如,货币的概念是货币价值的表示,可以使用原始数据类型在代码中表达(Hu 和 Peng,2007)。
然而,这个概念只是隐式定义的,并且代码处理金钱的事实仅通过变量或方法名称显而易见(Hu 和 Peng,2007)。
缺乏明确定义 Money 对象会导致问题,特别是当需要引入货币概念时(Fowler,2002)。货币和货币是价值对象,可以表示为:

笔记!以下代码只是演示值对象概念的一种方法。它没有经过广泛的测试,有很多限制(例如没有乘法/除法),并且对于您的用例来说精度可能非常低。

显然,我们必须编写大量代码才能将这些概念作为值对象表示到领域模型中。然而,我们使客户摆脱了与比较和操纵特定货币的货币相关的逻辑。
请注意,虽然 Money 对象是不可变的,但我们可以添加和减去它们,从而产生一个新的 Money 实例。以下几行演示了如何在域模型中使用货币和货币。

 输出是

 参考

  • Evans, E. (2003) 领域驱动设计:解决软件核心的复杂性。波士顿:艾迪生-韦斯利。

  • Fowler, M. (2002) 企业应用程序架构模式。波士顿:艾迪生-韦斯利。

  • Hu, Y. & Peng, S. (2007)“所以我们认为我们了解金钱”。 2007 年 ACM SIGPLAN 面向对象编程系统和应用程序会议。10 月 21-25 日。蒙特利尔:OOPSLA:第 971-975 页。

  • Vernon, V. (2013) 实施领域驱动设计。波士顿:艾迪生-韦斯利。

这篇文章摘自我的硕士论文,题为“在 Python 中应用领域驱动设计 - 设计一个自托管的稍后阅读服务”(2014 年 1 月)。