Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопросы по оформлению кода

87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Так как в прикрепленную тему писать не красиво, создаю новую тему.

1 Вопрос. Как принято в больших проектах объявлять и определять глобальные переменные? Я пока придумал следующую модель: все глобальные переменные выносятся в отдельный файл (файлы), где и определяются. В других файлах они по необходимости объявляются с помощью extern. А в какой файл их лучше вынести – в заголовочный ли или нет, пока не определился.

2 Вопрос. Например, в проекте есть много классов, используется много заголовочных файлов. Принято ли выносить из файла все включения заголовочных файлов в отдельный заголовочный файл, чтобы заменить многие строки с включениями заголовочных файлов на одну?
590
23 февраля 2008 года
Gigahard
223 / / 03.04.2006
Почему в прикрепленную тему писать не красиво? Наверное ее для того и прикрепили, дабы в нее писать, а не плодить кучи новых одинаковых тем ;)

1)Для сишника где объявлены все глобальные переменные (к примеру тот, где находится main()) написать хедер, где продублировать все глобальные переменные с параметром extern. А потом включать этот хедер в необходимые модули.
Этот способ предпочтительней, т.к. позволяет контролировать инизиализацию переменных.
Забить все переменные в хедер без extern не очень хорошая идея, т.к. в принципе хедер не предназначен для инициализации этих переменных.
Забивать переменные в сишник и вызывать их из других сишников с параметром extern это компромис, но зачем все время дописывать extern, когда это можно один раз сделать в хедере и потом включать его в нужный модуль.

2) Для удобства можно вынести в отдельный файл, но я всегда кодируя модуль, включаю только необходимые для этого модуля хедеры.
Главное, это писать хедеры с макрос защитой от многократного включения.
87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Gigahard
Почему в прикрепленную тему писать не красиво? Наверное ее для того и прикрепили, дабы в нее писать, а не плодить кучи новых одинаковых тем ;)



Меня смутило вот это:
[QUOTE=Odissey_]Хочешь задать вопрос, пиши или в личку или создавай отдельную тему. А результат уже перенесем сюда[/QUOTE]

Понравился ответ на первый вопрос. Логично.

255
23 февраля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Имхо, использование extern - существенно понижает читабельность кода, в конче концов не зря придумали такую вещь - как передача параметров. Так что же мешает передавать их в те места программы, куда нужно?
Что, касается ответа на второй вопрос - то это по-моему дело вкуса.
590
23 февраля 2008 года
Gigahard
223 / / 03.04.2006
ИМХО, использование/не использование глобальных переменных это всего лишь вопрос удобства.
Стоит ли перегружать функции лишними параметрами, если этот самый параметр, к примеру, изменяется всего раз за время работы программы при инициализации (т.е. представляет что то вроде константы), но используется во многих функциях?
ИМХО, это таскание ненужной обузы.
87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Dart Bobr
Имхо, использование extern - существенно понижает читабельность кода, в конче концов не зря придумали такую вещь - как передача параметров. Так что же мешает передавать их в те места программы, куда нужно?



В моей программе кроме главного окна есть несколько диалоговых окон со своими функциями обратного вызова. И мне удобнее передавать параметры из одного окна в другое с помощью глобальных переменных. Там, где просто обойтись без глобальных переменных стараюсь их не использовать.

3
23 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gigahard

Стоит ли перегружать функции лишними параметрами, если этот самый параметр, к примеру, изменяется всего раз за время работы программы при инициализации (т.е. представляет что то вроде константы), но используется во многих функциях?
ИМХО, это таскание ненужной обузы.


Для этого (в частности) придумали классы и методы классов.

590
23 февраля 2008 года
Gigahard
223 / / 03.04.2006
Ну допустим речь идет о С.
Хотя утверждать этого со 100% вероятностью не стоит :).
Есть список переменных, которые нужно использовать в разных модулях... И собственно чем классы принципально лучше? Как тут классы особо помогают? Запихнуть все глобальные переменные в один класс и объявить их статическими?
Или наследовать от класса хранилища производные классы?
А если программа типа hello world и горожение лишних классов, это торможение и усложнение процесса разработки... Программирование ради программирования?
Подходов куча. Каждый использует то, что нравится. И глобальные переменные не самый плохой вариант.:)
87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Речь идет не о C.

Можно много говорить разных слов, но проще, когда есть какой-то пример.

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

Конечно, во втором случае не надо использовать extern, но это не зничит, что путаницы станет меньше - глобальный параметр будет один, а ощущение будет, что их несколько, когда я буду обращаться к нему из разных экземляров класса...

Хотя тут можно подумать. Может лучше сделать класс (структуру) с глобальными переменными, а затем где надо создавать экземляр этого класса. Возможно, это не такой изврат, как кажется на первый взгяд :)
3
23 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gigahard

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


Для начала обрати внимание, на какую именно фразу я написал ответ в предыдущем посте:

Цитата: Gigahard

Стоит ли перегружать функции лишними параметрами, если этот самый параметр, к примеру, изменяется всего раз за время работы программы при инициализации (т.е. представляет что то вроде константы), но используется во многих функциях?
ИМХО, это таскание ненужной обузы.


Если функции работают с некоторым набором данных, есть смысл инкапсулировать эти данные и алгоритмы их обработки в соотв. классе.

НЕ БЫВАЕТ просто "списка переменных, которые нужно использовать в разных модулях". Данные всегда можно сопоставить с алгоритмами их обработки и соединить это воедино.

Цитата: Gigahard

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


Зачем? Незачем весь мусор переваливать из глобального пространства имен в другое. Данные вполне можно структурировать и объединять с методами их обработки в соотв. классах. Для чего их делать статическими, тоже не понятно. При чем тут наследование, тоже остается загадкой...

Цитата: Gigahard

А если программа типа hello world и горожение лишних классов, это торможение и усложнение процесса разработки... Программирование ради программирования?


Это случайно не какая-то фобия использования классов?
Стройная архитектура без лишних, а тем более неявных взаимосвязей не тормозит и не усложняет процесс разработки, а наоборот. Надо просто уметь разделять "классы" и "лишние классы".

Цитата: Gigahard

Подходов куча. Каждый использует то, что нравится. И глобальные переменные не самый плохой вариант.:)


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

3
23 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom

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


Т.е. как это "объявлять статическую переменную в классе как глобальную" ?!

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

Цитата: Kogrom

Конечно, во втором случае не надо использовать extern, но это не зничит, что путаницы станет меньше - глобальный параметр будет один, а ощущение будет, что их несколько, когда я буду обращаться к нему из разных экземляров класса...


Какая путаница?
Конкретный пример, приведи.

Цитата: Kogrom

Хотя тут можно подумать. Может лучше сделать класс (структуру) с глобальными переменными, а затем где надо создавать экземляр этого класса. Возможно, это не такой изврат, как кажется на первый взгяд :)


Это не изврат, это бред какой-то...

87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Конкретный пример, приведи.
Это не изврат, это бред какой-то...



Может я под вечер уже бредить начал. Возможно. Такое померещилось:

1. В заголовочном файле:

Код:
class Globals
{
public:
    static int counter;
    static int myVar;
    Globals()
    {
        counter = 0;
        myVar = 1;
    }
};

2. В исполнительном файле:
 
Код:
int Globals::counter;
int Globals::myVar;

Globals glob1;
Globals glob2;
glob1.counter++;
glob2.counter++;// тут glob1.counter уже равен двум
...

тока как этот бред теперь по разным файлам растащить - пока не понял. Надо на практике проверить :)
3
23 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Может я под вечер уже бредить начал. Возможно. Такое померещилось:

1. В заголовочном файле:
Код:
class Globals
{
public:
    static int counter;
    static int myVar;
    Globals()
    {
        counter = 0;
        myVar = 1;
    }
}

2. В исполнительном файле:
 
Код:
int Globals::counter;
int Globals::myVar;

Globals glob1;
Globals glob2;
glob1.counter++;
glob2.counter++;// тут glob1.counter уже равен двум
...

тока как этот бред теперь по разным файлам растащить - пока не понял. Надо на практике проверить :)


А зачем такое делать?
Для чего вообще может понадобиться такой класс?
Не использовать глобальные переменные, а использовать классы - это не значит свалить все глобальные переменные в статические поля классов. Так ты от глобальных данных не избавился.

87
23 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Так ты от глобальных данных не избавился.



А у меня не было задачи избавиться от глобальных данных. Была задача избавиться от extern. А вот смог ли я её решить, мне ещё не ясно. Завтра на свежую голову буду разбираться.

3
24 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
А у меня не было задачи избавиться от глобальных данных. Была задача избавиться от extern. А вот смог ли я её решить, мне ещё не ясно. Завтра на свежую голову буду разбираться.


А я рекомендую избавится от глобальных данных. Это куда более правильный подход. Ты не с тем борешься, не над тем ломаешь голову. Мусор лучше убрать, чем прикрывать его разного рода газетками... с надписью extern или static...

87
24 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Мы говорим немного на разных языках. Вот мои представления о применении глобальных переменных.

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

2. Если я правильно понимаю идеологию win32 api, то окна (диалоговые окна, контролы, и т.д.) не являются нормальными классами. И когда я применяю функции типа DialogBox, CreateDialog я не могу передать диалоговому окну указатель на объект, на который оно будет воздействовать. Значит, мне надо либо придумывать какие-то заумные функции для передачи этого указателя на управляемый объект, либо объект должен быть глобальным.

3. Все функции работы с диалоговыми окнами в моём проекте мне неудобно содержать в одном файле, так как этих окон несколько и кода получается сравнительно много.
3
24 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Мы говорим немного на разных языках. Вот мои представления о применении глобальных переменных.

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


Правильно.

Цитата: Kogrom

2. Если я правильно понимаю идеологию win32 api, то окна (диалоговые окна, контролы, и т.д.) не являются нормальными классами.


Они вообще не являются классами. Windows - не ОО ОС.
Но никто не мешает их обернуть в ОО обертку.

Цитата: Kogrom

И когда я применяю функции типа DialogBox, CreateDialog я не могу передать диалоговому окну указатель на объект, на который оно будет воздействовать. Значит, мне надо либо придумывать какие-то заумные функции для передачи этого указателя на управляемый объект, либо объект должен быть глобальным.


Зачем он должен быть глобальным? Твои рассуждения не верны.
Посмотри на оконные библиотеки, например, MFC, WTL, Qt и пр.
Они спокойно обходятся без глобальных объектов.
Я вообще не понимаю, при чем тут глобальные объекты?

Цитата: Kogrom

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


Ну и?
А... ты про extern? Так нет глобальных переменных, нет extern.

87
24 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
[QUOTE=Green]
Они вообще не являются классами. Windows - не ОО ОС.
Но никто не мешает их обернуть в ОО обертку.[/QUOTE]

Никто не мешает. В дальнейшем может и сделаю что-то подобное, но сейчас нет времени даже на то, чтобы продумать насколько это необходимо в моём случае.
[QUOTE=Green]
Зачем он должен быть глобальным? Твои рассуждения не верны.
Посмотри на оконные библиотеки, например, MFC, WTL, Qt и пр.
Они спокойно обходятся без глобальных объектов.
Я вообще не понимаю, при чем тут глобальные объекты?[/QUOTE]
MFC, WTL мой компилятор(mingw) не поддерживает, как я понимаю. Прикручивать другие библиотеки пока нет времени, нет подходящей документации...

Конечно, в дальнейшем надо будет что-то придумать с окнами, чтобы не использовать глобальные переменные. Однако, это не повод сейчас всё бросить и начать решать данную проблему, которая наверняка потребует у меня много времени.
3
24 февраля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Kogrom
Никто не мешает. В дальнейшем может и сделаю что-то подобное, но сейчас нет времени даже на то, чтобы продумать насколько это необходимо в моём случае.

MFC, WTL мой компилятор(mingw) не поддерживает, как я понимаю. Прикручивать другие библиотеки пока нет времени, нет подходящей документации...

Конечно, в дальнейшем надо будет что-то придумать с окнами, чтобы не использовать глобальные переменные. Однако, это не повод сейчас всё бросить и начать решать данную проблему, которая наверняка потребует у меня много времени.


Документация обычно идет непосредственно с библиотеками.
Может, это просто нежелание что-то изучать, а времени ты потратил больше на выяснение вопросов с extern.
Вот к примеру результат одноминутного поиска:
http://voxel3d.strana.de/articles/mingwqtemacs.html

Вот ещё эта тема будет полезна:
http://forum.codenet.ru/showthread.php?t=13810

87
25 февраля 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Green
Документация обычно идет непосредственно с библиотеками.
Может, это просто нежелание что-то изучать, а времени ты потратил больше на выяснение вопросов с extern.
Вот к примеру результат одноминутного поиска:
http://voxel3d.strana.de/articles/mingwqtemacs.html

Вот ещё эта тема будет полезна:
http://forum.codenet.ru/showthread.php?t=13810



Интересные ссылки, особенно вторая (так как сам думал о подобном подходе).

На счет, того, что времени на выяснение вопроса с extern я потратил больше - это вы погорячились. На это я потратил 5 минут, а на изучение применения библиотек типа qt и на применение этих знаний при изменении кода программы у меня может уйти месяц или больше. Так что изучение прогрессивных технологий откладывается в TODO...

590
15 апреля 2008 года
Gigahard
223 / / 03.04.2006
Возвращаясь к теме. Вот имеется у меня некая система обмена данными. Функции обмена собраны в один класс обертку. Класс помио всего прочего хранит идентификатор сессии. Функции обмена в данном классе являются типовыми, т.е. представлены только в общем виде. К примеру создать соединение, отключится, послать запрос, принять ответ, очистить буфер.
Каждый объект данных посылает свой тип запроса и анализирует свой тип ответа. При этом для всех используется общее соединение, т.е. в течении всей программы, всеми объектами используется одна и та же сессия. Т.е. в данном случае класс обертка является синглтоном-провайдером.
И как позвольте спросить сделать так, чтобы каждый объект данных получал доступ к этому сиглтону, кроме как объявить его глобальным?
87
15 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Предлагаю вначале ознакомиться с этим:

http://forum.codenet.ru/showthread.php?t=43870&highlight=singleton

ну и этим

http://forum.codenet.ru/showthread.php?t=45072
590
15 апреля 2008 года
Gigahard
223 / / 03.04.2006
Первая ссылка - это горожение огорода в случае решения простой задачи, вторая ссылка уже перечитана несколько раз. Ну что скажешь, междусобойчик не приводящий особо никаких аргументов ни за не против, ни легких альтернативных решений.
Я синглтон не разрабатывал. Он есть как факт и его использование это единственный вариант работы с системой. Ну или пользовать набор глобальных функций и переменных "россыпью"...
Борьба с синглтонами и с глобальными переменными ради борьбы с ними - это профанация и по всей видимости мания.
87
15 апреля 2008 года
Kogrom
2.7K / / 02.02.2008
Я эти ссылки привел не для того, чтобы что-то доказать. Просто в них почти тоже самое обсуждается, тогда какой смысл делать 2 одинаковые темы?
3
15 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gigahard
Первая ссылка - это горожение огорода в случае решения простой задачи


Плз, предложите в соотв. ветку другое решение этой "простой задачи".

Цитата: Gigahard

И как позвольте спросить сделать так, чтобы каждый объект данных получал доступ к этому сиглтону, кроме как объявить его глобальным?


Передать каждому объекту ссылку на эту обертку.
P.S. А бывают не глобальные синглтоны? И что ты подразумеваешь под "глобальностью"?

590
16 апреля 2008 года
Gigahard
223 / / 03.04.2006
Плз, предложите в соотв. ветку другое решение этой "простой задачи".
Я не Ваш вариант называю "простой задачей", а говорю о том, что в случае с простыми задачами Ваш вариант, это стреляние из пушки по воробъям. В больших проектах с возможным их расширением и перекраиванием безусловно Ваш подход оправдан.
А бывают не глобальные синглтоны? И что ты подразумеваешь под "глобальностью"?
Не нужно к словам цеплятся... Я собственно и говорю про то, что других путей кроме глобальности, в данном случае нет.
3
16 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: Gigahard

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


В посте был описан не "подход для проектов с возможным расширением", не то как пользоваться синглтонами или альтернатива их использования, а сложности, которые возникают при использовании синглтонов, и вариант решения их "по-быстрому".
Правильным же подходом будет НЕ ЗЛОУПОТРЕБЛЕНИЕ СИНГЛТОНАМИ.

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

Цитата: Gigahard

А бывают не глобальные синглтоны? И что ты подразумеваешь под "глобальностью"?
Не нужно к словам цеплятся... Я собственно и говорю про то, что других путей кроме глобальности, в данном случае нет.


Это не цепляние к словам, а вопрос для конкретизации.
Под "глобальностью" можно понимать глобальное пространство имен, а можно - место объекта в системе.

Для того, что бы объект был общим для нескольких подсистем (как в твоей задаче), он не обязательно должен быть в глобальном пространстве имен.
Другие пути есть, и я тебе уже о них сказал: Передать каждому объекту ссылку на эту обертку.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог