|
Использование глобальных переменных |
|
|
|
 |
Ответов
|
Jan 10 2017, 06:30
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(demiurg1978 @ Jan 9 2017, 21:26)  Хочу узнать мнение насчет использования глобальных переменных. Спрашиваю вот почему: неоднократно слышал, что использование глобальных переменных нужно максимально минимизировать. Откуда пошло это? В данный момент пишу проект. Свои проекты всегда стараюсь разделить на модули. static переменные. использование в других модулях посредством set_value (); get_value ();. Но в нынешнем проекте у меня много параметров. И если честно, я заколебался на каждую переменную писать свои функции установки и получения переменных. Хочу вывести переменные из static в глобальные. Ваши за и против. Проблема в связности. Если у вас все модули знают все про все другие модули - то связность высокая. Сложно понять, кто именно меняет данную переменную и по каким позывам. Сложно поменять алгоритм работы какого-то одного модуля - при этом придется менять все другие. Часто нельзя просто взять и записать в переменную значение - иногда это можно сделать только в определенных состояниях, иногда такая запись должна быть защищена критической секцией, иногда нужно проверить значение или выполнить какие-то действия до/после записи. Если все это размазать по разным модулям - очень легко где-то что-то забыть. Просто механически каждую переменную оборачивать в пару функций смысла нет. Но если модулю 1 нужны прям вот все переменные модуля 2, то у вас что-то не так с разделением на модули. Обычно модуль дает какой-то интерфейс, куда входят функции, и, возможно, какой-то набор глобальных переменных. Опять же, вот пусть у нас есть модуль "передатчик по порту". Если у нас появятся два порта и понадобятся два передатчика - как мы будем выкручиваться? Поэтому обычно тут так или иначе используют ООП - все переменные, которые требуются "передатчику" собираются в структуру, а каждая функция получает указатель на эту структуру (или к примеру числовой дескриптор). А вообще, дайте конкретный пример  По нему уже можно дать какие-то рекомендации Цитата(zltigo @ Jan 9 2017, 23:57)  К чему эти глупые страшилки не по делу. Это не то, чтобы страшилки. Обычно, если в коде много GOTO или функции на тысячи строк или все "потроха" торчат наружу, то с ним что-то не так  Хотя конечно возможны какие-то ситуации, когда все это оправдано
|
|
|
|
|
Jan 10 2017, 07:11
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Цитата(Непомнящий Евгений @ Jan 10 2017, 12:30)  А вообще, дайте конкретный пример  По нему уже можно дать какие-то рекомендации Редактирование параметров в меню.
|
|
|
|
|
Jan 10 2017, 08:17
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(demiurg1978 @ Jan 10 2017, 10:11)  Редактирование параметров в меню. Можно сделать так, как выше предложил Сергей. У меня обычно параметры редактируются не только в меню, но и по интерфейсу (причем протоколы могут быть разные). Кроме того, на разных устройствах разные способы организации меню (разные дисплеи, где-то семисегментное табло). Поэтому у меня каждый параметр завернут в функцию доступа (для упрощения сделан мини-язык на макросах) и затем параметры всех модулей добавляются в общий массив (код параметра + функция доступа). Функция доступа получает специальный поток (откуда читается или куда пишется значение, значение может быть разных типов, а некоторые параметры имеют несколько значений) и требуемое действие (прочитать / записать / проверить допустимость значения). Возвращает успех или код ошибки. И далее уже имея такой массив, несложно организовать редактирование / отображение параметров через меню или по интерфейсу. Можно сделать перебор всех параметров, их сохранение в какой-то промежуточный формат и т.п.
|
|
|
|
|
Jan 10 2017, 11:24
|
Местный
  
Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709

|
Цитата(Непомнящий Евгений @ Jan 10 2017, 14:17)  ... Спасибо всем за ответы.Народ, не поделитесь примерами? Я всегда старался посматривать, как делают другие. Брать лучшее из примеров. Не постесняюсь сказать, что многому научился как раз на форумах. На ответах на мои вопросы и приведенных примерах.
Сообщение отредактировал demiurg1978 - Jan 10 2017, 11:26
|
|
|
|
|
Jan 11 2017, 12:52
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (demiurg1978 @ Jan 10 2017, 13:24)  Народ, не поделитесь примерами? примерно так: CODE bool cfg_editor::do_edit(bool from_last) { // return true to edit field auto always = [](cfg_cache &) { return true; }; auto dhcp_disabled = [](cfg_cache & cfg) { return cfg->Localhost.DHCP_enabled == false; };
struct { bool (*is_item_active)(cfg_cache &); cfg_editor_ui::result (*function)(cfg_editor *); } const Table[] = { #define HANDLER(edit_func, param_name, ...) [](cfg_editor * editor) { return editor-> edit_func (param_name , editor->Cfg-> __VA_ARGS__); } { always, HANDLER(edit_MAC, "MAC address ", Localhost.MAC_address) }, { always, HANDLER(choose_YN, "DHCP enabled " , Localhost.DHCP_enabled) }, { dhcp_disabled, HANDLER(edit_IP, "IP address ", Localhost.IP_address.addr) }, { dhcp_disabled, HANDLER(edit_IP, "Netmask ", Localhost.Netmask.addr) }, { dhcp_disabled, HANDLER(edit_IP, "Gateway ", Localhost.Gateway.addr) }, #if LWIP_DNS { dhcp_enabled, HANDLER(edit_IP, "DNS1 ", Localhost.DNS[0].addr) }, { dhcp_enabled, HANDLER(edit_IP, "DNS2 ", Localhost.DNS[1].addr) }, #endif { always, HANDLER(edit, "Hostname ", Localhost.Hostname) },
{ always, HANDLER(edit, "Telnet port ", Telnet.Port) }, { always, HANDLER(edit_password, "Telnet password (space = disabled)", Telnet.Password) },
{ always, HANDLER(edit, "Serial port baudrate ", Serial.Baudrate, 600, 115200) }, ......... };
size_t const Last_index = sizeof(Table) / sizeof(Table[0]) - 1; size_t Index = from_last ? Last_index : 0;
for(;;) { Console.new_line(); Repeat: switch(Table[Index].function(this)) { case result::CONSOLE_CLOSED: case result::TIMEOUT: return false;
case result::ABORTED: return true;
case result::KEY_UP: if(Index == 0) { Console.send('\r'); goto Repeat; } while(--Index && !Table[Index].is_item_active(Cfg)) ; break;
case result::JUST_ENTER: case result::OK: if(Index == Last_index) return true; while(++Index < Last_index && !Table[Index].is_item_active(Cfg)) ;
if(!Table[Index].is_item_active(Cfg)) // if last item inactive return true; break;
case result::KEY_DOWN: if(Index == Last_index) { Console.send('\r'); goto Repeat; } while(++Index < Last_index && !Table[Index].is_item_active(Cfg)) ; // last index inactive, go back to active if(Index == Last_index && !Table[Index].is_item_active(Cfg)) { while(--Index && !Table[Index].is_item_active(Cfg)) ; Console.send('\r'); goto Repeat;
} break; } } return true; // make eclipse parser happy }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 14 2017, 16:29
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Сергей Борщ @ Jan 11 2017, 15:52)  примерно так: У этого автора не так все легко с абстракциями, вряд ли вы ему помогли. Нужно начинать с чего-нибудь попроще. Вот, например, два датчика Холла, описанные в заголовочном файле для доступа снаружи Код #define HALLS_CHANNELS_QTY 2
typedef struct { int position; unsigned char cur; //current_inputs; unsigned char prev; //previous_inputs unsigned char prev_prev; //before previous inputs unsigned char init; } hall_type;
extern hall_type hall[HALLS_CHANNELS_QTY]; extern hall_type old_hall[HALLS_CHANNELS_QTY];
--------------------
Уходя, оставьте свет...
|
|
|
|
Сообщений в этой теме
demiurg1978 Использование глобальных переменных Jan 9 2017, 18:26 zltigo Цитата(demiurg1978 @ Jan 9 2017, 20:26) н... Jan 9 2017, 19:22 desh Цитата(demiurg1978 @ Jan 9 2017, 21:26) Х... Jan 9 2017, 20:28 demiurg1978 Цитата(desh @ Jan 10 2017, 02:28) ...
Ска... Jan 9 2017, 20:33 zltigo Цитата(desh @ Jan 9 2017, 22:28) Плохая п... Jan 9 2017, 20:57 aiwa Цитата(demiurg1978 @ Jan 9 2017, 20:26) Х... Jan 10 2017, 01:59 Dima_G Цитата(demiurg1978 @ Jan 10 2017, 01:26) ... Jan 10 2017, 03:18  Сергей Борщ QUOTE (demiurg1978 @ Jan 10 2017, 09:11) ... Jan 10 2017, 07:33   k155la3 Цитата(Сергей Борщ @ Jan 10 2017, 10:33) ... Jan 11 2017, 09:50    zltigo Цитата(k155la3 @ Jan 11 2017, 11:50) Позв... Jan 11 2017, 11:31    Непомнящий Евгений Цитата(demiurg1978 @ Jan 10 2017, 14:24) ... Jan 11 2017, 06:05     demiurg1978 Цитата(Непомнящий Евгений @ Jan 11 2017, 12... Jan 11 2017, 08:25     Непомнящий Евгений Цитата(Сергей Борщ @ Jan 11 2017, 15:52) ... Jan 11 2017, 13:25      Сергей Борщ QUOTE (Непомнящий Евгений @ Jan 11 2017, 15... Jan 12 2017, 10:05 scifi Цитата(aiwa @ Jan 10 2017, 04:59) Само кл... Jan 11 2017, 08:31 demiurg1978 Хм... Всем спасибо. Некоторым - в который уже раз.... Jan 11 2017, 08:56 aiwa Цитата(scifi @ Jan 11 2017, 10:31) Неправ... Jan 12 2017, 12:39 Сергей Борщ QUOTE (aiwa @ Jan 12 2017, 14:39) Перемен... Jan 14 2017, 10:53 Непомнящий Евгений Цитата(aiwa @ Jan 12 2017, 15:39) Ну бард... Jan 16 2017, 05:14 Укушенный воблой Цитата(demiurg1978 @ Jan 9 2017, 19:26) Х... Jan 14 2017, 18:03 aiwa Цитата(Сергей Борщ @ Jan 14 2017, 12:53) ... Jan 16 2017, 08:26 Непомнящий Евгений Цитата(aiwa @ Jan 16 2017, 11:26) 7-кратн... Jan 16 2017, 10:14 aiwa Цитата(Непомнящий Евгений @ Jan 16 2017, 12... Jan 17 2017, 02:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|