если он меняет сам пост, а не просто реагирует на него, то это не обсервер :) Это происходит на этапе создания и сохранения поста, то есть до того как мы создаем событие
@@decimaldelimiter587 говорю по опыту недавно пройденного собеса - когда спросят про паттерны скажи не про фабрику, не про биллер и не про синглтон. Все про них говорят так как они самые очевидные. Скажи про dto например, он в каждом круде применяется и ла это тоже принцип, на моем собесе это оценили. Про враппер ака обертка скажи, или про штуку из видео. Это прям хорошо влияет. Можно сказать в начале про вышеперечисленные, а банальные в конце насыпать просто мол "ну ещё банальные х,у,z но че про них рассказывать и так все знают
Я совсем не спец, но тоже подумал что зря он не объяснил этот момент. По логике, наблюдатель должен подписаться на события, т.е. в публикаторе нужен метод, который добавит наблюдателя в лист.
@@KhodorisfulТ.е. все наблюдатели у нас бины и они при инициализации листа прыгают в лист ?? Ну тогда это надо в конструкторе класса конкретно прописать каждое добавление экземплярами класса?? Да ещё и тип загрузки прописать как @lazy у каждого компонента ?? А то машина насоздает бинов и запутается в них (((
Если телеграммом не пользуюсь, то зарегистрироваться не получится? Печально. Вообще мне нужно не сайт сделать, а сервер для Unity приложения (хранение данных по игрокам, регистрация всяких операций типа купил/продал/сделал) соответственно база данных и какой-то апи для взаимодействия из Unity.
@@evan_kirk Спасибо. Вообще-то видео миллион и я их слушаю, когда готовлю или жру. Т.к. на работе завал постоянный. Да, сорян, проепала. observer - теперь знаю!
Разработчик из Амстердама , скажи хватит ли у тебя оперативки на все объекты в твоей «Мега крутой соц сети»? Если бы ты рассказывал это в контексте SOLID принципов, то в целом ок. Но ты суешь это в идее где у тебя будет много событий , а значит у тебя рано или поздно оперативка кончится и привет memoryExeption
Запишет сообщение в брокер сообщений который доставит его получателям на каком угодно количестве серверов. Да и это очень уж нужно постараться чтобы забить память просто инициализацией обьектов)
Получается, что PostSaver занимается больше чем одной задачей. Его код постоянно необходимо править , добавляя новых наблюдателей да и еще код их вызова циклического постоянно будет во всех подобных классах с наблюдателями. А если потом окажется что не про все посты нужно отправлять уведомление? По-моему логика оповещения должна быть вынесена на уровень выше, где вызывается сам PostSaver.
Автор видео не понял как работает этот паттерн. Да и вы тоже. Если окажется, что уведомления нужно отправлять не на все посты, то одписчик отправляющий уведомления сам может решить это на основе информации из события. Как я написал ниже в своём коментарии - PostSaver это по сути модель, если брать архитектуру MVC. Модель ничего не должна знать о подписчиках (вот эти все классы уведомлений, рекламы, статистики). Она должна знать всего об одном классе - классе Наблюдателя. Одного. И после сохранения поста бросать событие в этот Наблюдатель, вы зывая его метод accept(event). А уже Наблюдатель знает кто подписан на принимаемый им тип событий и он отправляет это событие обработчикам (классам работы с уведомнениями, рекламой, статистикой). Таким образом у нас получается чистая модель, код которой мы больше не трогаем. Это позволяет использовать её в других местах, для кототых, например, вот эти все уведомления, статистика, реклама не нужны. А также эта моель легко покрывается тестами, потому что не содержит в себе лишних классов.
На счёт вынести логику оповещения выше. В целом, да, она обычно вынесена выше. Но это реализовано не вынесением её туда, откуда вызывается этот PostSaver, а вызовом её в событиях модели. Но там реализован такой же паттерн Наблюдатель. Поэтому в контексте обучающего видео, эти вещи приплетатть сюда не стоит, чтобы не усложнять понимание сути паттерна. Т.к. это уже касается не паттерна как такогвого, а конкретной реализации.
@@testdeim Инжектим PostObserver где прописана логика оповещение что кому и при каких условиях. В PostSaver мы только один раз вызываем PostObserver и передаем туда актуальный объект Post. Это годится если в самом Post есть вся необходимая информация для того чтобы решить уведомлять или нет. Но что если отправка будет зависеть от каких либо других факторов, о которых нет информации в Post? Прокидывать какой то "notify=false" флаг?
@@Khodorisful тут либо в ивент добавляем нужную информацию (не обязательно же в ивент кидать весь объект Post и/или только его). Тоесть собираем ивент со всеми нужными данными (хоть весь Post, хоть его часть, хоть ещё чо то кроме него, да хоть бы и тот же notify=false). Но notify=false можно в том случае, если PostSaver обладает информацией о том делать ли уведомление. Но обычно не обладает и не должен. Эту информацию знает (или должен узнавать) непосредственно сам обрабочик события. Если брать в пример уведомления, то класс отправляющий уведомления, принимает событие с постом, понимает из него какого типа этот пост, делает запрос в хранилище пользователей у которых настройка "получать уведомления" и им отправляет эти уведомления. Ни сам PostSaver, ни Наблюдатель ничего знать не знают об уведомлениях и не должны.
@@fakng-engineer ну так у тебя сохранение в бд, потом вызов n действий не связанных с бд, что если на каком-то что-то пойдёт не так? т.е. в итоге данные не сохранятся, а какое-то количество чего-то куда-то улетит. я без претензий, просто они же копипастить будут и в итоге в тысячах контор будет гнкод.. а это издержки.
@@heheheyhey5234 Почему это другое, если из за сигналов и слотов в QT паттерн наблюдателя совершенно не нужен. Тем что сигналы и слоты реализованы спец компилятором? Ну да, но это только упрощает код.
@@MrRomanvideo далеко не все. Тот же архитектурный паттерн mvc или front controller, где там полиморфизм. А вот взять ту же фабрику - чистый полиморфизм. ЗЫ А спросил, потому что на собесах тоже любят, про инкапсуляцию и наследование никогда не спрашивают, а вот про полиморфизм почти всегда )
@@Denisko123, я спрашиваю. Еще спрашиваю знакомы ли фамилии "Кнут", "Вирт". Раньше спрашивал, читал ли кандидат труды этих граждан, но давно уже никто не отвечает утвердительно. Так что теперь вместо вопроса о чтении трудов спрашиваю о фамилиях.
@@MrRomanvideo, странный вопрос. Эвент в методе accept как раз и разбирается на части. На те части, о которых метод accept знает. Ну а те, о которых не знает, те в данной конкретной фиче и не нужны.
А будут видео именно про объяснение разных паттернов? Было бы круто))
Я тоже хочу больше такого контента!
Например GRASP, SOLID
Я об порождающих, структурных и поведенческих)
@@kvaselaпро solid есть видео. Всё четко на примерах разобрано.
@@kvasela SOLID это принципы, а не паттерны.
Круто 👍 Спасибо тебе, Влад, за контент. И всё таки, выпуск про Redis ждём)
Отлично! Давай продолжать разбирать паттерны в таком же формате!
Я наконец понял, как называлось то, что часто применял в своих проектах, но не знал, что у этого есть отдельное название)
Можно где то ваши проекты скачать или посмотреть в интернете?😂
@@alexgavril385 ты что это секретные пет проекты под NDA
Отличное видео! Всё понятно. Поймал себя на мысли, что никогда так захватывающе не смог бы объяснять паттерны программирования😁
Супер объяснение! И графика оболденная!!! Спасибо за видео большое!
Жду других патернов!!! Можно было бы целый плей лист! Еще раз спасибо!
Спасибо , интересный урок . Возможно ты сделаешь еще видео про другие паттерны
БЕСПЛАТНЫЙ ВЕБ “Основы Spring для начинающих Java Junior” 24.09.24 в 19:00 по МСК! Регистрируйтесь по ссылке: www.faang.school/vebinar-spring?
Очень круто) но как нам после создания нового наблюдателя добавить его в лист наблюдателей PostSaver?
Понравилось! Рассказывай еще про паттерны)
Но ведь наблюдатель добавления рекламы в пост должен менять сам пост, поэтому он должен выполниться самым первым, а это уже декоратор какой-то
если он меняет сам пост, а не просто реагирует на него, то это не обсервер :) Это происходит на этапе создания и сохранения поста, то есть до того как мы создаем событие
Объяснение и анимации топ. Очень хочется видео и про другие паттерны)
Зарегистрироваться на вебинар невозможно, форма внизу не отображается, только призыв написан.
супер объяснение! запишите еще такие же видео про другие паттерны, пожалуйста
у тебя прям талант объяснять коротко и ясно
Очень доступным языком объяснил. Круто!🔥
Огонь! Очень полезное и понятное видео, спасибо!
звук печатающей машинки в левом ухе честно отвлекает
Влад, спасибо! Хорошее объяснение. Даже я понял:)
Не знаю, какой у вас самый популярный патерн, а у меня собесах про солид все спрашивают.
Это не паттерн😅
Солид это принцип. А он говорит про штуку которая у черепахи на спине
@@ВысоцкийАндрей-г5э , штука у черепахи на спине панцирь, а он говорит о каком то непрерывном потоке слов
Dependency Injection/Inversion?
Один из моих любимых шаблонов - часто его использую. Еще есть стратегия, тоже круто паттерн
Круто. На самом деле прикольно будет узнать это на практисе. Жаль что я не Java, но и на шарпе интересно)
Одно и тоже
Уж шарпист-то java, и наоборот, может читать как никто другой.
Я чуть чаем не подавился когда в конце таки сказал что ты шарпист :D ахах, тролль 80го уровня
суть паттернов и причины применений везде одинаковые, будь то шапы, джава, пыха, питон...
+ За паттерны, у тебя хорошо получается)
Жаль что стрима на youtube нет😢
Сингальтон
@@ЮрийДымов-у6щ о, это де отсылка для своих
четко расскзал, про паттерн "посетитель" (visitor) расскажи так же
Влад, спасибо за объяснение! Ты крутой 🔥
чувак, ты офигенный ! )
прекрасный ролик - ставлю класс!)
класс постов нарушает srp из solid
Какой паттерн будет собирать всех наблюдателей в один список?
По-моему, самый популярный - синглтон.
@@decimaldelimiter587 говорю по опыту недавно пройденного собеса - когда спросят про паттерны скажи не про фабрику, не про биллер и не про синглтон. Все про них говорят так как они самые очевидные. Скажи про dto например, он в каждом круде применяется и ла это тоже принцип, на моем собесе это оценили. Про враппер ака обертка скажи, или про штуку из видео. Это прям хорошо влияет. Можно сказать в начале про вышеперечисленные, а банальные в конце насыпать просто мол "ну ещё банальные х,у,z но че про них рассказывать и так все знают
@@ВысоцкийАндрей-г5э согласен :) про синглтон можно упомянуть если уже назвал штук 5 паттернов :) так до кучи
@@ВысоцкийАндрей-г5э Я ж не говорю, что он самый эффектный для собеседования; скорее, наоборот - один из самых тривиальных (=популярных).
Подскажите пожалуйста , а как наблюдатели дружно запрыгивают в list класса PostSaver?? Им же надо там откуда-то взяться ...
Я совсем не спец, но тоже подумал что зря он не объяснил этот момент. По логике, наблюдатель должен подписаться на события, т.е. в публикаторе нужен метод, который добавит наблюдателя в лист.
либо при инициализации приложения всех обсерверов цепляешь, либо можно это динамически через метод класса добавлять-убирать
DI контейнер. Реализация паттерна Inversion of control
@@KhodorisfulТ.е. все наблюдатели у нас бины и они при инициализации листа прыгают в лист ?? Ну тогда это надо в конструкторе класса конкретно прописать каждое добавление экземплярами класса?? Да ещё и тип загрузки прописать как @lazy у каждого компонента ?? А то машина насоздает бинов и запутается в них (((
Владик, ты топчик! спасибо!
Если телеграммом не пользуюсь, то зарегистрироваться не получится? Печально.
Вообще мне нужно не сайт сделать, а сервер для Unity приложения (хранение данных по игрокам, регистрация всяких операций типа купил/продал/сделал) соответственно база данных и какой-то апи для взаимодействия из Unity.
Привет, спасибо за видео. Добавь ещё, как они по-английски называются, чтоб не пришлось отдельно гуглить.
В видео же видно. Например, наблюдатель - observer
@@evan_kirk Спасибо. Вообще-то видео миллион и я их слушаю, когда готовлю или жру. Т.к. на работе завал постоянный. Да, сорян, проепала. observer - теперь знаю!
чувак, инфа огонь, мерси!
стратегия, наблюдатель, декоратор ...
А зачем держать обсерверы в массиве?: Нельзя как нибудь триггернуть эвент PostSaved....ааа ну наверное это уже через брокер сообщений уже(
Сурер понятно и полезно!
круто!!! спасибо!!!
Singleton наше все
Сюда бы кафку)
@@rkpstam да это буквально она и естьив глобальном смысле. Кафкато реализация данного принципа
Rmq, kafka, да))
Там и слушатели и эвенты
в рамках создания поста, новую фичу в список то нужно прописать, а не просто новую создать :)
Список наблюдателей заполняется за пределами PostSaver'а. Тут только ссылка на него.
Разработчик из Амстердама , скажи хватит ли у тебя оперативки на все объекты в твоей «Мега крутой соц сети»? Если бы ты рассказывал это в контексте SOLID принципов, то в целом ок. Но ты суешь это в идее где у тебя будет много событий , а значит у тебя рано или поздно оперативка кончится и привет memoryExeption
Запишет сообщение в брокер сообщений который доставит его получателям на каком угодно количестве серверов. Да и это очень уж нужно постараться чтобы забить память просто инициализацией обьектов)
А когда ты удаляешь коменты, то крутым становишься?
актуалка для меня, лаййййк, подписка
Получается, что PostSaver занимается больше чем одной задачей. Его код постоянно необходимо править , добавляя новых наблюдателей да и еще код их вызова циклического постоянно будет во всех подобных классах с наблюдателями. А если потом окажется что не про все посты нужно отправлять уведомление? По-моему логика оповещения должна быть вынесена на уровень выше, где вызывается сам PostSaver.
Автор видео не понял как работает этот паттерн. Да и вы тоже.
Если окажется, что уведомления нужно отправлять не на все посты, то одписчик отправляющий уведомления сам может решить это на основе информации из события.
Как я написал ниже в своём коментарии - PostSaver это по сути модель, если брать архитектуру MVC. Модель ничего не должна знать о подписчиках (вот эти все классы уведомлений, рекламы, статистики). Она должна знать всего об одном классе - классе Наблюдателя. Одного. И после сохранения поста бросать событие в этот Наблюдатель, вы зывая его метод accept(event). А уже Наблюдатель знает кто подписан на принимаемый им тип событий и он отправляет это событие обработчикам (классам работы с уведомнениями, рекламой, статистикой). Таким образом у нас получается чистая модель, код которой мы больше не трогаем.
Это позволяет использовать её в других местах, для кототых, например, вот эти все уведомления, статистика, реклама не нужны.
А также эта моель легко покрывается тестами, потому что не содержит в себе лишних классов.
На счёт вынести логику оповещения выше. В целом, да, она обычно вынесена выше. Но это реализовано не вынесением её туда, откуда вызывается этот PostSaver, а вызовом её в событиях модели. Но там реализован такой же паттерн Наблюдатель. Поэтому в контексте обучающего видео, эти вещи приплетатть сюда не стоит, чтобы не усложнять понимание сути паттерна. Т.к. это уже касается не паттерна как такогвого, а конкретной реализации.
@@testdeim Инжектим PostObserver где прописана логика оповещение что кому и при каких условиях. В PostSaver мы только один раз вызываем PostObserver и передаем туда актуальный объект Post. Это годится если в самом Post есть вся необходимая информация для того чтобы решить уведомлять или нет. Но что если отправка будет зависеть от каких либо других факторов, о которых нет информации в Post? Прокидывать какой то "notify=false" флаг?
@@Khodorisful тут либо в ивент добавляем нужную информацию (не обязательно же в ивент кидать весь объект Post и/или только его). Тоесть собираем ивент со всеми нужными данными (хоть весь Post, хоть его часть, хоть ещё чо то кроме него, да хоть бы и тот же notify=false). Но notify=false можно в том случае, если PostSaver обладает информацией о том делать ли уведомление. Но обычно не обладает и не должен. Эту информацию знает (или должен узнавать) непосредственно сам обрабочик события. Если брать в пример уведомления, то класс отправляющий уведомления, принимает событие с постом, понимает из него какого типа этот пост, делает запрос в хранилище пользователей у которых настройка "получать уведомления" и им отправляет эти уведомления. Ни сам PostSaver, ни Наблюдатель ничего знать не знают об уведомлениях и не должны.
По моему этот паттерн имеет что то общее с рмк
Спасибо!
Спс за видос, норм обьяснил
а не кажется что пример вредный? потому что а как обработать кейс когда после сохранения в базу вызов прерывается?
Транзакцией ACID...
@@fakng-engineer ну так у тебя сохранение в бд, потом вызов n действий не связанных с бд, что если на каком-то что-то пойдёт не так? т.е. в итоге данные не сохранятся, а какое-то количество чего-то куда-то улетит. я без претензий, просто они же копипастить будут и в итоге в тысячах контор будет гнкод.. а это издержки.
@@Сергей-у3к8й так у тебя если на моменте сохранения в базу произошел ролбэк, то ты цепочку событий даже не запустишь
@@Сергей-у3к8й То есть ты хочешь сказать что ты хочешь откатить создание поста от того что у какому-то юзеру не прилетело уведомление? :)
В QT на этом все построено и вшито прямо в фреймворк так, что писать без сигналов и слотов очень неловко.(Практически невозможно)
это чуть другое
@@heheheyhey5234 Почему это другое, если из за сигналов и слотов в QT паттерн наблюдателя совершенно не нужен.
Тем что сигналы и слоты реализованы спец компилятором? Ну да, но это только упрощает код.
Огонь
Это ведь по сути полиморфизм (разные классы, но одно и то же название метода) ?
Угу, все так
Все паттерны построены на полиморфизме 😅, хотя нет, не все, но многие, поэтому полиморфизм это универсальная фича, а не конкретно го паттерна
@@MrRomanvideo далеко не все. Тот же архитектурный паттерн mvc или front controller, где там полиморфизм. А вот взять ту же фабрику - чистый полиморфизм. ЗЫ А спросил, потому что на собесах тоже любят, про инкапсуляцию и наследование никогда не спрашивают, а вот про полиморфизм почти всегда )
@@Denisko123, я спрашиваю. Еще спрашиваю знакомы ли фамилии "Кнут", "Вирт". Раньше спрашивал, читал ли кандидат труды этих граждан, но давно уже никто не отвечает утвердительно. Так что теперь вместо вопроса о чтении трудов спрашиваю о фамилиях.
Красава👍🏻
А солид по существу может являться совокупностью паттернов проектирования?
нет, солид это принципы
Это стратегия, а не наблюдатель
Нет, они похожи просто, но ты немного путаешь тут
Это не стратегия, стратегия не отправляет эвенты и работает иначе, там даже суть другая, взаимозаменяемость классов-стратегий.
Добрый день. А что если для новой фичи нужны новые данные в эвннте?
Просто допишешь их в PostEvent
Расширяем эвент
@@fakng-engineer а в методе аксепт нельзя их достать?
@@MrRomanvideo, странный вопрос. Эвент в методе accept как раз и разбирается на части. На те части, о которых метод accept знает. Ну а те, о которых не знает, те в данной конкретной фиче и не нужны.
Что такое уведомления?
Я 1000 лайк 🎉😂