domain-driven-design - 是否允许在构造时修改值对象的值
问题描述
假设我希望下面的值对象包含始终大写的字符串值。在构造函数中是否有资格这样做toUpperCase()
?
class CapitalizedId(value: String) {
val value: String = value.toUpperCase()
// getters
// equals and hashCode
}
解决方案
一般来说,我认为在值对象的构造函数中执行如此简单的转换不会有问题。当然,构造函数的用户应该不会感到意外,但正如CapitalizedId这个名字已经告诉你,无论创建什么都会被大写,从我的角度来看,这并不奇怪。我还在构造函数中执行有效性检查,以确保遵守业务不变量。
如果您担心不在构造函数中执行操作,或者操作和验证变得过于复杂,您总是可以提供包含所有繁重工作的工厂方法(或者在 Kotlin 中使用伴侣,我猜,不是 Kotlin 专家)(想想LocalDateTime.of())和验证逻辑,并以某种方式使用它:
CapitalizedId.of("abc5464g");
注意:在实现工厂方法时,在这种情况下,构造函数应该是私有的
推荐阅读
- c# - 如何在方法中获得计算(增量)的结果?
- ios - TwilioChatClient 没有来自 channelWithSidOrUniqueName:completion: 和 getLastWithCount:completion: 的回调
- php - PHP 表单未通过 $_POST 方法传输所有数据
- python - Github 到谷歌 colab
- amazon-web-services - 集群置放群组中的所有实例是否会共享相同的操作系统?
- stream - Apache Beam:从具有固定窗口的 UnboundedSource 读取
- mongodb - MongoDB - 如何编写查询以查找所有元素与包含多个运算符的特定条件匹配的文档?
- javascript - Javascript 检查给定日期是否大于(d/m/yyyy)日期格式中的当前日期显示错误
- node.js - 无法将 bindNodeCallback 与 node-mysql connection.query 一起使用
- javascript - 如何在 PHP 页面中的 JS 中绑定两个文本字段并过滤两者?