|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.12.2011, 21:49 | #31 |
Пользователь
Регистрация: 28.12.2011
Сообщений: 27
|
|
29.12.2011, 21:52 | #32 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
И потом, почему вообще разным единицам трансляции могут вдруг понадобиться масса данных инициализированных в других единицах трансляции? Чем можно объяснить такую ситуацию? Это нарушение инварианта модулей. То есть, модулям для нормальной работы требуется знание о существовании других модулей. Более того, ситуация, когда стабильность работы одного модуля зависит от стабильности работы другого модуля ни о каком инварианте уже и речи не идёт - архитектурный фейл. Впрочем, глобальные данные в принципе разрушают инкапсуляцию и инвариант модулей. Цитата:
Контроль очередности инициализации глобальных данных через одиночку - это полезный побочный эффект самого одиночки. Но строго говоря, одиночка был придуман не для того, что бы им затыкали архитектурые промахи. Последний раз редактировалось _Bers; 29.12.2011 в 21:56. |
||
29.12.2011, 21:54 | #33 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
29.12.2011, 21:56 | #34 |
Пользователь
Регистрация: 28.12.2011
Сообщений: 27
|
|
29.12.2011, 22:05 | #35 |
Пользователь
Регистрация: 28.06.2009
Сообщений: 84
|
ElectroMent предложил мне решение моей проблемы. Если она заработает, у меня появятся глобальные переменные, которые помогут значительно упростить структуру программы. Да, появятся глобальные переменные, но в принципе будет легко модифицировать программу в будущем (что я и планирую).
_Bers, вы предложили мне передавать все через аргументы и не создавать глобальные переменные, при этом я не могу так свободно структурировать алгоритм, как в случае с глобальными переменными. Или я неправ и слишком глуп, чтобы понять предложенное вами решение? |
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 |
Пользователь
Регистрация: 28.06.2009
Сообщений: 84
|
|
29.12.2011, 22:34 | #38 | |||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Рассмотрим такой пример: есть два файла: SomeClass.h и SomeClass.cpp Смотришь в хэдэр - ничего такого криминально не видишь. Он к себе ничего сверху особенного не подключает. Смотришь .cpp, там мало того, что инклюдится ещё целая гора заголовочных не_стандартных файлов. Это ещё фигня. Это можно пережить. Но конструкторы класса инициализируют данные-члены класса при помощи глобального объекта, который инициализируется вообще в другой единице трансляции. Вот это жессть. Захочешь этот SomeClass выдернуть из общей архитектуры, что бы пересадить в другой проект - он за собой половину всей этой упоротой архитектуры потянет. И что самое главное - это все происходит совершенно прозрачно от пользователя. Цитата:
Дальше доступ к данным осуществляется только через служебные переменные самого модуля. Потерь производительности не будет. Цитата:
Примерном грамотно использованного глобального объекта можно считать тот же std::cout - как ты свои модули не конструируй, проблем с каутом не будет. Он всегда корректно проинициализируется. И не требует от модулёй какой то особой заботы о себе. Просто сделай #include <iostream> в единице трансляции, и пользуйся на здоровье. В случае же с автором - если он будет плодить глобальные переменные, он рискует утонуть в extern и получать кучу проблем с неопределённым порядком инициализации глобальных переменных. Я вот даже тезис придумал только что: "правильная глобальная переменная, это такая переменная, которая не требует от единиц трансляции никакой о себе заботы". |
|||
29.12.2011, 22:47 | #39 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Цитата:
Цитата:
Цитата:
но к самим extern'ам, а вот архитектура к ним(верному применению extern) уже не имеет отношения Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||||
29.12.2011, 22:58 | #40 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Ну в общем... как бы пищи для размышлений предостаточно
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разделение программы на отдельные модули (Паскаль) | 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 |