财产的价值应该在一个类别中计算还是留给调用者?

时间:2014-05-23 13:50:40

标签: c# .net properties immutability convention

假设我有一个带有一些属性的不可变类,其中一些可以在类中计算,现在,我可以让调用者计算每个属性的值,或者,我可以让类计算每个属性属性本身。

例如,在下面的课程中必须定义AB& 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...
    }
}

那么是否有任何约定说明何时/何地使用一种方法而不是另一种方法(及其原因)?

3 个答案:

答案 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.
    }
}

在这种情况下,您不需要BC的设置器,并且您有一个可以整齐计算值的getter。您还需要在需要时评估BC

答案 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.
    }
}