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

Как предоставлять правильный доступ к 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, и так до переполнения стека.

Вопрос вот в чём, как в этом случае стоило написать код так, чтобы другие программисты в своих классах-наследниках не могли допустить ту же ошибку. Случай-то типовый, должны же быть какие-то общепринятые решения.
  • Вопрос задан
  • 250 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 2
@cicatrix
было бы большой ошибкой думать
Вообще вызов расчёта из геттера свойства - плохо. И ваша - лишь одна из причин.
С моей точки зрения, поддержка актуального состояния класса - задача самого класса. Если требуется пересчёт, то его надо выполнять при изменении состояния класса (в момент изменения параметров для пересчёта), а не при первой попытке считывания результата (впрочем, случаи разные бывают).
Во вторых, naming convention - все локальные поля должны отличаться от имени внешних свойств. Я, например, все локальные переменные класса снабжаю префиксом m_ (в вашем примере это будет m_Bar.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Советую прочитать для начала https://ru.scribd.com/document/56782158/All-In-One... Во вторых, продумывайте изначально структуру классов, не стоит давать защищенный доступ как бы на будущее, даже если писать код будете не вы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы