Является ли плохим дизайном кода использование статической переменной вне области видимости?

Является ли плохим дизайном кода использование статической переменной вне области видимости?
Является ли плохим дизайном кода использование статической переменной вне области видимости? - leakatharinafr @ Unsplash

Поздравляем, вы выяснили, почему скрытое глобальное состояние - это плохо.

К сожаленью, вам придется изменить целую кучу кода, чтобы исправить это.

class Counter {
    int counter;
public:
    Counter(int counter = 0) : counter(counter) {}
    void func() { ++counter; /* some code */ }
}

int main() 
{
    Counter c;
    /* some code */
    c = Counter(2);
    /* some code */
    return 0;
}

Везде, где просто вызывался func, теперь нужна ссылка на Counter.

Я собираюсь предположить, что одна из причин, по которой вам "нужно модифицировать" счетчик, заключается в том, что вы хотите вернуться в некоторое предыдущее состояние после того, как вызвали func несколько раз. К счастью, вы можете легко добиться этого с помощью класса Counter, скопировав его и оперируя копией.

Т.е. вместо

void doStuffAndRevert() {
    int existing = func() - 1; // include the initial ++
    func();
    func() = existing; // reset to start
}

вы можете, используя pass-by-value, убедиться, что у вас есть локальная копия:

void doStuffAndRevert(Counter c) {
    c.func();
    c.func();
    c.func();
}

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - Признаки плохого программиста

Прикрепленное видео 2 - 🎧 Карта специальности инженер-программист

Прикрепленное видео 3 - 20140305 02


LetsCodeIt, 2 января 2023 г., 07:06