Каков хороший способ сериализации удаленных команд?

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

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

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

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

0

Решение

Попробуйте Фабричный образец. Что-то вдоль этих линий полезная заводская модель

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

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

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

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

1

Другие решения

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

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

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

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

1

По вопросам рекламы [email protected]