当前位置:  开发笔记 > 编程语言 > 正文

如何设计具有复杂初始化的不可变对象

如何解决《如何设计具有复杂初始化的不可变对象》经验,为你挑选了2个好方法。

我正在学习DDD,并且遇到了"值 - 对象"应该是不可变的声明.我知道这意味着对象状态在创建后不应该更改.这对我来说是一种新的思维方式,但在许多情况下它是有道理的.

好的,所以我开始创建不可变的值对象.

我确保他们将整个状态作为构造函数的参数,

我没有添加属性设置器,

并确保不允许任何方法修改内容(仅返回新实例).

但是现在我想创建这个包含8个不同数值的值对象.如果我创建一个具有8个数字参数的构造函数,我觉得它不会很容易使用,或者更确切地说 - 传递数字时很容易出错.这不是一个好的设计.

所以问题是:是否还有其他方法可以使我的不可变对象变得更好..,在C#中可以用来克服构造函数中的长参数列表的任何魔法?我很想听听你的想法..

更新:在任何人提到它之前,这里讨论了一个想法: C#中的不可变对象模式 - 你怎么看?

有兴趣听取其他建议或意见.



1> Andrew Kenna..:

使用构建器:

public class Entity
{
   public class Builder
   {
     private int _field1;
     private int _field2;
     private int _field3;

     public Builder WithField1(int value) { _field1 = value; return this; }
     public Builder WithField2(int value) { _field2 = value; return this; }
     public Builder WithField3(int value) { _field3 = value; return this; }

     public Entity Build() { return new Entity(_field1, _field2, _field3); }
   }

   private int _field1;
   private int _field2;
   private int _field3;

   private Entity(int field1, int field2, int field3) 
   {
     // Set the fields.
   }

   public int Field1 { get { return _field1; } }
   public int Field2 { get { return _field2; } }
   public int Field3 { get { return _field3; } }

   public static Builder Build() { return new Builder(); }
}

然后创建它像:

Entity myEntity = Entity.Build()
                   .WithField1(123)
                   .WithField2(456)
                   .WithField3(789)
                  .Build()

如果某些参数是可选的,则无需调用WithXXX方法,它们可以具有默认值.


这样做的缺点是你没有得到C#3对象初始化器的好处.这可以通过具有属性(以及前C#3客户端的方法)来修复:new Entity.Builder {Field1 = 123,Field2 = 456,Field3 = 789} .Build()

2> Marc Gravell..:

目前,您必须使用具有大量args或构建器的构造函数.在C#4.0(VS2010)中,您可以使用命名/可选参数来实现类似于C#3.0对象初始化器的操作 - 请参阅此处.博客上的例子是:

  Person p = new Person ( forename: "Fred", surname: "Flintstone" );

但是你可以很容易地看到类似的东西如何适用于任何构造函数(或其他复杂的方法).与C#3.0对象初始化器语法(具有可变类型)相比较:

 Person p = new Person { Forename = "Fred", Surname = "Flintstone" };

真的,没什么好说的.

乔恩斯基特发布了关于这个问题的一些想法也一样,在这里.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有