Задать вопрос

Как предоставлять правильный доступ к protected полям в таком случае?

Здравствуй, Тостер!
Работая над очередной задачей, допустил баг (допустил || написал ?) и сам же исправил его. И тут я понял какую опасную вещь написал и задался вопросом как правильно такое писать, чтобы если кто будет работать с этим кодом, не наступил на те же грабли.

Есть код:
public abstract class A
{
        protected Foo Bar = new Foo();
        protected bool isDataActual = false;
        public Foo bar
        {
            get
            {
                if (isDataActual)
                {
                    return Bar;
                }
                else
                {
                    calculateData();
                    isDataActual = true;
                    return Bar;
                }
            }
        }
}


В чём заключался баг? В моём классе наследнике, во время выполнения calculateData(), я вместо обращения к Bar, обращался к bar, что опять вызывало calculateData, и так до переполнения стека.

Вопрос вот в чём, как в этом случае стоило написать код так, чтобы другие программисты в своих классах-наследниках не могли допустить ту же ошибку. Случай-то типовый, должны же быть какие-то общепринятые решения.
  • Вопрос задан
  • 251 просмотр
Подписаться 1 Простой 3 комментария
Решение пользователя cicatrix К ответам на вопрос (2)
@cicatrix
было бы большой ошибкой думать
Вообще вызов расчёта из геттера свойства - плохо. И ваша - лишь одна из причин.
С моей точки зрения, поддержка актуального состояния класса - задача самого класса. Если требуется пересчёт, то его надо выполнять при изменении состояния класса (в момент изменения параметров для пересчёта), а не при первой попытке считывания результата (впрочем, случаи разные бывают).
Во вторых, naming convention - все локальные поля должны отличаться от имени внешних свойств. Я, например, все локальные переменные класса снабжаю префиксом m_ (в вашем примере это будет m_Bar.
Ответ написан