Как лучше всего обрабатывать взаимозависимые свойства? - PullRequest
0 голосов
/ 01 ноября 2011

Возможно, свойства не подходят для этого, но я изо всех сил пытаюсь найти ответ относительно хорошего решения.

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, тогда я смогу получить 3 в следующий раз, когда я позвоню B, вместо того, чтобы получить _A * _C.

Однако мне нужно, чтобы этот тип взаимозависимости существовал (или совершенно другой подход, который достигает той же цели). Все значения связаны, поэтому мне нужно, чтобы изменение одного значения было отражено в других.

Я просто не могу найти подходящий способ сделать это.

Редактировать

Я сделал плохой пример. В действительности, значения не-A не зависят от A, а только друг от друга - B влияет на C, C влияет на D и т. Д .; однако, A - это просто некоторая комбинация этих значений. Не уверен, имеет ли это значение, как лучше всего к этому подойти, но подумал, что стоит упомянуть.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Кажется, что называть это свойством A не очень хорошо.Если бы у вас был метод с именем SolveForA(), это имело бы гораздо больше смысла.То же самое для других.Использование свойств WriteOnly все еще может иметь смысл, но я бы также сделал эти методы.

0 голосов
/ 01 ноября 2011

На мой взгляд в представленном примере свойства используются не по назначению.Вы уже заметили, что мы можем ожидать, что, если мы установим значение, мы сможем также получить то же значение.Если бы рефакторинг кода был моей работой, я бы хотел начать с чего-то вроде:

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;
    }
}
...