|
Заблокирован
|
|
Чем паттерн Наблюдатель лучше механизма событий?19.10.2023, 11:31. Показов 2237. Ответов 34
Метки нет (Все метки)
На первый взгляд, паттерн Наблюдатель легко заменяется, даже код проще будет и понятнее, с помощью событий. Если это не так, то почему не так?
0
|
|
| 19.10.2023, 11:31 | |
|
Ответы с готовыми решениями:
34
Паттерн наблюдатель
Создать паттерн Наблюдатель |
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
|
||||||||
| 19.10.2023, 22:40 | ||||||||
Сообщение было отмечено titan4ik как решение
РешениеЕсли нужен просто мгновенный сигнал на большое число подписчиков, то велосипедим свое, пример сравнения:
Многие вещи нужно прочувствовать через практику, чтобы понять как это работает. Если вам напишут в статье "ExecutionContext is everywhere where code is executed." - Вы поймете? Как создать кастомный ExecutionContext? У вас не было никогда ощущения, что вы является коробочным (out-of-box) непрограммистом? Вот есть WCF, настроил binding-и и вуаля - можно пользоваться. Но кто-то же это написал. Тут еще можно провести аналогию паттернов как со стандартами/протоколами и их реализациями. Блин, слишком много тут вам придется расписывать, чтобы дать исчерпывающий ответ. Мне лень это делать в 3-ем часу ночи... Слишком много может быть нюансов, поэтому нужно все пропускать через себя.
1
|
||||||||
|
Заблокирован
|
||||
| 19.10.2023, 23:03 [ТС] | ||||
![]() Спасибо! Добавлено через 5 минут
0
|
||||
|
Заблокирован
|
|||
| 19.10.2023, 23:09 [ТС] | |||
|
Добавлено через 1 минуту ВСЁ!)
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 20.10.2023, 09:00 | ||
Сообщение было отмечено titan4ik как решение
РешениеЕсли вам нужен какой-то дополнительный функционал, как например тот, который предоставляется интерфейсом IObserver, то реализуйте с нуля на здоровье. Так же стоит учитывать, что события были в языке с версии 1.0, т.е. этой реализации уже без малого 25 лет. За годы язык оброс дополнительным функционалом и подходы к реализации несколько поменялись — в некоторых случаях функционал событий может быть не достаточным для вашего сценария. Например, подписчики в событиях выполняются последовательно. Если вам нужна параллельная обработка, то события не подходят. Так же события/мультикаст-делегаты практически не работают с асинхронными методами. Или у вас какой-то расширенный функционал, требующий дополнительного взаимодействия с подписчиками, который отсутствует в делегатах (см. тот же IObserver). В общем, смотрите по ситуации. Если события решают вашу задачу — пользуйтесь на здоровье.
1
|
||
|
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
|
|
| 20.10.2023, 09:12 | |
|
1
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
|
|
| 20.10.2023, 09:23 | |
|
Midian, да не суть, поведение не изменится.
Цель того примера - показать, что 3 синхронных подписчика займут 1.5 секунды времени (каждый проспав по 0.5), а асинхронные подписчики тоже будут выполняться последовательно, но они не будут выполнять код, а просто стартовать Task-и на потоках из пула. Это может быть важно, когда например, объект - Observable - выполняющий какой-то hot-throughput path код (например, в сетевых приложениях), должен очень быстро выполнять уведомление своих подписчиков и быстро продолжать свою работу. То есть это яркий пример, когда может понадобиться offloading (тот что дает нам responsiveness в GUI приложениях). Хотя для сигналов у Task-ов еcть более надежные механизмы - TaskCompletionSource-ы, или всякие ванильные *ResetEvent-ы. Но это уже другая история.
1
|
|
|
|
|||||||
| 20.10.2023, 09:46 | |||||||
|
Технически event -- так называемый "сахар", который призван упростить написание однотипного кода. Грубо говоря нам очень часто нужно для объекта по изменению его состояния сделать какие-либо действия. Самая простая реализация выглядит так:
Теперь насчет IObserver и прочего. Во-первых, такой подход явно логически выделяет объект, что он именно наблюдатель/подписчик/источник. event в объекте воспринимается скорее как ещё одно свойство или около того, т.е. объект явно сложный (хотя нам ничто не мешает объявит интерфейс с единственным ивентом). Во-вторых, если у нас есть алгоритм написанный пращурами на каком-нибудь кобольде, и нам нужно просто перенести один-в-один -- скорее всего там 100500 наблюдателей, а значит не помешает прям из коробки иметь что-то в этом духе. Третье:
1
|
|||||||
|
Заблокирован
|
||||||
| 20.10.2023, 12:19 [ТС] | ||||||
|
Что касается возможности параллельного выполнения делегатов - мне это отличие явной реализации паттерна Наблюдатель от событий сразу в глаза бросилось. Но я решил, что асинхронные методы, подписанные на событие, запускаемые последовательно и выполняемые асинхронно (могут и параллельно выполняться - это уже решит мудрая автоматическая оптимизация) решают проблему. В каком случае это не так? Добавлено через 9 минут Добавлено через 6 минут
0
|
||||||
|
608 / 390 / 198
Регистрация: 31.03.2013
Сообщений: 2,700
|
|||||||||||||
| 20.10.2023, 12:26 | |||||||||||||
в любом случае, событие выполняется в главном потоке в очереди Dispatcher и при подписке в определенном порядке он будет вызвано тоже в этом же порядке
1
|
|||||||||||||
|
Заблокирован
|
|
| 20.10.2023, 12:32 [ТС] | |
|
В общем, по сути вопроса ответ получен. Его можно так резюмировать:
Если механизм событий удовлетворяет, то паттерн Наблюдатель нет смысла явно реализовывать. А если по каким-то критериям механизм событий не решает задачи или решает не лучшим образом, то тогда можно решать её через явную реализацию паттерна, используя все его возможности (это надо ещё понять что там за особые возможности - простые примеры реализации их не раскрывают) и дополнительно включая туда всё необходимое. Понятно. Это понятно. Спасибо! Попутно в обсуждении было много интересного (и не вполне понятного - спасибо, есть что иметь ввиду для дальнейшего понимания!).
0
|
|
|
|
|||||||
| 20.10.2023, 12:38 | |||||||
Теперь насчет асинхроных методов. По сути это Func<Task> для примера выше, и в коде вместо Console.WriteLine(result); нужно выполнить await для всех подписантов (ну или около того). Но как писал выше -- мы можем получить только последний результат (который ещё и не гарантирован средой CLR, т.е. на одной версии очередность будет одна, на другой -- иная).
2
|
|||||||
|
Заблокирован
|
||
| 20.10.2023, 12:48 [ТС] | ||
|
Добавлено через 2 минуты Wolfdp, спасибо за разъяснения!
0
|
||
|
Заблокирован
|
|
| 28.02.2024, 18:22 [ТС] | |
|
Добавлю статейку по теме: https://www.codeproject.com/Ar... -in-Csharp
0
|
|
| 28.02.2024, 18:22 | |
|
Паттерн Наблюдатель - записать содержимое TextBox в файл Паттерн Наблюдатель паттерн наблюдатель (observer) паттерн Наблюдатель и логгирование Паттерн наблюдатель vs События Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
|
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
|