假设我有一个带有一些属性的不可变类,其中一些可以在类中计算,现在,我可以让调用者计算每个属性的值,或者,我可以让类计算每个属性属性本身。
例如,在下面的课程中必须定义A
。 B
& C
的值可以从A
计算得出。
让调用者定义属性
class Z
{
public int A { get; private set; }
public int B { get; private set; }
public int C { get; private set; }
public Z(int a, int b, int c)
{
A = a; // Must always be explicitly defined.
B = b; // Explicit definition is optional.
C = c; // Explicit definition is optional.
}
}
让类定义尽可能多的属性,
class Z
{
public int A { get; private set; }
public int B { get; private set; }
public int C { get; private set; }
public Z(int a)
{
A = a; // Must always be explicitly defined.
B = // Calculation logic involving A...
C = // More calculation logic involving A...
}
}
那么是否有任何约定说明何时/何地使用一种方法而不是另一种方法(及其原因)?
答案 0 :(得分:2)
我说最好的方法是这样的:
class Z
{
public int A { get; private set; }
public int B { get {return a*a;} }
public int C { get {return b*a;} }
public Z(int a)
{
A = a; // Must always be explicitly defined.
}
}
在这种情况下,您不需要B
和C
的设置器,并且您有一个可以整齐计算值的getter。您还需要在需要时评估B
和C
。
答案 1 :(得分:2)
你应该采用第二种方法。在这种情况下似乎很清楚,计算这些派生值是这个类的责任。通过要求类的调用者进行计算并向该类提供数据,它允许类最终处于无效状态;当它计算值本身时,它能够确保它永远不会处于无效状态。
答案 2 :(得分:1)
你不能做到以下几点:
class Z
{
private int a;
public int A { get;
private set
{
a = value;
B = //calculation
C = //calculation
}
}
public int B { get; private set; }
public int C { get; private set; }
public Z(int a)
{
A = a; // Must always be explicitly defined.
}
}