2013-07-15 2 views
0

Я занимаюсь небольшой игрой только для обучения. Цель игры в том, что она будет в сети, но у меня есть некоторые проблемы с сериализацией команд, отправленных с сервера на клиент. Существует множество различных команд, которые могут быть отправлены, и обработка этого вручную ведет меня с ума. На данный момент я использую много «ifs» для этого, но я надеюсь, что это поможет шаблон дизайна. Я хотел бы распаковать сообщение в разных объектах, чтобы я мог получить их из какой-то очереди и эффективно обрабатывать их ... Но я хотел бы сделать это частично или полностью автоматически.Что такое хороший способ сериализации удаленных команд?

Есть ли хорошая практика для решения этой проблемы? Было бы хорошо, если бы это было эффективно.

Заранее спасибо.

PS: Хотя это концептуальный вопрос, я использую C++, поэтому какое-то конкретное решение тоже будет хорошо.

ответ

1

Попробуйте шаблон завода. Что-то along these lines - полезная заводская модель.

Создайте базовый класс, который предоставляет методы сериализации и десериализации данных из потока и регистрирует производные типы по имени или другому идентификатору с фабрикой.

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

Здесь я предполагаю, что некоторые команды имеют дополнительные данные.

Как только вы вытащили команду из очереди для обработки, вы можете вызвать ее метод «Выполнить».

1

Существует шаблон дизайна, называемый «актеры», который может быть тем, что вы хотите. Особенности:

  1. natual и упрощенная модель параллелизма.

  2. может использоваться вместе с сопоставлением шаблонов над сообщениями (исключить «ifs»).

Язык «scala» обеспечивает хорошую поддержку для этого дизайна и идеально отвечает вашим потребностям. Тем не менее, я не знаю, есть ли аналогичное решение в C++.

+0

Модель актера очень проста в применении. Посмотрите, насколько это просто: https://github.com/rfqu/CodeSamples/tree/master/src/simpleactor. Он написан в java, но может быть легко переписан на C++. Для этого требуется Исполнитель, который является просто пулом потоков, а https://www.google.com/search?q=thread+pool+c%2B%2B показывает, что на C++ существует множество реализаций пула потоков. –

Смежные вопросы