Я переписываю код для обработки встроенных сообщений, и прямо сейчас обработка протокола реализована в цикле While с большим оператором case/switch. Этот метод кажется немного громоздким. Каковы наиболее часто используемые методы управления потоком для реализации протоколов связи?Каковы наиболее часто используемые элементы управления потоком для обработки протокола?
ответ
В случаях, когда вы отключаете поле в заголовке протокола, чтобы направить вас на следующий этап обработки для этого протокола, можно использовать массивы указателей функций. Вы используете значение из заголовка протокола для индексации в массив и вызываете функцию для этого протокола.
Вы должны обрабатывать все возможные значения в этом массиве, даже те, которые недопустимы. В конце концов вы получите пакет, содержащий недопустимое значение, либо потому, что кто-то пытается атаковать, либо потому, что будущий rev протокола добавляет новые значения.
Если все обрабатывается одним протоколом, то вам может потребоваться оператор switch/case. Однако вы должны разбить все отдельные обработчики сообщений на свои собственные функции.
Если ваш оператор switch содержит какой-либо код, который фактически обрабатывает сообщения, вам лучше разогнать их.
Если он обрабатывает несколько аналогичных протоколов, вы можете создать класс для обработки каждого из них на основе одного и того же абстрактного класса, и когда соединение произойдет, вы сможете определить, какой протокол он представляет, и создать экземпляр соответствующего класса обработчика для декодирования и обрабатывать сообщения.
Я бы подумал, что это во многом зависит от используемого вами языка и того, какие объекты набора данных вы имеете для вас.
В python, например, вы можете создать объект Dictionary всех различных операторов обработки и просто перебрать его, чтобы найти правильный метод/функцию для вызова.
Операторы Case/Switch не плохие вещи, но если они становятся огромными (как они могут с огромным количеством обработчиков протоколов), то они могут стать неудобными для работы.
Звучит как «while + switch/case» - это реализация statemachine. Я считаю, что хорошо продуманная statemachine часто является самым простым и понятным способом реализации протокола.
Когда дело доходит до statemachines, нарушение некоторых традиционных правил программирования происходит с территорией. Такие правила, как «каждая функция должна быть меньше 25 строк», просто не работают. Можно даже утверждать, что statemachines являются GOTO в маскировке.