Удобная навигация по видео :) 0:00 - Начало 0:55 - Builder это порождающий паттерн 1:31 - Проблема если не использовать паттерн Builder 4:20 - Решение которое предлагает паттерн Builder 6:43 - Анатомия Builder 10:32 - Поддержка канала 10:54 - Live example 11:45 - Пример: Создаём проект в Visual Studio 2022 (.NET6) 28:11 - Пример: Рефакторинг Builder на Fluent Builder
Опа , это как раз то , что я хотел бы от тебя посмотреть Человек умеющий объяснять сложные вещи простыми словами с хорошим монтажем , объясняет паттерны . Браво
Отличное видео, респект тебе. Хотел поинтересоваться, не лучше было бы назвать интерфейс IReportBuilder, а не IEmployeeReportBuilder? Ведь его будут реализовывать классы разных билдеров отчётов, а не только отчёта о работниках. Ну и соответственно сделать базовую сущность для отчёта, например класс Report, и от него уже наследовать конкретные отчёты (и возвращать именно Report из метода в IReportBuilder)
Великолепный ролик, благодарю. Вы просили подать вам идею ! Хотел попросить сделать урок, построить полностью проект с правильной архитектурой на Net 5 со всеми слоями и Entity Framework очень важно Context с многими базами данных.Спасибо
Хорошая работа, однако я бы предпочел более простой пример для введения (без директора), т.к. это немного усложняет понимание в принципе простого конструкта
А есть какой то способ настроить порядок вызова методов в билдере? Условно чтобы был строго определен порядок вызова. builder.AddBeaf().AddKetchup() но не наоборот?
метод Build*() должен быть один и он должен возвращать созданный объект. У вас даже в презентации все методы начинаются с With*(), а вы зачем-то взяли и забыли про это.
Здесь важно понимать, что билдер в основном нужен именно, когда объект иммутабельный и полей много. Тогда сетеры ты не сделаешь, а конструкторов нужно много, на все возможные комбинации параметров, вот в чём дело. Пример может быть любой, пример с бургером вполне себе неплохой.
Огромное спасибо автору роликов, что так медленно объясняет. Впервые, смотря ролики, я успеваю понимать, о чём речь!!! И примеры отличные, и монтаж красивый. Продолжайте в том же духе!
Очень классный канал! Приятно слушать и смотреть на профессионала, а не на всяких там дударей, хаудихо и т.п) А есть на канале гайды для изучения Шарпа от новичка до Джуна?)
Интерфейс IEmployeeReportBuilder лучше переименовать в IReportBuilder, так как интерфейс должен быть максимально абстрактным. Чтобы потом не фрустрировать от строчки CustromerReportBuilder : IEmployeeReportBuilder.
@codaza подскажи что за фишка в Program.cs. Без определения класса, без Main, не внутри метода - сразу объявлять переменные. Это что-то новенькое в c#? Где почитать можно? И да, отличный ролик, все супер понятно, спасибо большое за твой труд
Да, это новая возможность, которая появилась в C# 9. В целом, ничего сложного, просто можно не писать всю обвязку связанную с главной точкой входа - методом Main(). Мне нравится пользоваться этой возможностью для небольших учебных примеров.
Директор же в данном коде это паттерн фасад? А то я названия никак не запомню у шаблонов - прочитал пару статей и вдохновился чем-то новым, если такого ранее не юзал, а вот названия разом 20+ шаблонов хрен запомнишь
Бро Ты лучший. Работаю джуном на шарпе в Германии на бэке. За годы обучения тут, даже близко такого уровня умелого преподнесения информации не встречал. Лайк и уважение.
Невероятно доступное объяснение и хороший пример, рад что это является нормой для канала. Хотелось бы побольше уроков про паттерны. Также интересно, почему при переопределении .ToString() на 13:58 использовался StringBuilder, однако далее в видеоролике работа шла с обычными строками (например, при работе с _employeeReport на 18:48-22:48). Какие критерии обычно служат выбором между string и StringBuilder, возможно ли делать правильный выбор при отсутствии весомого опыта ? Стоит ли ждать видеороликов по базовым аспектам asp.net core ?
Очень хорошее и понятное объяснение патерна, но мне не хватает обзора кода после его написания. Просто с помощью дебага пройтись и пояснить что вообще происходит
Если появится новый бургер, в который мы захотим добавлять совсем новый ингридиент, то придется добавить в интерфейс buildPardD() и потом во всех уже созданных классах имплементировать этот метод?
Это зависит от ваших целей и задач. Если добавление нового ингредиента потребует соответствующие изменения в тех местах, где создаётся объект, то ответ: да, нужно во всех классах имплементировать этот метод. Если же у вас большая кодовая база и новый метод не затрагивает её, то ответ: нет, достаточно унаследовать интерфейс IBuilder с добавлением нового метода и унаследовать класс строителя с реализацией унаследованного интерфейса. А можно реализовать унаследованный интерфейс в одном из классов-строителей где планируется его применение.
У меня по ходу создания бургера, вопрос созрел. Я бы хотел скрыть методы сборки бургера от клиента, но тогда шеф тоже не сможет собирать его. Как я мог бы инкапсулировать этот процесс?
Интересное желание 🙂 Не знаю зачем вам хотелось бы так сделать, но у меня есть для вас один вариант. Вы можете выделить строителя и шефа в отдельный проект и сделать методы сборки бургера с модификатором доступа internal. При таком подходе, методы будут видны в рамках сборки и не видны за её пределами.
Здравствуйте! От Builder - связь зависимости (--->) От Client и Director зависит от бизнес-логики (может быть агрегация, композиция или ассоциация). В классическом виде, любые связи от Director к Product стоит избегать, но бывают ситуации, где этого сделать нельзя. Как правило, такие связи принято опускать, чтобы не загромождать суть решаемой проблемы.
С текстом понятно, делаем Append и всё соединилось. А что с классами то делать? Есть у меня класс бургер. Как в него правильно уместить все ингредиенты, если ингредиенты сами являются классами.
Спасибо за отличный вопрос. В сущности, пример с бургером, практически не отличается от примера с отчётом. В случае когда в состав вашего класса входят другие классы, в этих вложенных классах Вы можете переопределить метод ToString(). Таким образом, в классе Burger, Вы сможете сможете получить строковое представление вложенного объекта. Кроме того, пример можно разнообразить. Представьте что повару (который готовит бургер) на экран монитора с заказами отображается не просто текст (бургер с котлетой и помидорами), а прям картинка и, возможно, рекомендации по приготовлению.
@@codaza-channel Спасибо! А если мне нужны не текстовые данные? У каждого класса свой тип данных, не сериализуемый в стринг. В таком случае можно использовать Builder?
Конечно, так как Builder - это не про "строки"; Builder - это про построение сложного объекта по шагам. В примере мы использовали ToString() у объекта отчёта в качестве наглядной реализации. Чтобы понять использовать паттерн Builder или нет, ответьте себе на три вопроса: 1. У меня есть сложный объект? 2. Существуют ли вариации создания этого объекта? 3. Возможно ли вынесение логики создания объекта? Если на все три вопроса Вы ответили "Да", то ваш выбор - паттерн Builder.
Оччень!!! медленные слова в которых мало смыслы (котлеты, компоненты и т.п.) - ну очень (!) долго. Может расчет на тупых или иначе "обкуренных"? Первые пять минут можно уложить в одну. Совет (надеюсь) - "курите" меньше, может и высказывать свои мысли научитесь высказывать проще и быстрее...
Удобная навигация по видео :)
0:00 - Начало
0:55 - Builder это порождающий паттерн
1:31 - Проблема если не использовать паттерн Builder
4:20 - Решение которое предлагает паттерн Builder
6:43 - Анатомия Builder
10:32 - Поддержка канала
10:54 - Live example
11:45 - Пример: Создаём проект в Visual Studio 2022 (.NET6)
28:11 - Пример: Рефакторинг Builder на Fluent Builder
Опа , это как раз то , что я хотел бы от тебя посмотреть
Человек умеющий объяснять сложные вещи простыми словами с хорошим монтажем , объясняет паттерны .
Браво
Отличное видео, респект тебе.
Хотел поинтересоваться, не лучше было бы назвать интерфейс IReportBuilder, а не IEmployeeReportBuilder? Ведь его будут реализовывать классы разных билдеров отчётов, а не только отчёта о работниках. Ну и соответственно сделать базовую сущность для отчёта, например класс Report, и от него уже наследовать конкретные отчёты (и возвращать именно Report из метода в IReportBuilder)
*Не пишу на решётке с нового года. Котлин приятнее, сахар 'apply' решает.*
Обожаю этот канал, просто находка 😃
Хотелось бы видеть побольше видео о патернах.
Мне безумно нравится Ваша подача материала. Спасибо за это :>
уф 100 "-" - жестко, new string...
ЛЮБЛЮ ВОПЕР И ТВОИ ВИДЕО!
Великолепный ролик, благодарю. Вы просили подать вам идею !
Хотел попросить сделать урок, построить полностью проект с правильной архитектурой на Net 5 со всеми слоями и Entity Framework очень важно Context с многими базами данных.Спасибо
Великолепный ролик, спасибо! надеюсь, что дальше будет только круче!
Отличный учебный материал! Прост потрясающе! Я в диком восторге! Аплодирую стоя! Однозначно лайк, подписка. Рекомендации друзьям, студентам, соседям и т.д...
Хорошая работа, однако я бы предпочел более простой пример для введения (без директора), т.к. это немного усложняет понимание в принципе простого конструкта
А есть какой то способ настроить порядок вызова методов в билдере? Условно чтобы был строго определен порядок вызова. builder.AddBeaf().AddKetchup() но не наоборот?
метод Build*() должен быть один и он должен возвращать созданный объект. У вас даже в презентации все методы начинаются с With*(), а вы зачем-то взяли и забыли про это.
Одна из лучших подач информации в русскоязычном youtube!Успехов Вам, продолжайте в том же духе!
показана самая отвратительная реализация паттерна. Хранить продукт в билдере это полный кринж
Thanks for your work. Comment a s support of your channel.
Класс! Спасибо за ваш труд. А вы часом менторингом не занимаетесь?
Две мясных котлеты гриль, специальный соус, сыр, огурцы, салат и лук, всё на булочке с кунжутом, только так и это ... не Воппер.
Знаю что тут станет понятно. Заранее спасибо!!!
Ты самый лучший! Спецом отлайкаю тебя вообще везде чтобы рано или поздно попасть в список имен рядом с Иваном и Борисом :P
Спасибо, отличная работа и отличное исполнение. Жду новых паттернов.
Ни Иван, ни Борис, ни Фёдор, но всё равно лайк поставлю!
P.S. некст голосую за паттерн Мост.
про воппер забыли сказать, что он состоит из лука, там практически всё лук.
Великолепная подача, спасибо тебе большое!!
Объяснение интересное, но что за три поросенка Хидер, Боди и Футир?
БУКВАЛЬНО СЕГОДНЯ СМОТРЕЛ ПРО ЭТОТ ПАТТЕРН!!
спасибо большое, кодаза
Не понимаю зачем нужен интерфейс билдера. Ведь он обязует реализовать методы, название которых лишены смысла. А директора часто манагером обзывают
Мне большое всего нравится пример из книги банды четырех - лабиринт. А то остальные примеры напоминают обычный конструктор.
Здесь важно понимать, что билдер в основном нужен именно, когда объект иммутабельный и полей много. Тогда сетеры ты не сделаешь, а конструкторов нужно много, на все возможные комбинации параметров, вот в чём дело. Пример может быть любой, пример с бургером вполне себе неплохой.
Как всегда топ, практически всегда повторяю эти видосы перед собесом)
new string('-',100)
Огромное спасибо автору роликов, что так медленно объясняет. Впервые, смотря ролики, я успеваю понимать, о чём речь!!! И примеры отличные, и монтаж красивый. Продолжайте в том же духе!
Срочно нужна большая серия уроков по всем паттернам и лучшим практикам проектирования и разработки.
Давай давай, контент в кайф, почаще бы вот так
Действительно реальный объект реального мира))
Крутое видео, видно,что проделан огромный пласт работы, спасибо
Спасибо большое за чудесный ролик
Класс! Очень нравятся мне ваши видео по паттернам!
Ммм, свежак подъехал
Очень классный канал! Приятно слушать и смотреть на профессионала, а не на всяких там дударей, хаудихо и т.п) А есть на канале гайды для изучения Шарпа от новичка до Джуна?)
Благодарю за высокую оценку 💙 Рад, что информация оказалась полезной для вас.
Гайдов пока нет.
Почему я не знал про этот канал раньше?
Почему он появился в рекомендациях спустя столько времени
Грёбаный Ютуб
Автору большое спасибо
Лучше поздно, чем никогда!
Добро пожаловать на борт ⛵
Отличный ролик👍
Респект и уважуха.
Интерфейс IEmployeeReportBuilder лучше переименовать в IReportBuilder, так как интерфейс должен быть максимально абстрактным. Чтобы потом не фрустрировать от строчки CustromerReportBuilder : IEmployeeReportBuilder.
Отличный канал!
гений
Шикарная подача
Спасибо большое!!! Хорошее изложение материала. Пожелание - сделать тише фоновую музыку в следующих видео.
@codaza подскажи что за фишка в Program.cs. Без определения класса, без Main, не внутри метода - сразу объявлять переменные. Это что-то новенькое в c#? Где почитать можно? И да, отличный ролик, все супер понятно, спасибо большое за твой труд
А вот, нашёл: docs.microsoft.com/ru-ru/dotnet/csharp/fundamentals/program-structure/top-level-statements.
Не знал об этом
Да, это новая возможность, которая появилась в C# 9. В целом, ничего сложного, просто можно не писать всю обвязку связанную с главной точкой входа - методом Main(). Мне нравится пользоваться этой возможностью для небольших учебных примеров.
Супер!
Директор же в данном коде это паттерн фасад?
А то я названия никак не запомню у шаблонов - прочитал пару статей и вдохновился чем-то новым, если такого ранее не юзал, а вот названия разом 20+ шаблонов хрен запомнишь
спасибо, настолько доходчиво что дальше некуда, на пальцах, очень благодарен!!!
Бро Ты лучший. Работаю джуном на шарпе в Германии на бэке. За годы обучения тут, даже близко такого уровня умелого преподнесения информации не встречал. Лайк и уважение.
Будущая профессия всех "программистов"
ты лучший на рунете по дотнет продолжи с паттернами пожалуйста, еще хотелось бы увидеть обьяснение от тебя на тему EF core tracking как происходит
Невероятно доступное объяснение и хороший пример, рад что это является нормой для канала. Хотелось бы побольше уроков про паттерны. Также интересно, почему при переопределении .ToString() на 13:58 использовался StringBuilder, однако далее в видеоролике работа шла с обычными строками (например, при работе с _employeeReport на 18:48-22:48). Какие критерии обычно служат выбором между string и StringBuilder, возможно ли делать правильный выбор при отсутствии весомого опыта ? Стоит ли ждать видеороликов по базовым аспектам asp.net core ?
Дякую за пояснення! Величезна допомога початківцям ❤
Очень хорошее и понятное объяснение патерна, но мне не хватает обзора кода после его написания. Просто с помощью дебага пройтись и пояснить что вообще происходит
Один из лучших каналов по шарпу. Смотрю после курса Сакутина, все еще нахожу для себя много нового и интересного, топовый контент 🔥
У вас явно талант. Спасибо столь качественные уроки
надеюсь будете продолжать свой труд!
Было бы круто увидеть видео или шортс про оператор return от вас
это великолепно, чувак
🤟
Люто лайкаю! Подписался.
Просто, огромное спасибо!
Лучшее что я видел из видео по языкам
Отлично. Спасибо
Боже храни Codaza!
Если появится новый бургер, в который мы захотим добавлять совсем новый ингридиент, то придется добавить в интерфейс buildPardD() и потом во всех уже созданных классах имплементировать этот метод?
Это зависит от ваших целей и задач. Если добавление нового ингредиента потребует соответствующие изменения в тех местах, где создаётся объект, то ответ: да, нужно во всех классах имплементировать этот метод. Если же у вас большая кодовая база и новый метод не затрагивает её, то ответ: нет, достаточно унаследовать интерфейс IBuilder с добавлением нового метода и унаследовать класс строителя с реализацией унаследованного интерфейса. А можно реализовать унаследованный интерфейс в одном из классов-строителей где планируется его применение.
Спасибо!
Лучший!!
У меня по ходу создания бургера, вопрос созрел. Я бы хотел скрыть методы сборки бургера от клиента, но тогда шеф тоже не сможет собирать его. Как я мог бы инкапсулировать этот процесс?
Интересное желание 🙂 Не знаю зачем вам хотелось бы так сделать, но у меня есть для вас один вариант. Вы можете выделить строителя и шефа в отдельный проект и сделать методы сборки бургера с модификатором доступа internal. При таком подходе, методы будут видны в рамках сборки и не видны за её пределами.
}{идер
Здравствуйте! Подскажите, пожалуйста, на диаграмме UML какие все-таки связи протягивались бы от продукта к остальным объектам?
Здравствуйте!
От Builder - связь зависимости (--->)
От Client и Director зависит от бизнес-логики (может быть агрегация, композиция или ассоциация). В классическом виде, любые связи от Director к Product стоит избегать, но бывают ситуации, где этого сделать нельзя. Как правило, такие связи принято опускать, чтобы не загромождать суть решаемой проблемы.
@@codaza-channel Спасибо!
С текстом понятно, делаем Append и всё соединилось. А что с классами то делать?
Есть у меня класс бургер. Как в него правильно уместить все ингредиенты, если ингредиенты сами являются классами.
Спасибо за отличный вопрос. В сущности, пример с бургером, практически не отличается от примера с отчётом. В случае когда в состав вашего класса входят другие классы, в этих вложенных классах Вы можете переопределить метод ToString(). Таким образом, в классе Burger, Вы сможете сможете получить строковое представление вложенного объекта.
Кроме того, пример можно разнообразить. Представьте что повару (который готовит бургер) на экран монитора с заказами отображается не просто текст (бургер с котлетой и помидорами), а прям картинка и, возможно, рекомендации по приготовлению.
@@codaza-channel Спасибо!
А если мне нужны не текстовые данные? У каждого класса свой тип данных, не сериализуемый в стринг. В таком случае можно использовать Builder?
Конечно, так как Builder - это не про "строки"; Builder - это про построение сложного объекта по шагам.
В примере мы использовали ToString() у объекта отчёта в качестве наглядной реализации.
Чтобы понять использовать паттерн Builder или нет, ответьте себе на три вопроса:
1. У меня есть сложный объект?
2. Существуют ли вариации создания этого объекта?
3. Возможно ли вынесение логики создания объекта?
Если на все три вопроса Вы ответили "Да", то ваш выбор - паттерн Builder.
Я за бигтейсти из мака
Оччень!!! медленные слова в которых мало смыслы (котлеты, компоненты и т.п.) - ну очень (!) долго. Может расчет на тупых или иначе "обкуренных"? Первые пять минут можно уложить в одну.
Совет (надеюсь) - "курите" меньше, может и высказывать свои мысли научитесь высказывать проще и быстрее...
включи x2.
Что касается видео то сделано очень хороши и без воды.