oop - 值对象的实现是否应该被密封?
问题描述
遵循 DDD 实践,值对象的实现是否应该被密封?想象一下,有一些抽象ValueObject<T>
的和具体的实现作为Money : ValueObject<Money>
. 我应该盖章Money
吗?
public class Money : ValueObject<Money>
{
private Money()
{
}
private Money(decimal value, string currency)
{
Requires.NotEmpty(currency, nameof(currency));
Requires.That(value >= 0, $"{nameof(value)} must be greater or equals to 0.");
Value = value;
Currency = currency.ToUpper();
}
public decimal Value { get; private set; }
/// <summary>
/// <a href="http://currencysystem.com/codes/">ISO 4217</a> currency code
/// </summary>
public string Currency { get; private set; }
public static Money Dkk(decimal value) => new Money(value, "DKK");
public static Money Usd(decimal value) => new Money(value, "USD");
}
解决方案
通常,最好的做法是避免由于组合超过继承建议而导致的多态性。在 DDD 上下文中,在某些情况下允许未来的多态性很有用,但这通常包括实体。
每个定义的值对象应该是不可变的,并且为了避免进一步的误用,将其密封。
有用的链接:http ://thepaulrayner.com/value-objects-and-immutability/
推荐阅读
- python - 在同一数据框中将一列除以另一列时出错
- java - 未找到元素异常:HTMLUnit - 按 ID 搜索
- android - 如何在后台 IntentService 中访问/使用 Room DB(Android、Kotlin、MVVM)?
- bash - 按年份求和并插入缺失的 0 条目
- checkbox - Angular 6 复选框不会根据 ngModel 更改状态
- dns - traefik +letsencrypt 通配符证书 + 无提供者
- java - 鳄梨酱从外部 api 获取密码
- vue.js - 分页。如何通过单击数字在页面之间移动
- html - 元素内有 2 个跨度元素的问题
- thrift - Ambari Thrift 服务器在 oom 时自动重启