C# Proxy Заместитель | Design Patterns

2024 ж. 20 Мам.
18 180 Рет қаралды

Паттерны проектирования важно и нужно знать. В этом ролике мы поговорим про design pattern Proxy (Заместитель) - структурный шаблон проектирования. Поговорим о сути, посмотрим на примеры и сделаем реализацию в Visual Studio 2022 и .NET 6. Заходите, будет интересно и станет понятно 🙂
Исходный код проекта на GitHub: github.com/codaza/Cooker
C# 10 New features (новые фичи): • C# 10 New features | Н...
Telegram канал: t.me/codaza
На кофе ☕️: pay.cloudtips.ru/p/179d0532
Patreon: / codaza
Boosty: boosty.to/codaza
0:00 - Начало
0:48 - Proxy это Structural Design Pattern
1:23 - Концепция Proxy
2:23 - Proxy для логирования
2:59 - Proxy для кэширования
3:57 - Proxy для контроля доступа
4:17 - Proxy для дополнительной логики
4:44 - Виды Proxy
6:13 - Анатомия Proxy
8:47 - Live example
10:48 - Реализация примера
28:07 - Завершение
#proxy #designpatterns #ITubeTeam #gof #csharp #net6 #паттерныпроектирования #codaza

Пікірлер
  • Удобная навигация по видео :) 0:00 - Начало 0:48 - Proxy это Structural Design Pattern 1:23 - Концепция Proxy 2:23 - Proxy для логирования 2:59 - Proxy для кэширования 3:57 - Proxy для контроля доступа 4:17 - Proxy для дополнительной логики 4:44 - Виды Proxy 6:13 - Анатомия Proxy 8:47 - Live example 10:48 - Реализация примера 28:07 - Завершение

    @codaza-channel@codaza-channel2 жыл бұрын
  • Учу C#, получается что курсы дают 25% знаний, еще 25% другие ресурсы, а этот канал 50% знаний. Очень хотелось бы видеть больше видео.

    @user-uy5eh6du4y@user-uy5eh6du4y Жыл бұрын
  • Больше видео про паттерны, а то я сам не разберусь))))))

    @kazarovroman@kazarovroman2 жыл бұрын
    • Ок, будем разбираться 😉

      @codaza-channel@codaza-channel2 жыл бұрын
  • Очень релаксирующий ритм повествования, не грузит после рабочего дня. Спасибо! Паттерн Спецификация - в ютубе мало представлен.

    @user-yt5pl9wk3l@user-yt5pl9wk3l2 жыл бұрын
  • Потрясающее описание и визуализация деталей паттерна! Спасибо!

    @chinchilla898@chinchilla8982 жыл бұрын
  • Я редко пишу комментарии, но этот канал безусловно заслуживает внимание и проявление поддержки. Автору большое спасибо, такого качественного контента по C# мало на русском ютуб. Жду новых роликов! P. S. Lo-fi на фоне шикарен.

    @user-zj6vd4ib2t@user-zj6vd4ib2t2 жыл бұрын
    • Благодарю за поддержку, это действительно очень важно для новых каналов. Рад, что Вам понравился формат и подход к донесению информации. Впереди много интересного. 🙂

      @codaza-channel@codaza-channel2 жыл бұрын
  • Спасибо за материал. Хотелось бы, так же увидеть, на канале рассмотрение всех базовых патернов проектирования(все 23 шт). Канал просто находка. Подписался. Жду нового материала.

    @klimovDev@klimovDev2 жыл бұрын
    • Благодарю за поддержку. Новый материал уже готовится.

      @codaza-channel@codaza-channel2 жыл бұрын
  • Это бесподобно! Прям мой реальный кейс, только не с рестораном)) Очень круто!)

    @MaratSharipov1711@MaratSharipov17112 жыл бұрын
  • Очень приятная подача материала. Спасибо.

    @vitalysushilov5802@vitalysushilov58022 жыл бұрын
  • Это прекрасно! Спасибо за видео. Материал и подача на высшем уровне!

    @konstantinkobayashi4462@konstantinkobayashi44622 жыл бұрын
    • Благодарю за высокую оценку 🙂 Здорово, что удалось показать Proxy с интересной стороны!

      @codaza-channel@codaza-channel2 жыл бұрын
  • спасибо за ролик) давай следующий паттерн Декоратор

    @vitalytretyak4636@vitalytretyak46362 жыл бұрын
  • Спасибо за то, что делитесь своими знаниями!!!

    @marksreider7645@marksreider76452 жыл бұрын
  • Просто шикарно! С теорией, практикой, не нудным повествованием, а главное, видно что автор понимает о чем говорит!

    @user-dv5ue1om3m@user-dv5ue1om3m2 жыл бұрын
  • А чего так мало просмотров? Сделано качественнее чем в подавляющем большинстве роликов про паттерны.

    @phat80@phat802 жыл бұрын
    • Алгоритмы KZhead беспощадны 😥 Спасибо Вам за комментарий 🙂

      @codaza-channel@codaza-channel2 жыл бұрын
    • @@codaza-channel ну мне то алгоритмы выдали как-то ролик ))) Значит не все потеряно. А ведь я даже не искал ни C#, ни паттерны уже очень давно.

      @phat80@phat802 жыл бұрын
    • Тогда ждём 🙂

      @codaza-channel@codaza-channel2 жыл бұрын
    • @@codaza-channel Держись! Всегда жалко, когда хорошие авторы забрасывают каналы, так как не смогли добиться запланированных результатов.

      @phat80@phat802 жыл бұрын
  • Я только что отдохнул после работы с пользой)) codaza, ты гигакрут!

    @VitaliyZlobin@VitaliyZlobin Жыл бұрын
    • 💙

      @codaza-channel@codaza-channel Жыл бұрын
  • Кодаза топ!

    @firemanhood1526@firemanhood15262 жыл бұрын
  • Классный дизайн на канале

    @leshi1628@leshi1628Ай бұрын
  • Спасибо! Забавно, что компилятор больше не позволяет билдить структуру Order в таком виде, как в видео =) Был баг, который сейчас поправили. Сейчас в VS2022 и C#10 требуется дефолтный конструктор для подобной инициализации свойств. P.S. Чтобы убирать неиспользуемые операторы using в VS быстро: Ctrl+R, Ctrl+G

    @TheKolian1996@TheKolian1996 Жыл бұрын
  • Даешь больше паттернов!!!!

    @AzimbekSagynbaev@AzimbekSagynbaev2 жыл бұрын
  • крутое видео, спасибо! Я бы добавил, что smart proxy также называют декоратором. Для меня это было неожиданной новостью)

    @mirNpeace@mirNpeace2 жыл бұрын
  • Лучший канал что встречал , спасибо , вы лучшие!

    @qnet1080@qnet1080 Жыл бұрын
  • Ты крут! Все внятно и спасибо за работу!

    @salamatturdukhodzhaev3894@salamatturdukhodzhaev38942 жыл бұрын
  • Было занимательно и полезно. Спасибо, автор!

    @shnextv1217@shnextv12172 жыл бұрын
  • 🔥🔥🔥

    @user-lp5gp8qs7b@user-lp5gp8qs7b2 жыл бұрын
  • Ну раз речь пошла о паттерне прокси, то логично продолжить декоратором, адаптером или мостом. Переодически путаюсь кто из них кто. Может ваши видео разложат у меня по полочкам окончательно эту информацию.

    @user-ye4gs7ts5z@user-ye4gs7ts5z2 жыл бұрын
  • Очень хорошие, структурированные и понятные видео, спасибо большое!

    @OneGogh-Pro@OneGogh-Pro Жыл бұрын
  • великолепно👍

    @cssex2692@cssex26922 жыл бұрын
  • спасибо огромное

    @ArmDinamit@ArmDinamit Жыл бұрын
  • Контент, подача - супер! Больше подписчиков каналу! Спасибо за видео~

    @miniputlol@miniputlol Жыл бұрын
  • Продолжай про паттерны плз очень круто получается!

    @turalaliyev1764@turalaliyev1764 Жыл бұрын
  • Я использовал подобное кеширование, не зная, что это proxy pattern xD

    @NickPavlov00@NickPavlov002 жыл бұрын
    • С паттернами это нормально) Мы часто используем их в работе и позже узнаем название и формальное определение.

      @codaza-channel@codaza-channel2 жыл бұрын
  • Спасибо!

    @user-rb5dg6cw3x@user-rb5dg6cw3x Жыл бұрын
  • Ты хорош

    @zerg100500@zerg100500 Жыл бұрын
  • Спасибо. Жалко что нового net 5 и тем более Net 6 нет на более мене старых проектах. )))

    @user-yo7mw6oj4p@user-yo7mw6oj4p2 жыл бұрын
  • Все здорово, спасибо за материал. Только мне кажется, что стоило разделить прокси на 2, один для кэширования, а другой для логгирования, чтобы соблюдался принцип SRP и показать наглядно, как поменяется поведение, в зависимости от порядка сборки объекта. Это конечно придирки, но если мы знаем, что статусы получаем медленно, то их точно не стоит получать каждый раз в foreach, хотя бы перед циклом) ну и можно было по ключу найти название, а не через linq

    @blowin8273@blowin82732 жыл бұрын
    • Большое спасибо за уточнения. Действительно, стоило это учесть. Основной фокус в видео это, разумеется, Proxy, поэтому детали (как вы правильно заметили про загрузку статусов в foreach) были несколько "размыты".

      @codaza-channel@codaza-channel2 жыл бұрын
  • Отличная подача материала! Только видоизменяет данные "декоратор", а прокси - нет.

    @oshastitko@oshastitko2 ай бұрын
  • 👍

    @edosoghomonyan3072@edosoghomonyan3072 Жыл бұрын
  • Реально хорошо подготовленный материал и подача. Думал все остальные посмотреть из 23 ех... ан нет... жаль

    @VTryhub@VTryhub Жыл бұрын
  • А если бы понадобилось изменить статусы? Пришлось бы переписывать словарь? Добавить какой-нибудь метод UpdateStatuses() в классе Chief, который изменит информацию, а мы потом её получим в Proxy?

    @sehzadeselim863@sehzadeselim863 Жыл бұрын
  • Здравствуйте. Спасибо за видео. У меня есть такой вопрос то что вы сделали вот тут: "IChef chef = new ProxChef(new Chef());

    @zluka4636@zluka4636 Жыл бұрын
  • Спасибо, очень понятно разложено. Но теперь интересно, какая принципиальная разница с декоратором?

    @vd3598@vd35982 жыл бұрын
    • Виктор, благодарю за комментарий и хороший вопрос. Задача Proxy - проксировать запрос от клиента к ресурсу оставаясь прозрачным на стыке взаимодействия клиента и ресурса без изменения интерфейса. Декоратор масшатабнее, он может расширять функциональность ресурса и интерфейса. Отличным применением декоратора будет пример, когда класс ресурса закрыт для наследования, а вам необходимо расширить его функциональность (возможно даже, серьёзно расширив поведение).

      @codaza-channel@codaza-channel2 жыл бұрын
  • Привет) Подача материала огонь Скажи пожалуйста, что за трек на 13:50?

    @eugennekarp8791@eugennekarp8791 Жыл бұрын
  • Спасибо за видео! Вместо dictionary со статусами не целесообразно ли использовать ,в данном случае, enum?

    @prognorock@prognorock Жыл бұрын
    • Для конкретного примера из видео это непринципиально. А вообще, в коммерческой разработке, enum не даст возможности заведения новых статусов без перекомпиляции приложения. В примере я подразумевал, что список статусов может быть расширен, как если бы мы загружали его из базы данных. Решение с использованием Dictionary является более гибким.

      @codaza-channel@codaza-channel Жыл бұрын
  • Как на счёт Декоратора и его разница с Proxy?

    @anninkov@anninkov2 жыл бұрын
  • Надо было прост сказать Proxy - это враппер, пасаны.

    @DF-ov1zm@DF-ov1zm10 ай бұрын
  • Декоратор будет?

    @pochtaliot@pochtaliot Жыл бұрын
  • Видео уже давно, если нет ничего подобного расскажи разницу между прокси и адаптером

    @railroadman2k@railroadman2k11 ай бұрын
  • Спасибо за видео. Единственное, не совсем понял, как у нас меняются статусы у Proxy, если мы обращаемся за ними к Chief только один раз при инициализации, а дальше поле _status не меняется (т.к. после первой же инициализации оно будет не null). _status = _chief.GetStatus(); Образует ссылку, поэтому значения _status меняются при изменении _chief (который, в свою очередь, ссылается на new Chief())?

    @dakefasso9124@dakefasso9124 Жыл бұрын
    • В примере, который обсуждается в ролике, подразумевается, что справочник статусов является неизменным, то есть статусы заказов ("ready", "not ready", "preparing") не добавляются и не удаляются. В более сложных сценариях, справочник может изменяться. Для его обновления необходимо использовать различные стратегии кэширования, которые подбираются в соответствии с требованиями задачи. Например, можно применить времени экспирации, чтобы справочник загружался через каждые 10 минут.

      @codaza-channel@codaza-channel Жыл бұрын
    • ​@@codaza-channel Рискну предположить, что вопрос был не об этом. Я думаю, что Dake Fasso, как и мне, интересно - почему статусы в консоли обновляются, если мы не обращаемся к _chief повторно? Потому что мы кэшируем ссылки на сами статусы, и в данном случае нам не нужно ждать 2 секунды, т.к. эти 2 секунды запускаются параллельно, в другом потоке и к нашему выводу в консоль уже не имеют никакого отношения. Верно?

      @aleksey8405@aleksey8405 Жыл бұрын
    • @@aleksey8405 Я заметил что у всех моих заказов одинаковые статусы. Например 1 1 1 или в следующий раз 2 2 2, во время дебага проскальзываю 1 1 2 например

      @pddbsegetetesbeabeaeg@pddbsegetetesbeabeaeg Жыл бұрын
    • Потому что заказы с обновленными статусами мы получаем с помощью метода GetOrder(). А в методе GetStatus мы получаем только все возможные статусы для заказа. Просто вместо того, чтобы каждый раз создавать словарь с одними и теми же значениями, можно было один раз в классе создать константу и в методе передавать на нее ссылку, но здесь сделано иначе для примера кэширования.

      @sergeyz.5845@sergeyz.5845 Жыл бұрын
  • Декоратор (Decorator) плиз

    @user-by9zh4zq7h@user-by9zh4zq7h9 ай бұрын
  • 18:42 вырезан звук

    @ilizzium1241@ilizzium1241 Жыл бұрын
  • Не очень понял в чем смысл? То что мы обращаемся за статусом один раз - это понятно. Но ведь статус может измениться, и для этого надо обращаться к шефу, чтоб узнать актуальный. Объясните пожалуйста

    @user-ti8ke4cp8p@user-ti8ke4cp8p Жыл бұрын
  • Привет, я упустил момент и не разобрался. Получается когда первый раз мы вызываем статусы , они "подвисаю" , потому что записываются в коллекцию ( IDictionary? _statuses), после этого мы всегда ее возвращаем , изменяя только сами статусы в ней. Так вот как Коллекция уведомляется об изменении статуса и выводит уже новый ?

    @user-hx3cb2uu4c@user-hx3cb2uu4c Жыл бұрын
    • Сами статусы (id и название статуса) читаются 1 раз внутри прокси и сохраняются (кэшируются), затем при следующем обращении к GetStatuses берётся их кэшированая версия. А изменение id статуса происходит в словаре заказов из-за использования функции рандом каждый раз, когда мы запрашиваем список заказов (chief.GetOrders) на клиенте (в цикле while в Main). Надеюсь понятно объяснил.

      @1MrFritz1@1MrFritz1 Жыл бұрын
  • А разве пример с логированием на 2:40 не будет реализацией паттерна decorator , а не proxy ? В данном случае мы же добавляем новую логику поведения , а не управляем доступом к объекту

    @kosmonik9446@kosmonik9446 Жыл бұрын
    • Спасибо за отличный вопрос. Здесь важно понимать, что бывают ситуации, когда функциональность паттернов Proxy и Decorator пересекается и это как раз тот случай, на который вы обратили внимание. Правильный ответ на ваш вопрос: это зависит, потому что в ролике не раскрыто 100% информации о том, как именно работает Proxy в небольшом примере с логированием, так как это не требуется для осмысления паттерна. Если мы ограничиваем возможности ресурса (например, не даём доступ ко всем его методам), то это реализация паттерна Proxy. Если мы расширяем возможности ресурса (даём доступ ко всем его методам и, возможно, дополняем функциональность), то это реализация паттерна Decorator.

      @codaza-channel@codaza-channel Жыл бұрын
  • А разве ChiefProxy должен в конструкторе иметь конкретного Chief? Лучше ведь IChief, чтобы мы могли один и тот же прокси использовать для любых реализаций Шефов.

    @aaa_aaa6226@aaa_aaa6226 Жыл бұрын
    • Здесь нюанс состоит в том, что ресурс (в нашем случае Chief) не всегда реализует какой-то интерфейс (в нашем случае IChief). Чаще всего ресурс реализован в виде подключаемой библиотеки, которая реализована сторонними разработчиками. Поэтому в классе Proxy, мы не всегда имеем возможность определение ресурса через интерфейс. Если же есть возможность работы с ресурсом через интерфейс, то вариант, который вы предложили, конечно, является предпочтительным.

      @codaza-channel@codaza-channel Жыл бұрын
  • Как включить такие подсказки от VS? Те что серым высвечиваются в коде 12:37

    @user-ng6cc6xz4b@user-ng6cc6xz4b2 жыл бұрын
    • Честно говоря, даже не задумывался об этих подсказках. Я использую Visual Studio 2022 и ReSharper. Вероятно что-то включено по умолчанию 🙂

      @codaza-channel@codaza-channel2 жыл бұрын
  • И сам интерфейс нельзя считать за прокси, по сути он же тоже заместитель реального объекта, только без реализации конечно? А то смотрел какойто видос про этот паттерн, там реализовывали интерфейс и говорили что это прокси, а здесь совсем все иначе.

    @zergzerg4844@zergzerg4844 Жыл бұрын
    • Рекомендую обратиться к первоисточнику, а именно, к книге Gang of Four Design Patterns. Отбросьте все видео (включая это) и прочитайте рекомендации от авторов паттерна.

      @codaza-channel@codaza-channel Жыл бұрын
  • После второго «испачкать руки в грязи» снял лайк и выключил

    @DmitryIvanov-sj2tt@DmitryIvanov-sj2tt11 ай бұрын
  • Теория не плохая, реализация не достойна паблика. Учите своих зрителей как не надо программировать. Я понимаю, что это для примера, но ваш код нарушает принципы ООП и SOLID, а неопытные зрители повторяют эти ошибки. Пичалька.

    @TheKaazus@TheKaazus Жыл бұрын
  • Поймал ошибку: Inconsistent accessibility: return type 'IEnumerable' is less accessible than method 'IChief.GetOrders()'

    @nkochubashev@nkochubashev Жыл бұрын
    • Исправил: public struct Order

      @nkochubashev@nkochubashev Жыл бұрын
KZhead