Pull to refresh

Comments 10

Зачем обрамлять Observer/Observable таком Г как Redux?? Уже же давным давно всё придумано, причем по человечески, с использованием getters/setters и это называется MobX. Ради приличия могли бы для демонстрации мощи Observer/Observable реализовать самую простую версию MobX и observer для реакт компонентов.

Ну да, mobx всяко лучше. Если забыть о том, что примером паттерна "Наблюдатель" mobx не является :-)

Если забыть о том, что примером паттерна "Наблюдатель" mobx не является :-)

Правда что ли? Вот прям не является вообще? Т.е. когда мы читаем observable свойства(getter отрабатывает) у объекта он не пушит в свой listeners под капотом функцию(колбэк прокинутый в action ,reaction) которую нужно будет вызвать при изменении этого самого свойства да?

Чтож, у меня для вас плохие новости.

Вот вам реализация "Наблюдателя" из википедии.

Не чего не напоминает? Ах да, да это же Event Emitter. Ах да, setter'ы в MobX по такому же принципу работают как и функция emit, оповещает наблюдателей/слушателей о том, что свойство наблюдаемого объекта изменилось. Какая досада.

А теперь поглядите на эту реализацию, и разглядите уже ключевые моменты паттерна:


  1. подписка явная;
  2. подписчиком является функция либо интерфейс с методами, но никак не объект с важным для источника событий состоянием;
  3. уведомления приходят подписчику каждый раз (либо строго один раз), но никак не в зависимости от соотношения состояний подписчика и источника.

Какая разница? Это детали реализации. Фундаментальный принцип сохраняется в любом случае.  

Не надо в этом определении придираться к словам типа "класс", "объект" и т.п.
Всё это простой publisher/subscriber как не крути. Называть можно как угодно, но суть остается неизменной. Есть подписка на изменения, есть изменения и оповещение подписчиков об изменениях.

В pub-sub паблишер и получатель не имеют ссылок друг на друга, коммуникация идёт чисто с помощью данных - сообщений.

В редаксе стор в этом месте знает всех своих подписчиков в лицо и сам же вызывает их на каждый свой чих. Т.е это observable в чистом виде.

Просто у паттерна название имхо не очень удачное, поскольку активная роль здесь у observable, который и дирижирует всем этим оркестром из observer'ов.

Да, как раз https://medium.com/clean-code-channel/observer-vs-pub-sub-pattern-4fc1da35d11 описано, что для издателя нужен какой-либо промежуточный компонент, который будет перенаправлять события издателя нужным подписчикам, то есть этот компонент скрывает детали функциональности модулей-подписчиков и издатель тем самым не взаимодействует напрямую с этими модулями. Возможно, он будет посложнее в реализации чем Наблюдатель...

В тексте, картинках и примерах взаимозаменямо используется слова observer и observable, хотя на самом деле они противоположные. Нехорошо.

Sign up to leave a comment.