@KislyFan
инженер, связист и просто любитель выпить

Как маппить пакеты по opcode?

Нужна теоретическая информация которая направит меня в нужном направлении (гусары молчать! :)
Формат пакетов пересылаемых по сети в моей программе определяется структурой [size][opcode][payload_data] и все классы пакетов являются реализацией интерфейса IPacket, чтобы реализовывать определенный набор методов Parse, Create &etc.
Класс в который будет осуществлен маппинг данных из пакета определяется опкодом.

Вот тут возник вопрос как маппить пакеты по opcode ?
Портянку из switch-case я отмел сразу. Хочется легко расширяемого лаконичного решения.

Была мысль использовать словарь вида
dictionary[opcode]{ payload_size, packet_name, delegate -> IPacket SomePacket.Parse(byte[] buffer) }
, и дергать описанный в интерфейсе метод Parse. Проблема в том, что возвращаемый обьект - IPacket и нужно явно приводить его к SomePacket. А это опять огромная портянка switch-case, да и сам словарь надо описывать, а других способов я не знаю (или медленный System.Reflection, но он чертовски медленный + опять же словарь).

Как маппинг реализовывается профессианалами ?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 3
shai_hulud
@shai_hulud
Профессионалы юзают -> switch-case по int которые идут по порядку. Тогда это в IL становится не ceq последовательностью, а switch, который потом становится jump table.
Это самый быстрый с точки производительности метод. Далее что бы не писать самому эту портянку можно выбрать один из 2х вариантов:
- динамическая генерация IL в рантайме через DynamicMethod
- статическая кодогенерация, через Roslyn по исходникам, T4 по скомпилированному коду
Ответ написан
zagayevskiy
@zagayevskiy
Android developer at Yandex
Я правильно понял задачу? Нужно по опкоду(числу) получить конкретный инстанс класса?
Кажется, самым гибким и расширяемым способом будет фабрика, внутри которой switch(в одном-единственном месте).
Ответ написан
Комментировать
@basrach
Профессионалами реализуется через switch-case - наиболее понятный для тех кто будет поддерживать и эффективный способ. В качестве же упражнения, либо если вы работаете не в команде, можно попробовать через кодогенерацию, reflection и что еще в голову придет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы