реклама на сайте
подробности

 
 
> Использование глобальных переменных
demiurg1978
сообщение Jan 9 2017, 18:26
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



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

Сообщение отредактировал demiurg1978 - Jan 9 2017, 18:27
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Непомнящий Евген...
сообщение Jan 10 2017, 06:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(demiurg1978 @ Jan 9 2017, 21:26) *
Хочу узнать мнение насчет использования глобальных переменных. Спрашиваю вот почему: неоднократно слышал, что использование глобальных переменных нужно максимально минимизировать. Откуда пошло это? В данный момент пишу проект. Свои проекты всегда стараюсь разделить на модули. static переменные. использование в других модулях посредством set_value (); get_value ();. Но в нынешнем проекте у меня много параметров. И если честно, я заколебался на каждую переменную писать свои функции установки и получения переменных. Хочу вывести переменные из static в глобальные.
Ваши за и против.


Проблема в связности. Если у вас все модули знают все про все другие модули - то связность высокая. Сложно понять, кто именно меняет данную переменную и по каким позывам. Сложно поменять алгоритм работы какого-то одного модуля - при этом придется менять все другие. Часто нельзя просто взять и записать в переменную значение - иногда это можно сделать только в определенных состояниях, иногда такая запись должна быть защищена критической секцией, иногда нужно проверить значение или выполнить какие-то действия до/после записи. Если все это размазать по разным модулям - очень легко где-то что-то забыть.

Просто механически каждую переменную оборачивать в пару функций смысла нет. Но если модулю 1 нужны прям вот все переменные модуля 2, то у вас что-то не так с разделением на модули. Обычно модуль дает какой-то интерфейс, куда входят функции, и, возможно, какой-то набор глобальных переменных.

Опять же, вот пусть у нас есть модуль "передатчик по порту". Если у нас появятся два порта и понадобятся два передатчика - как мы будем выкручиваться? Поэтому обычно тут так или иначе используют ООП - все переменные, которые требуются "передатчику" собираются в структуру, а каждая функция получает указатель на эту структуру (или к примеру числовой дескриптор).

А вообще, дайте конкретный пример sm.gif По нему уже можно дать какие-то рекомендации


Цитата(zltigo @ Jan 9 2017, 23:57) *
К чему эти глупые страшилки не по делу.


Это не то, чтобы страшилки. Обычно, если в коде много GOTO или функции на тысячи строк или все "потроха" торчат наружу, то с ним что-то не так sm.gif Хотя конечно возможны какие-то ситуации, когда все это оправдано
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Jan 10 2017, 07:11
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(Непомнящий Евгений @ Jan 10 2017, 12:30) *
А вообще, дайте конкретный пример sm.gif По нему уже можно дать какие-то рекомендации

Редактирование параметров в меню.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 10 2017, 08:17
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(demiurg1978 @ Jan 10 2017, 10:11) *
Редактирование параметров в меню.


Можно сделать так, как выше предложил Сергей.

У меня обычно параметры редактируются не только в меню, но и по интерфейсу (причем протоколы могут быть разные). Кроме того, на разных устройствах разные способы организации меню (разные дисплеи, где-то семисегментное табло). Поэтому у меня каждый параметр завернут в функцию доступа (для упрощения сделан мини-язык на макросах) и затем параметры всех модулей добавляются в общий массив (код параметра + функция доступа).

Функция доступа получает специальный поток (откуда читается или куда пишется значение, значение может быть разных типов, а некоторые параметры имеют несколько значений) и требуемое действие (прочитать / записать / проверить допустимость значения). Возвращает успех или код ошибки.

И далее уже имея такой массив, несложно организовать редактирование / отображение параметров через меню или по интерфейсу. Можно сделать перебор всех параметров, их сохранение в какой-то промежуточный формат и т.п.
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Jan 10 2017, 11:24
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Цитата(Непомнящий Евгений @ Jan 10 2017, 14:17) *
...

Спасибо всем за ответы.Народ, не поделитесь примерами? Я всегда старался посматривать, как делают другие. Брать лучшее из примеров. Не постесняюсь сказать, что многому научился как раз на форумах. На ответах на мои вопросы и приведенных примерах.

Сообщение отредактировал demiurg1978 - Jan 10 2017, 11:26
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 11 2017, 12:52
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jan 14 2017, 16:29
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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];


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 03:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016