Использование клиента, на который указывают несколько серверов, плохой дизайн? - PullRequest
0 голосов
/ 27 января 2012

Я создаю игровой движок и пытаюсь реорганизовать несколько вещей;а именно EngineManager, который управляет основными компонентами движка (аудио, видео, ввод / вывод клавиатуры / мыши и т. д.).

Основная идея реализации этой очистки , если хотите, состоит в том, чтобы использовать EngineManager в качестве клиента, который будет отправлять данные через обработку событий (в SDL) этим различнымкомпоненты, которые в свою очередь будут отправлять сообщения обратно.Чтобы избежать безумия, у меня есть следующая реализация:

Конфиг

    class Config
    {
    public:

        Config( const EngineManager* engine, const Controls* controls );

        ~Config( void );

        //More functions

    private:

        Controls** mControls;

        EngineManager** mEngine;

        //More functions/class members

    };

    Config::Config( const EngineManager* engine, const Controls* controls )
        : mControls( controls ),
          mEngine( engine ),
          mIsInitialized( false )
    {
    }

    Config::~Config( void )
    {
        delete mControls;
        delete mEngine;
    }

EngineManager

class EngineManager
{

public:

    EngineManager( void );

    ~EngineManager( void );

    //More functions/class members

private:

    Controls* mControls;

    Config* mConfig;

   //More functions/class members

};

EngineManager::EngineManager( void )
    : mControls( new Controls( this ) ),
      mConfig( new Config( this, mControls ) ),
      mEvent( new SDL_Event )
{
    Init();
}

EngineManager::~EngineManager( void )
{
    delete mEvent;
    delete mConfig;
    delete mControls;
    delete mScreen;
}

I 'd публиковать элементы управления, но в основном это делает то же самое, что и класс config - хотя и без ссылки на config.

Тем не менее, что-то подсказывает мне, что хорошей реализацией МОЖЕТ быть указатель на функцию какого-то рода ...

Есть идеи?

1 Ответ

1 голос
/ 27 января 2012

Самая большая проблема дизайна здесь - это взаимозависимость. Если вы используете клиент / сервер, клиент должен зависеть от серверов, а не наоборот.

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

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