Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 价值对象的实现是否应该封存?_Oop_Domain Driven Design_Value Objects - Fatal编程技术网

Oop 价值对象的实现是否应该封存?

Oop 价值对象的实现是否应该封存?,oop,domain-driven-design,value-objects,Oop,Domain Driven Design,Value Objects,按照DDD实践,值对象的实现是否应该密封? 想象一下有一些抽象的ValueObject,具体的实现是Money:ValueObject。我应该盖章吗 public class Money : ValueObject<Money> { private Money() { } private Money(decimal value, string currency) { Requires.NotEmpty(currency, na

按照DDD实践,值对象的实现是否应该密封? 想象一下有一些抽象的
ValueObject
,具体的实现是
Money:ValueObject
。我应该盖章吗

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");
}
公共类货币:ValueObject
{
私人资金
{
}
私人货币(十进制值、字符串货币)
{
需要。NotEmpty(货币,名称(货币));
需要。即(值>=0,$“{nameof(值)}必须大于或等于0。”);
价值=价值;
Currency=Currency.ToUpper();
}
公共十进制值{get;private set;}
/// 
///货币代码
/// 
公共字符串货币{get;private set;}
公共静态货币Dkk(十进制值)=>新货币(值,“Dkk”);
公共静态货币美元(十进制值)=>新货币(价值,“美元”);
}

通常,最佳做法是避免由于组合优于继承的建议而导致多态性。在DDD上下文中,有些情况下允许将来的多态性是有用的,但这通常包括实体

每个定义的值对象应该是不可变的,为了避免进一步的误用,请将其密封


有用的链接:

对我来说,在考虑密封时,价值对象与其他类型的对象没有什么区别。这些年来,无数支持和反对它的论点被提出,考虑因素非常复杂,以至于你不想在方程中添加另一个变量


我几乎看不到域模型中的所有VO都被密封,但所有其他类都没有密封。如果您要密封,主要是因为一系列完全不同的原因(组织、性能),这些原因与DDD术语中的对象类型没有太大关系。

因此,在这种情况下,您应该忽略继承吗?我认为有一些基类来重用值对象行为(我当前的抽象)真的很好,一定要把钱封起来,谢谢!你可以。问题是:你真的需要抽象吗?什么是潜在的儿童货币类别?我更喜欢显式代码。这可能会导致一些小的代码重复,但通常会降低复杂性。如果你使用多态性,你就“打开了一扇”可能会影响不变性的门。我的意思是,引入基值对象类并用它来创建密封的派生类有意义吗?我真的明白,在这种情况下,留下一个扩展类的机会是不好的,但我现在想问的问题是,我是否应该删除ValueObject的继承,引入一些接口,并使其实现,例如赚钱。您使用这个抽象类来定义hashCode和equals,对吗?我更喜欢关于我的实现的此类信息,但这可能更像是一个“品味问题”。从技术上讲,这应该是可行的。这个接口的主要行为是什么?