Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> использовать ли глобальные переменные? целесообразность использования гл. п. 
V
    Опции темы
vinter
Дата 13.4.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Цитата(Anikmar @  13.4.2009,  19:35 Найти цитируемый пост)
2 подход. Глобальный объект локальных настроек. Один на всех, который поддерживает необходимые методы для сохранения всего что кому-нибудь нужно.

почему некий внешний объект должен хранить локальные настройки окна? Это не верно. Есть некие глобальные настройки, их можно сделать через глобально доступный синглтон. Но уж никак не делать глобальную переменную.


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 13.4.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: нет
Всего: 26



Цитата(Lazin @  13.4.2009,  19:37 Найти цитируемый пост)
самый простой пример - масштабируемость кода, допустим есть у нас глобальая переменная connection, мы ее юзаем в множестве мест программы, все хорошо, не нужно передавать лишних параметров в методы(ф-ии), достаточно проверить if (connection.connected()) и все, программа растет и обрастает функционалом, и тут выясняется что дальше нам прийдется работать с большим количеством connection-ов, либо с connection-ом другого типа

и каково же решение этой проблемы?
чем например
extern Сonnection_t connection;
отличается от
class SomeNiceSingleton ... {
  ...
  Сonnection_t connection;
  ...
}

Добавлено через 1 минуту и 33 секунды
Цитата(vinter @  13.4.2009,  19:52 Найти цитируемый пост)
Есть некие глобальные настройки, их можно сделать через глобально доступный синглтон. Но уж никак не делать глобальную переменную. 

чем глобальный тип (класс) лучше глобальной переменной?
PM MAIL ICQ   Вверх
MAKCim
Дата 13.4.2009, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 8
Всего: 207



Цитата(Lazin @  13.4.2009,  18:37 Найти цитируемый пост)
и тут выясняется что дальше нам прийдется работать с большим количеством connection-ов, либо с connection-ом другого типа

передавать адрес connection в каждую функцию его использующую религия не позволяет?  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Любитель
Дата 13.4.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 5
Всего: 92



MAKCim, так это будут самые что ни есть неглобальные переменные. Обычный инстан-метод по сути.


--------------------
PM MAIL ICQ Skype   Вверх
vinter
Дата 13.4.2009, 19:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



Цитата(GoldFinch @  13.4.2009,  20:03 Найти цитируемый пост)
чем глобальный тип (класс) лучше глобальной переменной?

1. Нет проблемы имен.
2. Нет проблемы с меж-еденица-трансляционным взаимодействием.
3. При небольшой модификации нет проблем с межпроцессным взаимодействием 


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 13.4.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(GoldFinch @  13.4.2009,  19:03 Найти цитируемый пост)
и каково же решение этой проблемы?

такое
Цитата(MAKCim @  13.4.2009,  19:07 Найти цитируемый пост)
передавать адрес connection в каждую функцию его использующую

в С++ еще можно передавать в кач. параметра конструктора и хранить ссылку(указатель, копию) в экземрляре объекта

Цитата(GoldFinch @  13.4.2009,  19:03 Найти цитируемый пост)
чем например
extern Сonnection_t connection;
отличается от
class SomeNiceSingleton ... {
  ...
  Сonnection_t connection;
  ...
}

возможностью управлять временем жизни синглтона, в отличии от глобальной переменной

Цитата(MAKCim @  13.4.2009,  19:07 Найти цитируемый пост)
религия не позволяет?

позволяет, если что, это был антипример smile 
PM MAIL Skype GTalk   Вверх
zim22
Дата 13.4.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: -1
Всего: 69



Пару фраз вырвал из книги. Полный текст статьи занимает 2-3 страницы.
С.Х.Дьюхерст. Скользкие места С++.

Цитата

Совет 3. Глобальные переменные:
1) затрудняют повторное использование и сопровождение кода
2) увеличивают число зависимостей между компонентами
Пытаясь обосновать использование глобальных переменных, часто говорят, что они мол, удобны.
Это иллюзорный или эгоистический аргумент, поскольку сопровождение программы обычно продолжается дольше, чем первоначальная разработка.
Избегайте использования глобальных переменных. Для достижения тех же результатов имеются более безопасные и гибкие механизмы.



--------------------
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 21:31 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 59



Цитата(vinter @  13.4.2009,  18:52 Найти цитируемый пост)
Есть некие глобальные настройки, их можно сделать через глобально доступный синглтон.

А чем синглтон принципиально отличается от глобальной переменной?

Под глобальной переменной я, например, понимаю не только обычную переменную типа int GlobalIntA, но и объект какого-либо класса, доступный из любого модуля проекта. Какая разница? Доступ через интерфейсные функции? Так и к обычной глобальной переменной можно через интерфейс доступ организовать.

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

Это мое ИМХО, естественно, я достаточно часто использую глобальные переменные когда они мне удобнее и никаких неудобств пока не ощутил. Правда, если бы я сделал глобальной переменную int i - я думаю ощутил бы некоторые неудобства, но для этого на плечах должно быть не только устройство для приема пищи и просмотра телевизора.
ИМХО.
PM MAIL ICQ   Вверх
Lazin
Дата 13.4.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Anikmar @  13.4.2009,  21:31 Найти цитируемый пост)
Под глобальной переменной я, например, понимаю не только обычную переменную типа int GlobalIntA, но и объект какого-либо класса, доступный из любого модуля проекта. Какая разница? Доступ через интерфейсные функции? Так и к обычной глобальной переменной можно через интерфейс доступ организовать.

синглтон - это когда объект некоторого типа, один на все приложение, и другой такой-же создать нельзя, это не то-же самое что и глобальная переменная smile 
PM MAIL Skype GTalk   Вверх
Cтpaнник
Дата 13.4.2009, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



[QUOTE=Anikmar,13.4.2009,  21:31]
Цитата(vinter @  13.4.2009,  18:52 Найти цитируемый пост)
Это мое ИМХО, естественно, я достаточно часто использую глобальные переменные когда они мне удобнее и никаких неудобств пока не ощутил.

А каков размер проекта (в тыс. LOC) и сколько в нем разработчиков?
PM MAIL   Вверх
Rififi
Дата 13.4.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



Proghat
Как лучше писать 
первым способом

и почему?
чтобы не прослыть ламером :eek: :gigi:
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 59



Цитата(Cтpaнник @  13.4.2009,  21:54 Найти цитируемый пост)
А каков размер проекта (в тыс. LOC) и сколько в нем разработчиков? 

Что такое LOC?
У меня варианты:
Чистящие средства: http://www.amway.ru/catalog?category=1094
Влажные салфетки: http://aukro.bigmir.net/item589863303-loc-...e-salfetki.html
Библиотека конгресса США: http://www.loc.gov/index.html

Да не подумайте, что я распространяю СПАМ. Про аббревиатуры уже был разговор. Я не знаю, что такое LOC. Вы имеете в виду кол-во строк? Модулей?

Отвечаю: Размер проекта в LOC-ах примерно по 50К на ШКРАБа  smile 

PM MAIL ICQ   Вверх
Lazin
Дата 13.4.2009, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Lines Of Code
PM MAIL Skype GTalk   Вверх
Fazil6
Дата 13.4.2009, 22:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: нет
Всего: 60



Цитата(GoldFinch @  13.4.2009,  19:03 Найти цитируемый пост)
чем глобальный тип (класс) лучше глобальной переменной?

тем, что поддерживать нужно только интерфейс. 
Используя глобальную переменую мы связываем между собой код, который ею пользуется. 
Сопровождать придется либо внутри " глобального типа" (что проще) либо по всему коду, где глобальная переменная используется
Цитата(Anikmar @  13.4.2009,  21:31 Найти цитируемый пост)
Под глобальной переменной я, например, понимаю не только обычную переменную типа int GlobalIntA, но и объект какого-либо класса, доступный из любого модуля проекта. Какая разница? Доступ через интерфейсные функции? Так и к обычной глобальной переменной можно через интерфейс доступ организовать.Вопрос не в том как это назвать и во что обернуть. Важно то, что существует некий объект (один на проект), состояние которого можно изменить из многих мест в проекте. Т.е. глобальный объект. И какая религия мешает использовать такие объекты (переменные) лично я не понимаю. Зачем вертеться ужом на сковородке только из-за того, что кто-то сказал, что глобальные переменные использовать не надо.

советую читать много раз цитату, которую привел zim22, может быть придет осознание. Главная суть проблемы глобальных переменных совсем не в том, что состояние меняется из разных мест... 
Глобальные переменные также удобны как удобно нарушение инкапсуляции в классах. 

Цитата(zim22 @  13.4.2009,  21:27 Найти цитируемый пост)
Избегайте использования глобальных переменных. Для достижения тех же результатов имеются более безопасные и гибкие механизмы.

согласен. И совсем не нужно для этого вертеться ужом.
PM MAIL   Вверх
Anikmar
Дата 13.4.2009, 23:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 59



Цитата(Lazin @  13.4.2009,  21:49 Найти цитируемый пост)
синглтон - это когда объект некоторого типа, один на все приложение, и другой такой-же создать нельзя, это не то-же самое что и глобальная переменная   

Ну? Глобальная переменная некого типа тоже одна на все приложение и вторую такую-же создать нельзя. Ведь переменная типа "Класс_сингл_тон" одна? - Да. Она глобальная? - Да. В чем ее принципиальная разница от переменной не класса  "Класс_сингл_тон"?

Цитата(Fazil6 @  13.4.2009,  22:26 Найти цитируемый пост)
тем, что поддерживать нужно только интерфейс. 
Используя глобальную переменую мы связываем между собой код, который ею пользуется. 
Сопровождать придется либо внутри " глобального типа" (что проще) либо по всему коду, где глобальная переменная используется


Что значит сопровождать внутри кода? А если поменяем интерфейс - его не надо будет сопровождать внутри кода? Чем отличается сопровождение вызовов интерфейса? К глобальной переменной можно также сделать функции доступа по типу интерфейса. Просто если разделять два понятия как разные - тогда все понятно, но лично для меня они принципиально одинаковые:

Код

Вариант 1.

Определение
int AGlobal;
int BGlobal;

Объявление
extern int AGlobal;
extern int BGlobal;

Использование
AGlobal = 5;
BGlobal = 6;


Вариант 2:
Определение
MyGlobalClass ABC_Global;

Объявление
class MyGlobalClass // Можно синглтон, можно интерфейсные методы какая принципиальная разница?
{
public:
  int AGlobal;
  int BGlobal;
}

extern MyGlobalClass ABC_Global;

Использование:
ABC_Global.AGlobal = 5;
ABC_Global.BGlobal = 6;


Цитата(Lazin @  13.4.2009,  22:23 Найти цитируемый пост)
Lines Of Code 
 Мда. Я это подозревал, но не думал, что так просто. Думал - некая величина, оценивающая объем проекта  smile 

Строк кода - не знаю сколько (хотел посчитать, но что-то простого инструмента не смог найти, чтобы сразу в каталоге и во всех вложенных посчитать кол-во строк CPP и H). Проект небольшой, сразу скажу. По поводу кол-ва человек - этот проект чисто мой (пока). Сейчас просто я немного другими делами занимаюсь. Если подскажете простой способ (без написания программки подсчета - лень) я скажу сколько строк сейчас проект.

Одно время работал в команде, где было человек 15 и проекты были намного солиднее. И глобальные переменные использовали, и никто не путался, и проблем не было. Видимо потому, что начальство было отличное и ТЗ проработанные и взаимодействие отлажено.

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.