Подтвердить что ты не робот

Каковы известные "gotchas" в отношении шаблона Chain of Responsibilty?

Я обнаружил, что часто использую шаблон Chain of Responsibility (3 раза часто для меня) в моем текущем проекте, Мне интересно, если я немного переусердствовал в решении. В частности, я использую цепочный проект Apache Commons . Таким образом, я был очень впечатлен тем, как он упростил ряд сложных взаимозаменяемых фрагментов прикладной логики в более сплоченное и организованное целое. Тем не менее, некоторые из новых людей в проекте, похоже, испытывают трудности с его получением. Каковы ваши впечатления? Какие проблемы вы столкнулись при его реализации?

Пока, единственная проблема, я заметил, что это когда вы пытаетесь разобраться с объектами, которые необходимо закрыть. Наличие тех объектов, которые хранятся в вашем классе Context, вызывает боль, когда вы завершили выполнение своей цепочки. Мне удалось обойти это с помощью Filters вместо Commands, но это кажется немного неинтуитивным, потому что ваши закрытые утверждения часто очень далеки от того, где был создан объект.

В любом случае, я хотел бы услышать мысли от некоторых разработчиков, у которых больше опыта, чем я с этим шаблоном.

Спасибо заранее.

4b9b3361

Ответ 1

Я испытываю соблазн сказать, что это хорошо работает для неспецифической проблемы (например, режим рамок), но работает менее эффективно для многих конкретных проблем. Рамки написаны для использования другими людьми, и вы хотите предоставить клиенту полную свободу реализации. Как только вы точно знаете, что вы собираетесь делать, чтобы решить проблему, я думаю, что другие решения лучше.

Опасность шаблона цепочки ответственности почти такая же, как и для шаблона доски; на самом деле легко создать множество абстракций, которые в большинстве своем не дают ценности для достижения конечной цели. Объекты команд и объекты обработки на самом деле просто формируют логику вашего приложения, и вы скрываете его за цепочкой обработки, вместо того чтобы помещать ее прямо вверх, где находится ваш самый важный код. Это гораздо проще понять и сохранить, если вы просто запрограммируете метод (или несколько методов), который представляет полную цепочку обработки без абстракций цепочки обработки. Цепь обработки действительно может действительно скрыть бизнес-логику вашего приложения, и я считаю, что вы определяете приоритет технического артефакта над бизнес-кодом.

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

Ответ 2

Я считаю справедливым сказать, что в целом стоит использовать данный шаблон дизайна, если он дает вам больше преимуществ, чем затраты. Каждый шаблон вводит дополнительный уровень косвенности в коде, поэтому его труднее следовать, особенно для младших членов команды. Сказав, что я думаю, что шаблон Chain of Responsibility определенно полезен, если вы не знаете заранее, какие будут классы, которые собираются сделать обработку (так что в цепочке), или вы повторно используете эти классы в разных контексты, создавать разные цепи в разных сценариях и т.д.

В целом я считаю, что довольно сложно переоценивать ваши решения (потому что, как вы сказали, новые люди борются с пониманием этого), но есть случаи, когда шаблоны проектирования очень полезны.