Как разделить постоянное состояние по всему коду без глобалов - PullRequest
1 голос
/ 31 июля 2011

У меня есть программа, которая использует внешний API, который использует свое собственное состояние. Программа сохраняет начальное состояние в начале. После этого десятки функций вызываются с помощью диспетчера в зависимости от ввода. Каждый из них изменяет текущее состояние с помощью API. Одна из функций должна иметь возможность сбрасывать текущее состояние до исходного. Хотя для этого потребуется доступ к переменной / константе, установленной в начале, которая выходит за рамки функции.

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

Есть ли какое-нибудь чистое, поддерживаемое решение этой проблемы?

Редактировать: Хорошо, допустим, я все-таки буду использовать const global. Чтобы проиллюстрировать это, я буду использовать следующий код:

extern int get_state();
extern void set_state(int);

const int initial_state = get_state();

int main()
{
    while(1) {
        // call dispatcher, eventually
        break;
    }

    set_state(initial_state);
    return 0;
}

Проблема в том, что инициализатор initial_state должен быть постоянным, что get_state(), очевидно, не является. Есть ли способ обойти это?

Ответы [ 2 ]

7 голосов
/ 31 июля 2011

Глобалы не являются злом (особенно если они постоянны).

Любое другое решение, скорее всего, будет некрасивым и будет иметь больше шансов на появление ошибок.

0 голосов
/ 31 июля 2011

Вы можете использовать Шаблон проектирования Singleton . При этом вы можете поделиться общим состоянием в более чистой и контролируемой форме. Вот код для вашей справки.

в гос.ч

State *getState(void);

In State.c

static State *g_state;

State* getState(void)
{
    if(g_state == NULL) // not initialized
    {
        // Allocate Memory and initialize it
    }
    else
    {
        // operate on it if necessary. Can have mutex, semaphore based on your Use Case.
        return g_state;
    }
}

Здесь, хотя общее состояние является глобальной переменной, оно не доступно вне функции getState (), поэтому нет ничего плохого в использовании глобальной переменной !!

Шаша

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