Существует несколько различных способов обработки сценариев условного ветвления и переключения в C.
Типичными шаблонами, которые вы сами упоминаете, являются операторы switch () и группы if / else if / else. Однако иногда эти конструкции управления потоком не являются лучшим выбором для определенных проблем. Конкретные случаи, такие как:
- Высокопроизводительное ветвление на большом домене
- Ветвление на доменах значений, известных только во время выполнения
- Изменение путей ветвления во время выполнения на основе других условий
В этих случаях я считаю полезными две схемы:
- Шаблон Стратегии с прямой рассылкой
- Шаблон Стратегии с цепной отправкой
В первом подходе вы отображаете каждое значение из вашего домена в коллекцию указателей на функции. Каждая функция обрабатывает конкретный случай (значение) из вашего домена. Это позволяет вам «переходить» прямо к правому обработчику для конкретного случая. Этот шаблон хорошо работает, когда каждый случай отделен от всех остальных, и мало или совсем нет пересекающейся логики.
Во втором подходе вы объединяете все методы диспетчеризации вместе и вызываете каждый из них для всех случаев. Каждый отправленный метод решает, обрабатывает ли он регистр или нет, и либо сразу возвращается, либо выполняет некоторую обработку. Этот шаблон полезен, когда есть перемычки между обязанностями некоторых обработчиков. Он несколько менее производительный, так как вызывается несколько обработчиков, и каждый решает, нужно ли ему выполнять свою обработку. Однако это один из самых простых способов справиться с перекрывающейся логикой - такой, который вы обычно можете обрабатывать в операторе switch () в условиях сбоя (или перехода).
Вы должны использовать только один из этих методов, если проблема действительно требует этого, поскольку они менее очевидны для будущих разработчиков и могут привести к ненужным сложностям и проблемам обслуживания, если они плохо реализованы. Это также делает ваш код более трудным для понимания, по сравнению с более распространенными конструкциями, такими как switch или if / else.