Russian Qt Forum
Января 16, 2025, 00:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Глобальные данные - вопрос выбора между singleton и глобальными переменными.  (Прочитано 5275 раз)
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;

Помогите, пожалуйста, определиться, напутствуйте советом.
Заранее благодарю.
Записан
niXman
Гость
« Ответ #1 : Марта 13, 2010, 01:32 »

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Марта 13, 2010, 10:47 »

То есть, есть ли на самом деле резон городить класс, или это вопрос принципа и религии?
Отчетливо видеть все использования глобальных переменных - как минимум весьма желательно, не считаю это прихотью. Объективных возражений против namespace привести не могу, но не видел чтобы кто-то так делал  Улыбающийся
Стандартный подход - класс со static'ами
Код:
class MyGlobalVars {
 public:
  static int mParam1;
  static MyWindow * mWindow;
  ...
};
Это вполне удобно
Записан
sarbash
Гость
« Ответ #3 : Марта 16, 2010, 14:34 »

Остановился на варианте с namespaces.
Не вижу причин не использовать его в данном конкретном случае.
niXman, Igors, благодарю за советы.
Записан
SASA
Гость
« Ответ #4 : Марта 17, 2010, 16:34 »

При использовании глобальных переменных сложно гарантировать единственность. 
Ещё, разделить глобальную переменную в нескольких фйалах - гемор.
Записан
sarbash
Гость
« Ответ #5 : Марта 18, 2010, 16:39 »

никакого гемора не имею.
в хедере - extern-ы.
в cpp - все определения.
всё шоколадно, уложено по полочкам, то есть по namespace-ам, я доволен. Улыбающийся
вся инициализация проходит в одном месте, всё работает как часики.
В данном конкретном случае ни синглтон, ни класс со статиками не понадобился.
Записан
niXman
Гость
« Ответ #6 : Марта 18, 2010, 16:51 »

Цитировать
никакого гемора не имею.
зря радуетесь. ибо такая привычка всегда имеет последствия. а выявить их, порой бывает невообразимо сложно.
Записан
sarbash
Гость
« Ответ #7 : Марта 19, 2010, 11:58 »

Насчёт привычки - согласен.

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

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

Особенно последнее предложение.
Записан
niXman
Гость
« Ответ #8 : Марта 19, 2010, 21:28 »

Цитировать
Особенно последнее предложение.
особенно важно читать не только то, что хочется услышать.

Саттер и Александреску, и многие другие, всегда пишут про "зло глобальных переменных". просто вы этого видеть не хотите Подмигивающий
Записан
sarbash
Гость
« Ответ #9 : Марта 20, 2010, 10:44 »

Просто я считаю, что злом являются не глобальные переменные, а неправильное их употребление. В конечном счёте, тот же класс со статиками является глобальной переменной. И вообще, в любой реальной программе достаточно глобальных объектов, которые по сути те же глобальные переменные. Зло - это злоупотребление. В любом случае, без них - никак, как ни крути.
Ладно, я в общем-то понял ваше мнение, не могу сказать, что оно неправильное, т.к. я не обладаю критериями правильности в этом вопросе, однако, чувствую себя в этом вопросе свободным поступать так, как посчитаю необходимым. Для меня приведённые аргументы и мнения не бесплодны и не бесполезны, т.к. полагаю, что они исходят от людей, которые имеют ценный практический опыт, коего у меня ещё маловато для авторитетных суждений.
Благодарю всех за дискуссию.

P.S. Как альтернативу классам, я использовал namespaces. Так что мои "глобальные" переменные на самом деле оказываются не такими уж и глобальными. Улыбающийся
« Последнее редактирование: Марта 20, 2010, 10:47 от sarbash » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 23.