应该将哪些参数传递给不可变的类构造函数
本文关键字:不可变 构造函数 参数传递 | 更新日期: 2023-09-27 17:58:47
通常我们想从数据库中构建它们,但我们也可能想创建用于测试的fake,或从文件中加载。
我们是否应该有一个构造函数:
- IDataReader
- 每个字段
- 类的可变版本,因此repo可以创建可变版本,更新它,然后使用此构造函数转换为不可变版本
- 完全是别的东西
我不喜欢选项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()
方法甚至可以重构为一个通用基类。
它的缺点是,任何人都可以通过将对象强制转换回其工厂类类型来篡改对象。