我的类有十个属性,必须先设置才能使用该类。
我想强制(或者至少非常强烈地鼓励,最好是警告)我的类的用户在调用类的任何方法之前设置这些属性。
我可以使用一个构造函数,它将所有属性的值作为参数,但我不想这样,因为很多参数都很难用。
我可以检查类的所有方法中的属性值,但这太晚了 - 我想要编译时检查。
我该怎么办?
答案 0 :(得分:6)
也许您可以使用流畅的界面使用Builder Pattern的某些变体。你可以有一些步骤或某些你不能跳过某些属性的东西。例如,要设置构建器的属性Y,您将需要由设置属性X的方法返回的对象。
new Builder().SetX(10).SetY(20) //compiles because SetX returns a class with SetY method
new Builder().SetY(20) //does not compile because the builder only has SetX method
为避免出现多个类,可能会有一个具有多个接口的类,每个接口只暴露一个方法。
另一方面,即使有很多参数,我也可能会选择构造函数
答案 1 :(得分:0)
一些想法:
可选参数应该减少构造函数参数的混乱
public class SomeClass
{
public int Property1 {get; private set;}
public int Property2 {get; private set;}
public int Property3 {get; private set;}
public SomeClass(int some1 = 1, int some2 = 2, int some3 = 3)
{
SomeProperty1 = some1;
SomeProperty2 = some2;
SomeProperty3 = some3;
}
}
易于使用:
var a = new SomeClass(some3: 123);
如果未设置某个值,您可以尝试使用nullables throw
public class SomeClass
{
private int? _property1;
public int Property1 { get { return (int)_property1.Value; } } // will throw
public SomeClass() {}
public int SomeMethod()
{
int val = _property1.Value; // will throw
...
return 123;
}
}
答案 2 :(得分:0)
复杂构造函数的问题是它们通常无法解释预期的来源。例如,假设您有一个可以从字节数组,图像,句柄,内存地址,base64编码字符串或更多等创建的类。
要为每个人提供构造函数,你无法真正描绘它。例如。如果一个构造函数接受一个字符串(即使它的param名称是base64String),它也不是很直观。
我遵循复杂构造函数的一个更好的方法是使我的构造函数变为私有,而是通过公共静态方法公开我的对象的创建,返回它的实例自我。
例如,以.Net Graphics类为例。您可以从图像或Windows句柄等创建图形类,并且每个图形类都有“FromImage,FromHandle等”方法。在我看来,遵循该模式更直观,因为您知道您只是在方法名称中从图像创建它,这可以是一种驯服复杂构造函数和初始化模式的好方法。
答案 3 :(得分:0)
正如@Stilgar所说,Builder模式是一个很好的答案。取决于"鼓励"如果要给最终用户,可以使用带有默认参数的构造函数。这样他们就会看到他们应该设置的东西(使用Intellisense),但也可以选择他们希望用命名参数设置的东西。
public ComplexObject(string P1 = "Test", int P2 = 123, double P3 = 3.1415927)
{
}