Russian Qt Forum

Программирование => С/C++ => Тема начата: sarbash от Марта 13, 2010, 00:51



Название: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: sarbash от Марта 13, 2010, 00:51
Начитался тут всякого-разного...
В общем, и меня постигло неизбежное - нужно где-то положить несколько общедоступных параметров.
Начитался, что в этом случае синглтоны - самое тру.
Но возник вопрос: что я не могу сделать с синглтоном, что я мог бы сотворить с переменной, завёрнутой в namespace?
То есть, есть ли на самом деле резон городить класс, или это вопрос принципа и религии?

К примеру:

Код:
namespace sgt {
    int my_param;
}

где-то в коде:
sgt::my_param = 5;

class sgt {
public:
    int my_param;
}

где-то в коде:
sgt::getInstance()->my_param = 5;

Помогите, пожалуйста, определиться, напутствуйте советом.
Заранее благодарю.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: niXman от Марта 13, 2010, 01:32
глобальные переменные, это всегда зло, за исключением момента, когда они константны. не важно, в неймспейсе они, или тупо глобальны.

сугубо мое мнение: никогда не возникало надобности, использовать НЕконстантные глобальные переменные. скорее ошибка проектирования.
возможно нужно подумать о пересмотре структуры проекта.
ну, или, пример приведите, когда это действительно нужно.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: Igors от Марта 13, 2010, 10:47
То есть, есть ли на самом деле резон городить класс, или это вопрос принципа и религии?
Отчетливо видеть все использования глобальных переменных - как минимум весьма желательно, не считаю это прихотью. Объективных возражений против namespace привести не могу, но не видел чтобы кто-то так делал  :)
Стандартный подход - класс со static'ами
Код:
class MyGlobalVars {
 public:
  static int mParam1;
  static MyWindow * mWindow;
  ...
};
Это вполне удобно


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: sarbash от Марта 16, 2010, 14:34
Остановился на варианте с namespaces.
Не вижу причин не использовать его в данном конкретном случае.
niXman, Igors, благодарю за советы.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: SASA от Марта 17, 2010, 16:34
При использовании глобальных переменных сложно гарантировать единственность. 
Ещё, разделить глобальную переменную в нескольких фйалах - гемор.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: sarbash от Марта 18, 2010, 16:39
никакого гемора не имею.
в хедере - extern-ы.
в cpp - все определения.
всё шоколадно, уложено по полочкам, то есть по namespace-ам, я доволен. :)
вся инициализация проходит в одном месте, всё работает как часики.
В данном конкретном случае ни синглтон, ни класс со статиками не понадобился.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: niXman от Марта 18, 2010, 16:51
Цитировать
никакого гемора не имею.
зря радуетесь. ибо такая привычка всегда имеет последствия. а выявить их, порой бывает невообразимо сложно.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: sarbash от Марта 19, 2010, 11:58
Насчёт привычки - согласен.

Понравилось, как у Страуструпа написано:

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

Особенно последнее предложение.


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: niXman от Марта 19, 2010, 21:28
Цитировать
Особенно последнее предложение.
особенно важно читать не только то, что хочется услышать.

Саттер и Александреску, и многие другие, всегда пишут про "зло глобальных переменных". просто вы этого видеть не хотите ;)


Название: Re: Глобальные данные - вопрос выбора между singleton и глобальными переменными.
Отправлено: sarbash от Марта 20, 2010, 10:44
Просто я считаю, что злом являются не глобальные переменные, а неправильное их употребление. В конечном счёте, тот же класс со статиками является глобальной переменной. И вообще, в любой реальной программе достаточно глобальных объектов, которые по сути те же глобальные переменные. Зло - это злоупотребление. В любом случае, без них - никак, как ни крути.
Ладно, я в общем-то понял ваше мнение, не могу сказать, что оно неправильное, т.к. я не обладаю критериями правильности в этом вопросе, однако, чувствую себя в этом вопросе свободным поступать так, как посчитаю необходимым. Для меня приведённые аргументы и мнения не бесплодны и не бесполезны, т.к. полагаю, что они исходят от людей, которые имеют ценный практический опыт, коего у меня ещё маловато для авторитетных суждений.
Благодарю всех за дискуссию.

P.S. Как альтернативу классам, я использовал namespaces. Так что мои "глобальные" переменные на самом деле оказываются не такими уж и глобальными. :)