出于各种原因,我想开始在设计中使用更多不可变类型.目前,我正在使用一个具有如下现有类的项目:
public class IssueRecord
{
// The real class has more readable names :)
public string Foo { get; set; }
public string Bar { get; set; }
public int Baz { get; set; }
public string Prop { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
public string Prop4 { get; set; }
public string Prop5 { get; set; }
public string Prop6 { get; set; }
public string Prop7 { get; set; }
public string Prop8 { get; set; }
public string Prop9 { get; set; }
public string PropA { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这个类代表了一些确实具有这么多属性的磁盘格式,因此在这一点上将其重构为较小的位几乎是不可能的.
这是否意味着这个类的构造函数确实需要在不可变设计中有13个参数?如果没有,如果我要使这个设计不可变,我可以采取哪些步骤来减少构造函数中接受的参数数量?
Ale*_*kov 14
要减少参数的数量,您可以将它们分组为合理的集合,但要拥有真正的不可变对象,您必须在构造函数/工厂方法中对其进行初始化.
一些变体是创建"构建器"类,您可以使用流畅的接口配置,而不是请求最终对象.如果你真的计划在代码的不同位置创建许多这样的对象,这将是有意义的,否则在一个地方的许多参数可能是可接受的权衡.
var immutable = new MyImmutableObjectBuilder()
.SetProp1(1)
.SetProp2(2)
.Build();
Run Code Online (Sandbox Code Playgroud)
Ree*_*sey 13
这是否意味着这个类的构造函数确实需要在不可变设计中有13个参数?
一般来说,是的.具有13个属性的不可变类型将需要一些初始化所有这些值的方法.
如果它们未全部使用,或者某些属性可以基于其他属性确定,则可能有一个或多个具有较少参数的重载构造函数.但是,构造函数(无论类型是否为不可变)确实应该以类型逻辑上"正确"和"完整"的方式完全初始化类型的数据.
这个类代表了一些确实具有这么多属性的磁盘格式,因此在这一点上将其重构为较小的位几乎是不可能的.
如果"磁盘格式"是在运行时确定的东西,您可能有一个工厂方法或构造函数,它接受初始化数据(即:文件名?等)并为您构建完全初始化的类型.