Цепочка ответственности

Зачем мне использовать CoR, если бы я мог написать if-else и вместо того, чтобы проходить через несколько обработчиков, я мог бы просто найти любой нужный мне обработчик и делегировать обработку конкретному.

Я думаю, что CoR не используется в качестве конвейера для обработки одного и того же запроса в нескольких обработчиках (например: https://github.com/RichJones22/chainOfResponsibility_cpp/blob/master/main.cpp). Так почему я вообще использую CoR?


person Narek    schedule 02.09.2015    source источник


Ответы (2)


Каковы преимущества CoR?

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

Каждый класс будет реализовывать свою собственную стадию конвейера, преимущества:

  • модульность: каждый класс конвейера обрабатывает свой четко определенный аспект/команду; код каждого командного объекта/этапа конвейера должен быть чище и проще для чтения/поддержки.

  • одно преимущество заключается в том, что вы можете отлаживать/тестировать каждый из этих классов отдельно, независимо от остальных классов команд/конвейеров; это здорово, если у вас есть модульные тесты.

  • вы можете настроить различные экземпляры конвейеров в классе фабрики/построителя и рассматривать классы команд как строительные блоки и складывать их в стек в зависимости от конфигурации/фактических требований.

    один пример — этап регистрации; вы должны добавить производный класс, который просто ведет журнал, и добавить его в конец конвейера, т. е. событие должно быть зарегистрировано; если вы находитесь в конфигурации «без ведения журнала», вы не будете складывать этот командный объект.

person MichaelMoser    schedule 02.09.2015

Если вам нужно выполнить 4 из 10 элементов в цепочке в одном случае, 2 в другом случае и 9 в другом случае, то CoR явно лучше, чем тонна вложенных операторов if.

Рассмотрим классическую реализацию, такую ​​как цепочка валидаторов. Вы можете подключать и отключать некоторые валидаторы в определенных случаях, вы можете ошибиться при первой ошибке проверки или просто собрать их все.

person Marcin Szymczak    schedule 02.09.2015
comment
Что такое классический CoR, который обрабатывает и завершает работу только один обработчик или несколько обработчиков, и это все равно CoR? - person Narek; 02.09.2015
comment
Я никогда не видел другого названия для другого вида. Кажется, что каждое поведение, которое звучит как передача данных через цепочку методов, называется CoR. - person Marcin Szymczak; 02.09.2015