Информация об изменениях

Сообщение Re: Как наиболее корректно работать с глобальными данными от 03.07.2015 13:03

Изменено 03.07.2015 13:05 Evgeny.Panasyuk

Здравствуйте, lnkuser, Вы писали:

L>Везде, абсолютно везде пишут что глобальные переменные, объекты это плохо и очень плохо.


А ещё пишут что goto и friend это плохо. Некоторые даже считают что обычные функции это плохо, и всё должно быть классом/объектом
Я практически для всего что фанатики называют considered harmful видел достойные применения.

L>Но нигде нормального ответа как обходится без них я не нашел. На форуме искал.


Если пытаться без них совсем по-честному, то нужно в каждую функцию использующую глобальное состояние передавать дополнительные параметры — плюсом здесь является чуть более простая кастомизация. Но в случае логирования это редко оправданно.
Как правило же используют те же самые глобальные объекты, но замаскированные под какими-нибудь buzzwords типа ServiceLocator или IoC-Container.

L>Все вроде идеально, но тут будет ошибка линкования.


Тема хорошо раскрыта в Modern C++ Design Александреску.
Один из простых вариантов — это так называемый Meyer's Singleton:
// in header:
inline Log &log()
{
    static Log x;
    return x;
}
Re: Как наиболее корректно работать с глобальными данными
Здравствуйте, lnkuser, Вы писали:

L>Везде, абсолютно везде пишут что глобальные переменные, объекты это плохо и очень плохо.


А ещё пишут что goto и friend это плохо. Некоторые даже считают что обычные функции это плохо, и всё должно быть классом/объектом
Я практически для всего что фанатики называют considered harmful видел достойные применения.

L>Но нигде нормального ответа как обходится без них я не нашел. На форуме искал.


Если пытаться без них совсем по-честному, то нужно в каждую функцию использующую глобальное состояние передавать дополнительные параметры — плюсом здесь является чуть более простая кастомизация. Но в случае логирования это редко оправданно.
Как правило же используют те же самые глобальные объекты, но замаскированные под какими-нибудь buzzwords типа ServiceLocator или IoC-Container.

L>Все вроде идеально, но тут будет ошибка линкования.


Тема хорошо раскрыта в Modern C++ Design Александреску.
Один из простых вариантов — это так называемый Meyers Singleton:
// in header:
inline Log &log()
{
    static Log x;
    return x;
}