Шаблоны, которые искали, чтобы избежать «действия на расстоянии» - PullRequest
0 голосов
/ 02 октября 2018

Я работаю над сложным и очень большим веб-приложением.Некоторые из классов в указанном приложении требуют выполнения различных методов в удаленных объектах, и я быстро осознаю и сталкиваюсь с ошибками, связанными с антипаттерном «действие на расстоянии».

Пример 1: Некоторые изклассы требуют выполнения ежедневных методов очистки, таких как reaper(), cleanup(), send_daily_status_messages() и т. д.

Пример 2. Некоторые классы изменяют состояние приложения и требуют удаленного объекта длявыполнить refresh() своего собственного состояния.

Пример 3. Возвращаясь к примеру 1, некоторые объекты, распространяющиеся по всему приложению, предоставляют send_daily_status_messages().

различные биты содержимого для решения этой проблемы.Наша команда создала класс Events, который централизует все эти вызовы.Однако мы находим, что сам класс Events является слишком «отдаленным», в том смысле, что иногда мы вносим изменения в распределенные объекты, забываем вносить изменения в вызовы в классе Events и затем видим ошибки.

Мне интересно, есть ли лучшие образцы там?

Одна мысль: чтобы объекты "регистрировались" в каком-то динамическом классе Events при инициализации.Это будет держать код вызова рядом с каждым объектом.Возможно, объекты могут даже создавать различные события?

Наконец, это для веб-приложения на основе Perl, использующего Moose.Поэтому любые рекомендации, ориентированные на Perl, ориентированные на Moose, включая рекомендации CPAN, будут наиболее цениться!

1 Ответ

0 голосов
/ 02 октября 2018

Общий шаблон, который звучит так, как вы говорите, - это отправка событий.Вы можете найти много разных вариантов использования этого шаблона в CPAN, например: Event :: Distributor , Beam :: Emitter , Mixin :: Event :: Dispatch , Mojo :: EventEmitter (который я извлек в роль ).У вас есть какой-либо объект, который является либо диспетчером событий, либо к нему применена роль диспетчера событий, и все могут подписаться на события, и когда что-то генерирует событие, все подписчики получают обратный вызов.

...