如何最好地处理相互依赖的属性

本文关键字:依赖 属性 何最好 处理 | 更新日期: 2023-09-27 18:12:49

也许属性不是解决这个问题的方法,但我正在努力寻找一个好的解决方案。

public class Blah
{
    public double A { get{ return _B / _C; } }
    public double B
    {
        get{ return _A * _C; }
        set{ _B = value; }
    }
    public double C
    {
        get{ return _B / _A; }
        set{ _C = value; }
    }
    private double _A;
    private double _B;
    private double _C;
    public Blah(){}
    public Blah(double a, double b, double c)
    {
        this._A = a;
        this._B = b;
        this._C = c;
    }
}

假设A始终是一个只读属性,那么处理可能影响A输出的任意数量的附加属性的好方法是什么?我觉得这是一种糟糕的(完全错误的!)方法,因为我应该总是能够检索我分配的值。例如,如果我赋值B = 3,那么我应该能够在下次调用B时得到3,而不是得到_A * _C。

然而,我需要这种类型的相互依赖存在(或者实现相同目标的完全不同的方法)。所有的值都是相关的,所以我需要一个值的变化反映在其他值中。

我就是想不出合适的方法来做这件事。

编辑

我做了一个坏榜样。实际上,非A值并不依赖于A,而只是相互依赖——B影响C, C影响D,等等;然而,A就是这些值的某个组合。我不确定这对如何最好地处理这个问题是否重要,但我认为值得一提。

如何最好地处理相互依赖的属性

似乎称它为属性A并不能很好地描述它。如果你有一个叫做SolveForA()的方法,它会更有意义。其他人也一样。使用WriteOnly属性可能仍然有意义,但我也会使用这些方法。

在我看来,在给出的示例中属性被滥用了。你已经注意到,我们可以预期,如果我们将设置值,我们也将能够得到相同的值。如果重构代码是我的工作,我想我会从这样的开始:

public class Blah
{
    public double A { get; private set; }
    public double B { get; set; }
    public double C { get; set; }
    public double CalculateB()
    {
       ...
    }
    public double CalculateC()
    {
       ...
    }
    public Blah(){}
    public Blah(double b, double c)
    {
        this._B = b;
        this._C = c;
    }
}