как исключить использование глобальной переменной - PullRequest
0 голосов
/ 21 января 2020

Я использую простую библиотеку json во встроенной среде и пытаюсь избавиться от глобальной переменной в своем пользовательском коде. У меня здесь есть фрагмент, который пытается объяснить мою ситуацию.

В библиотеке есть функция libjson_parser, которую можно вызывать каждый раз, когда необходимо проанализировать массив символов. Как только операция завершена, она передает результат операции функции, которая зарегистрирована как обратный вызов (json_post_parse в следующем примере), используя libjson_callback_register.

Поскольку у меня есть различные типы json пакетов для анализа, я использую глобальную переменную parsing_config, которая устанавливается перед вызовом синтаксического анализатора, чтобы в функции json_post_parse можно было выполнить правильную операцию ,

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

// library functions:
// libjson_callback_register
// libjson_parser

// user function, function signature fixed by library:
// json_post_parse

static uint8_t parsing_config = 0;

int main()
{
    // register callback
    libjson_callback_register(json_post_parse);

    // dummy load
    char[32] payload;
    uint16_t len = 32;

    // type A post parsing
    parsing_config = 1;
    libjson_parser(payload, len);

    // type B
    parsing_config = 2;
    libjson_parser(payload, len);


    return 0;
}


json_post_parse(json_obj* json)
{
    switch(parsing_config) {
        case 1:
        //do something
        break;

        case 2:
        // do something
        break;

        default:
        break;
    }
}

Ответы [ 2 ]

2 голосов
/ 21 января 2020
// library functions:
// libjson_callback_register
// libjson_parser

// user function, function signature fixed by library:
// json_post_parse


int main()
{
    // dummy load
    char[32] payload;
    uint16_t len = 32;

    // type A post parsing
    // register callback1
    libjson_callback_register(json_post_parse1);
    libjson_parser(payload, len);

    // type B
    // register callback2
    libjson_callback_register(json_post_parse2);
    libjson_parser(payload, len);


    return 0;
}


json_post_parse1(json_obj* json)
{
  // do something1
}
json_post_parse2(json_obj* json)
{
  // do something2
}
1 голос
/ 21 января 2020

Вероятно, вам следует динамически изменить обратный вызов, как предложено @CharlieBurns, но альтернативой может быть скрытие stati c в функции get / set:

int main()
{
    // register callback
    libjson_callback_register(json_post_parse);

    // dummy load
    char[32] payload;
    uint16_t len = 32;

    // type A post parsing
    parse_config(1);
    libjson_parser(payload, len);

    // type B
    parse_config(2);
    libjson_parser(payload, len);


    return 0;
}


uint8_t parse_config( uint8_t config )
{
    static uint8_t parsing_config = 0;
    if( parse_config != 0 )
    {
        parsing_config = config ;
    }

    return parsing_config ;
}


void json_post_parse(json_obj* json)
{
    switch( parse_config(0) ) 
    {
        ...
    }
}

Альтернативно (и более условно) ) вы можете поместить json_post_parse(json_obj* json) в отдельную единицу перевода с помощью функции установки c. Переменная по-прежнему имеет область видимости файла, но она видна только тем функциям, которые имеют к ней доступ. Область видимости файла не является глобальной областью действия, и пока переменная не видна функциям, которым ее не нужно видеть, это позволяет избежать проблем, связанных с глобальными переменными. Итак:

json_parse_callback. c

static uint8_t parsing_config = 0;

void parse_set_config( uint8_t config )
{
    parsing_config = config ;
}


void json_post_parse(json_obj* json)
{
    switch( parsing_config  ) 
    {
        ...
    }
}

json_parse_callback.h

#if !defined json_parse_callback_h
#define json_parse_callback_h

void parse_set_config( uint8_t config ) ;
void json_post_parse(json_obj* json) ;

#endif

main . c

int main()
{
    // register callback
    libjson_callback_register(json_post_parse);

    // dummy load
    char[32] payload;
    uint16_t len = 32;

    // type A post parsing
    parse_set_config(1);
    libjson_parser(payload, len);

    // type B
    parse_set_config(2);
    libjson_parser(payload, len);


    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...