应该将哪些参数传递给不可变的类构造函数

本文关键字:不可变 构造函数 参数传递 | 更新日期: 2023-09-27 17:58:47

通常我们想从数据库中构建它们,但我们也可能想创建用于测试的fake,或从文件中加载。

我们是否应该有一个构造函数:

  1. IDataReader
  2. 每个字段
  3. 类的可变版本,因此repo可以创建可变版本,更新它,然后使用此构造函数转换为不可变版本
  4. 完全是别的东西

我不喜欢选项1,因为这意味着每个类都需要了解System.Data,2似乎可以,但似乎需要大量维护,只要我们想添加字段,3似乎也可以,但也需要维护,只要添加字段(尽管小于2)

提前谢谢。

应该将哪些参数传递给不可变的类构造函数

不可变对象通常是通过创建一个构建器来构建的,然后将所有相关的属性设置为它,最后调用Commit()来检索它的不可变版本。

我个人非常喜欢一个看起来像这样的"假"不可变类:

public interface IPlanet
{
    string Name { get; }
}
internal class PlanetBuilder : IPlanet
{
    public string Name { get; set; }
    public IPlanet Commit()
    {
        return this;
    }
}

这种结构的优点在于,它的编写开销非常小。Commit()方法甚至可以重构为一个通用基类。

它的缺点是,任何人都可以通过将对象强制转换回其工厂类类型来篡改对象。