Паттерн Observer, С#, unity, gamedev,

  Рет қаралды 6,816

Sergey Kazantsev

Sergey Kazantsev

Күн бұрын

Попробовал разжевать ключевые идеи и принципа паттерна Observer, а также показать его эволюцию.
Если будут вопросы
мой тг @wargy
моя почта kazancev.s215@gmail.com
Автору на кофе и шаурму
4276 5500 5792 8742 - карта Сбербанка
Тайминги:
00:00 Введение
01:00 Проблема уведомления классов
01:17 Конкретный пример: введение
02:13 Плохое решение №1: уведомляем классы через Update
03:04 Плохое решение №2: уведомляем через композицию
04:54 Паттерн Observer в картинках
06:16 Паттерн Observer в UML-схеме
07:19 Рефакторим наш Player под Observer
09:03 Рефакторим слушателей, HealthBar
10:03 UML-схема нашего кода
11:08 Observer в наши дни
13:15 Observer в других паттернах
14:40 Финал

Пікірлер: 33
@PaulZabelin
@PaulZabelin Жыл бұрын
Братан, хорош, давай, давай вперед! Контент в кайф, можно ещё? Вообще красавчик!
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
О, ребятушки с ExtremeCode пожаловали) Спасибо за комменты)
@shlembert
@shlembert Жыл бұрын
Сергей, спасибо! Материал востребованный, подача безупречная! Скинул линк на ваш видос сокурсникам. Поржали с Лунтика. Хотел бы увидеть столь же усвояемый материал по DIP в реализации Zenject Ну и по остальным принципам SOLID в таком же стиле! Спасибо от сообщества!
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Спасибо, OCP уже выложил, DI тоже в планах)
@VyacheslavTamplier
@VyacheslavTamplier Жыл бұрын
По Zenject было бы интересно послушать. Но там отдельный плейлист нужен будет :)
@mikhail6384
@mikhail6384 5 ай бұрын
Очень круто объясняете. Приятно слушать и смотреть, спасибо!
@vockinmine3921
@vockinmine3921 3 ай бұрын
Спасибо чел, я прям прозрел когда посмотрел твоё видео. У меня будето пазл в голове сложился. Спасибо!
@VyacheslavTamplier
@VyacheslavTamplier Жыл бұрын
Очень хорошо объясняете! Спасибо!
@shelikhann
@shelikhann 4 ай бұрын
Классно, понятно, интересно, виртуозно
@p.polunin
@p.polunin 6 ай бұрын
Повторение, мать учения!
@COOKIEMONSTER90
@COOKIEMONSTER90 Жыл бұрын
12:06 Нынче вроде можно ивенты проверять на нуль одной строкой, вот так: Event?.Invoke()
@MrG12g
@MrG12g Жыл бұрын
тупа лайк под каждым видео, по твоим видосам можно и мидлом стать
@PinkPanteRus
@PinkPanteRus Жыл бұрын
Спасибо!
@mar_vi_a
@mar_vi_a Жыл бұрын
Ничего не понятно, но подписалась))
@ichbinschlange
@ichbinschlange 7 ай бұрын
8:54 Интерфейс, как и абстрактный класс, позволяет использовать protected.
@sergeykazantsev1655
@sergeykazantsev1655 6 ай бұрын
Это очень здорово, но здесь то это к чему?
@ichbinschlange
@ichbinschlange 6 ай бұрын
@@sergeykazantsev1655, к "в интерфейсе приватные поля не создашь". private не создашь, protected создашь, что в сущности тоже самое.
@user-ql9ye5mx6u
@user-ql9ye5mx6u 4 ай бұрын
Мощно💪
@user-lz4eh8tk3l
@user-lz4eh8tk3l 4 ай бұрын
Тут единственный вопрос в конце к методу UpdateUI у HealthBar. А не лучше его сделать приватным, чтобы только сам класс решал, когда и как он будет обновлять полоску здоровья? А то вдруг злой геймменеджер снаружи его ради прикола будет вызывать? Или есть какой-то смысл его оставить публичным?
@sergeykazantsev1655
@sergeykazantsev1655 4 ай бұрын
на 9:07 я как раз сделал UpdateUI приватным, насколько я помню, разве нет?) Или вопрос про HealthChanged?
@COOKIEMONSTER90
@COOKIEMONSTER90 Жыл бұрын
Кстати, очень бы не помешали примеры по разным паттернам, но не в ООП, а в Дата-ориентированном программировании в Юнити. Не планируется ли случайно такого в ближайшее время?
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Планируется, но не в ближайшее время)
@Guy-qv8bq
@Guy-qv8bq Жыл бұрын
Здравствуйте. Хотел задать вопрос. Насколько я понимаю функционал паттерна Observer как и использование событий в данном случае, можно заменить на реактивные свойства, которые реализованы в том же UniRx. Хотел спросить все ли правильно я понимаю.
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Да, всё верно. UniRx это продолжение развития паттерна Observer. Там так же есть подписки, отписки, уведомления и реакции на уведомления, только они имеют более удобный вид. UniRx как я понимаю вообще на этом выстроил свою философию кода, со своим IObservable и подписками на потоки данных
@Guy-qv8bq
@Guy-qv8bq Жыл бұрын
@@sergeykazantsev1655 Спасибо за ответ. Вы делаете очень крутой обучающий контент. Буду с нетерпением ждать от вас новых видео)
@vlpalamar8639
@vlpalamar8639 Жыл бұрын
получается современная версия паттерна это просто action в классе object и подписка/отписка нужного метода от него в классе observer? никих интерфейсов, ничего. правильно?
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
если я Вас правильно понимаю, то скорее всего да. В подписке и отписке на экшны интерфейс не нужен. Но тут очень важно понимать, что если Вы на собесе скажете, что паттерн Observer это просто action в классе Object, и там подписка и отписка нужного метода без интерфейсов - я думаю, собеседующий этот ответ не одобрит. Тут в Observer важен сам принцип - взаимодействия между классами через события. Реализуете ли вы его классически или через action-ы - это уже вторично)
@vlpalamar8639
@vlpalamar8639 Жыл бұрын
​@@sergeykazantsev1655 благодарю за ответ)
@COOKIEMONSTER90
@COOKIEMONSTER90 Жыл бұрын
Сегодня бежал с работы домой, не успел добежать и на пол пути реализовал интерфейс АйОбсёрвер. Inventory.attire.pants.SetDirty() Шютка))
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Да, главное аккуратнее работать с классом VokzalnayaShaurma, он прям мотивирует подобный интерфейс реализовать)
@COOKIEMONSTER90
@COOKIEMONSTER90 Жыл бұрын
@@sergeykazantsev1655 =)
@dmitryzolkin7904
@dmitryzolkin7904 Жыл бұрын
Есть более удобный способ использования Наблюдателя без интерфейсов. - Создаём класс события, являющимся ScriptableObject. - Примерная реализация: [CreateAssetMenu] public class GameEvent : ScriptableObject { private List _listeners = new List(); public void Subscribe(Action newListener) { if (_listeners.Contains(newListener)) { Debug.LogError($"Попытка повторного добавления {newListener} в список подписчиков события {name}."); return; } _listeners.Add(newListener); } public void Unsubscribe(Action listener) { if (!_listeners.Contains(listener)) { Debug.LogError($"Попытка удалить несуществующего подписчика {listener} из списка подписчиков события {name}."); return; } _listeners.Remove(listener); } public void Publish() { if (_listeners.Count == 0) { Debug.LogError($"Попытка инициировать событие {name}, у которого нет подписчиков"); return; } for (int i = 0; i < _listeners.Count; i++) _listeners[i].Invoke(); } } - Для каждого события создаём отдельный экземпляр с уникальным именем в ассетах. - Ссылки на конкретный экземпляр должны быть у издателя и подписчика(ов). - Издатель просто вызывает Publish() когда нужно. Подписчик просто передаёт метод в Subscribe([имя метода]), который должен обрабатывать событие. - Для событий с аргументами можно расширить класс GameEvent. Это позволяет подписчикам знать только о событиях, игнорируя подробности о субъектах. Самому событию без разницы кто его публикует и обрабатывает.
@sergeykazantsev1655
@sergeykazantsev1655 Жыл бұрын
Ну это сигнальная шина некая получается, у меня по EventBus даже видео на канале есть)
Паттерн Factory Method, Фабричный метод, С#, Unity
12:10
WHO CAN RUN FASTER?
00:23
Zhong
Рет қаралды 30 МЛН
Smart Sigma Kid #funny #sigma #memes
00:26
CRAZY GREAPA
Рет қаралды 19 МЛН
Why Is He Unhappy…?
00:26
Alan Chikin Chow
Рет қаралды 97 МЛН
ПРОГРАММИСТЫ! ВСЕ СЮДА...
14:25
Winderton
Рет қаралды 336 М.
Dear Game Developers, Stop Messing This Up!
22:19
Jonas Tyroller
Рет қаралды 702 М.
Bob Nystrom - Is There More to Game Architecture than ECS?
23:06
Roguelike Celebration
Рет қаралды 198 М.
Event Bus, Паттерны на практике, Unity, C#
15:33
Sergey Kazantsev
Рет қаралды 8 М.
The 6 Design Patterns game devs need?
24:20
Jason Weimann
Рет қаралды 365 М.
MonoBehaviour и ScriptableObject. Для чего нужны и как использовать?
19:38
Руслан Смирнов • Game Development
Рет қаралды 8 М.
Ютуберлер Schoolboy runawayда БАРЛЫҚ КОНЦОВКА жеңді!
27:22
Ютуберлер Реакциясы
Рет қаралды 96 М.
Day 4 | IEM Cologne 2024 | Group Stage | КРИВОЙ ЭФИР
9:27:08
SL4M & Counter-Strike
Рет қаралды 276 М.