Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2011, 21:49   #31
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
1.Тщательнее проектировать архитектуру.
2. см #15 сообщение.
Вот именно такой "конкретики" человек и ждет... стало ясно что к чему.
ElectroMent вне форума Ответить с цитированием
Старый 29.12.2011, 21:52   #32
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
экстерн более быстрый механизм для межмодульных данных, куда лучше чем вызовы функций(с проверками вечными).
что в С, что в С++.
Экономия на спичках? В ущерб сопровождению?

И потом, почему вообще разным единицам трансляции могут вдруг понадобиться масса данных инициализированных в других единицах трансляции?

Чем можно объяснить такую ситуацию?

Это нарушение инварианта модулей. То есть, модулям для нормальной работы требуется знание о существовании других модулей. Более того, ситуация, когда стабильность работы одного модуля зависит от стабильности работы другого модуля ни о каком инварианте уже и речи не идёт - архитектурный фейл.

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

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
хотя насчет кучи "незаменимых" глобальных переменных согласен.
но функция вместо переменной не лучше.
Одиночку не зря придумали, у него есть своя область применения, где именно он является наиболее удачным решением.
Контроль очередности инициализации глобальных данных через одиночку - это полезный побочный эффект самого одиночки. Но строго говоря, одиночка был придуман не для того, что бы им затыкали архитектурые промахи.

Последний раз редактировалось _Bers; 29.12.2011 в 21:56.
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 21:54   #33
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ElectroMent Посмотреть сообщение
Вот именно такой "конкретики" человек и ждет... стало ясно что к чему.
Не понял этого сообщения.
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 21:56   #34
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Не понял этого сообщения.
Сарказм .
ElectroMent вне форума Ответить с цитированием
Старый 29.12.2011, 22:05   #35
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

ElectroMent предложил мне решение моей проблемы. Если она заработает, у меня появятся глобальные переменные, которые помогут значительно упростить структуру программы. Да, появятся глобальные переменные, но в принципе будет легко модифицировать программу в будущем (что я и планирую).

_Bers, вы предложили мне передавать все через аргументы и не создавать глобальные переменные, при этом я не могу так свободно структурировать алгоритм, как в случае с глобальными переменными. Или я неправ и слишком глуп, чтобы понять предложенное вами решение?
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 22:06   #36
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
То есть, модулям для нормальной работы требуется знание о существовании других модулей.
начнем с того что модуль, который использует другой, итак знает о его существовании.
Цитата:
Впрочем, глобальные данные в принципе разрушают инкапсуляцию и инвариант модулей.
ни капли, если вынесено именно то что реально нужно, а не все подряд.
особенно в С++ с пространствами имен.
Цитата:
Экономия на спичках? В ущерб сопровождению?
ущерба нет ни капли.
getScreen() хуже чем глобальная переменная Screen, ибо если в цикле, то это же замедление значительное.
хуже когда вместо методов/функций(и переменных) для работы со Screen(Screen должен быть один объект, который в себе хранит все что нужно для работы с экраном) используются тысячи глобальных переменных, это реальный фейл.
Цитата:
И потом, почему вообще разным единицам трансляции могут вдруг понадобиться масса данных инициализированных в других единицах трансляции?
я же сказал что они должны быть минимизированы до реально необходимых.
например в том же С, errno, она реально нужная.
в С++, это std::cin, std::cout, std::cerr.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2011, 22:09   #37
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Цитата:
Сообщение от mmx358 Посмотреть сообщение
..... Я решил это, передавая указатель по ссылке .....
Не по ссылке, а по значению, через параметр.
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 22:34   #38
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
начнем с того что модуль, который использует другой, итак знает о его существовании.
Ну вот чем меньше знает модуль, тем он надёжнее в конечном итоге.

Рассмотрим такой пример: есть два файла: SomeClass.h и SomeClass.cpp

Смотришь в хэдэр - ничего такого криминально не видишь. Он к себе ничего сверху особенного не подключает.

Смотришь .cpp, там мало того, что инклюдится ещё целая гора заголовочных не_стандартных файлов. Это ещё фигня. Это можно пережить.

Но конструкторы класса инициализируют данные-члены класса при помощи глобального объекта, который инициализируется вообще в другой единице трансляции.

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

И что самое главное - это все происходит совершенно прозрачно от пользователя.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ни капли, если вынесено именно то что реально нужно, а не все подряд.
особенно в С++ с пространствами имен.
ущерба нет ни капли.
getScreen() хуже чем глобальная переменная Screen, ибо если в цикле, то это же замедление значительное.
Что мешает один раз при инициализации модуля взять из единой глобальной точки доступа все, что необходимо для работы?

Дальше доступ к данным осуществляется только через служебные переменные самого модуля. Потерь производительности не будет.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
хуже когда вместо методов/функций(и переменных) для работы со Screen(Screen должен быть один объект, который в себе хранит все что нужно для работы с экраном) используются тысячи глобальных переменных, это реальный фейл.
я же сказал что они должны быть минимизированы до реально необходимых.
например в том же С, errno, она реально нужная.
в С++, это std::cin, std::cout, std::cerr.
Ну это да. Но в том то и дело, что у автора screen юзает именно внешние источники данных, и полностью зависит от их корретности. Вместо того, что бы иметь своё собственное, что ему нужно для работы.

Примерном грамотно использованного глобального объекта можно считать тот же std::cout - как ты свои модули не конструируй, проблем с каутом не будет. Он всегда корректно проинициализируется. И не требует от модулёй какой то особой заботы о себе. Просто сделай #include <iostream> в единице трансляции, и пользуйся на здоровье.

В случае же с автором - если он будет плодить глобальные переменные, он рискует утонуть в extern и получать кучу проблем с неопределённым порядком инициализации глобальных переменных.

Я вот даже тезис придумал только что: "правильная глобальная переменная, это такая переменная, которая не требует от единиц трансляции никакой о себе заботы".
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 22:47   #39
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Захочешь этот SomeClass выдернуть из общей архитектуры, что бы пересадить в другой проект - он за собой половину всей этой упоротой архитектуры потянет.
кучу модулей он так или иначе потянет если ему это нужно, глобальные переменные тут не причем.
Цитата:
Я вот даже тезис придумал только что: "правильная глобальная переменная, это такая переменная, которая не требует от единиц трансляции никакой о себе заботы".
я к этому и клонил.
Цитата:
и получать кучу проблем с неопределённым порядком инициализации глобальных переменных.
скорее всего проблем не выйдет, а вот запариться с их инициализацией да.
Цитата:
он рискует утонуть в extern
если их сразу грамотно писать, то все будет ок.
но к самим extern'ам, а вот архитектура к ним(верному применению extern) уже не имеет отношения
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.12.2011, 22:58   #40
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Ну в общем... как бы пищи для размышлений предостаточно
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделение программы на отдельные модули (Паскаль) Olya1 Помощь студентам 1 08.07.2011 11:25
Разбиение программы на модули Neolit1819 Общие вопросы C/C++ 4 11.04.2011 19:14
разбиение программы на модули SUDALV Помощь студентам 1 22.06.2010 22:01
Создание программы использующей ICQ протокол SuBwooFer Общие вопросы C/C++ 1 17.01.2010 13:50
Рзработка модуля и программы использующей этот модуль (Delphi) Sonny01 Помощь студентам 2 07.11.2009 17:26