Насколько гранулированными должны быть ваши Observables / Listenables?
-
05-07-2019 - |
Вопрос
У вас есть ориентируемая на прослушивание Observable / Listenable, которая уведомляет наблюдателей / Listeners об изменении состояния.
Состояние состоит из более чем одного слепка данных, и некоторые из ваших наблюдателей / слушателей не заботятся обо всем состоянии.
Вы обычно предпочитаете уведомлять всех наблюдателей / слушателей так или иначе и разрешать им игнорировать уведомления, когда ничего, о чем они заботятся, не изменилось?
Или вы обычно предпочитаете отдельную Observable для каждого " nugget " данных, чтобы ваши наблюдатели / слушатели гарантированно получали только те уведомления, на которые им нужно было ответить?
Зависит ли это от ситуации?
Есть ли у вас какие-либо общие мысли о гранулярности ваших Observables / Listenables?
Решение
Вы обмениваете расходы на обслуживание на стоимость доставки. Если у вас есть детализированные определения событий, каждый наблюдатель получает только то, что ему нужно, поэтому вы не оплачиваете накладные расходы по доставке незаинтересованным наблюдателям - но это экономит затраты, потому что каждый новый вид самородков должен быть добавлен к система в некотором роде.
В системах обмена сообщениями Pub / Sub, где стоимость доставки относительно высока (сообщения передаются по сети), обычно необходимо уделять пристальное внимание определению темы. Тщательно разработанная иерархия тем часто бывает полезна. Таким образом, мы получаем шаблоны, такие как
sport
football
england
premier
champioship
scotland
spl
france
...
cricket
australia
...
india
sri lanka
Следовательно, допускается подписка на разных уровнях. Вы можете подписаться на все виды спорта или (как некоторые люди могут) вплоть до
sport/football/england/championship/watford
Другие советы
Как правило, специализированные интерфейсы приносят больше пользы, чем вреда, поэтому я бы определенно реализовал больше, чем меньше.
Это, очевидно, вызывает ситуацию, хотя. Только специализируйте таким образом, если это необходимо, и из вашей ситуации это выглядит так, иначе это все равно, что информировать производителей зерновых о том, что пшеница нуждается в сборе урожая. Это просто не относится.
Если бы мне пришлось это сделать, я бы, вероятно, создал бы класс Observable, в котором было бы событие для каждого вида слепка и одно глобальное событие для любого слепка. Вроде как средний путь.
Это не просто обслуживание. Чем конкретнее интерфейс между Observables и Observers, тем более они связаны.
В книге «Банды четырех» есть раздел, посвященный этой самой проблеме, и они рекомендуют использовать как двухтактные, так и двухтактные модели. Модель вытягивания может быть неэффективной, модель выталкивания может быть недостаточно многократной.
Итак, это сильно зависит от ситуации. Я склонен идти чуть выше модели тяги.