Тёмный

НЕ ООП ЕДИНЫ! Domain Driven Design на примере ХОЛОДИЛЬНИКА / Tech Lead Борис Беньковский 

АйТиБорода
Подписаться 328 тыс.
Просмотров 102 тыс.
50% 1

Станьте универсальным разработчиком с помощью курса Нетологии «Fullstack-разработчик на Python»: netolo.gy/hsa
По промокоду ITBORODA действует скидка 45% на обучение в Нетологии
Сегодня мы поговорим про Domain Driven Design aka Domain Driven Development aka DDD aka Предметно-ориентированное программирование на примере ХОЛОДИЛЬНИКА! Гость выпуска мой старинный друг и Tech Lead - Борис Беньковский. Боря вырос в маленькой деревне, был помощником комбайнера, а сегодня на примере холодильника рассказывает как работают луковичные архитектуры, что такое доменные модели, агрегаты и всё вот это вот из DDD.
Так что, заваривайте чаинский/кофеинский и погнали, будет полезно! 😉
ДОП. МАТЕРИАЛЫ:
- Боря в Linkedin: / boris-biankouski-006a1866
- Материалы из выпуска: t.me/itbeard/769
- Аудио-версия выпуска: itbeard.mave.digital/ep-166
- Выпуск без рекламы: • [noadv] НЕ ООП ЕДИНЫ! ...
- Станьте спонсором канала:
/ @itbeard
НАВИГАЦИЯ:
0:00 Начало
0:50 Представление
1:55 Детство в деревне
6:29 Интеграция
8:30 Лицей БГУ
13:00 В PHP через комбайнёра
21:45 Армия
30:50 Работа после армии бэкендером
38:40 Про php и Symfony
47:10 DDD на примере холодильника
53:25 Терминология
58:45 Модели
1:26:55 Репозитории
1:35:55 Сервисы
1:39:40 Контексты и модули
1:43:20 Агрегаты
1:48:06 Луковичные архитектуры (onion architecture)
1:59:35 Что почитать
2:01:57 РАНДОМ
2:09:17 КОНКУРС
2:12:58 Послешоу
МОИ КОНТАКТЫ:
- RU-vid: / itbeard
- Telegram: t.me/itbeard
- Instagram: / itbeard
- Twitter: / iamitbeard
- Discord: / discord
- Сайт: itbeard.com
#айтиборода #ityoutubersru #ddd

Наука

Опубликовано:

 

19 июн 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 472   
@itbeard
@itbeard 2 года назад
НАВИГАЦИЯ: 0:00 Начало 0:50 Представление 1:55 Детство в деревне 6:29 Интеграция 8:30 Лицей БГУ 13:00 В PHP через комбайнёра 21:45 Армия 30:50 Работа после армии бэкендером 38:40 Про php и Symfony 47:10 DDD на примере холодильника 53:25 Терминология 58:45 Модели 1:26:55 Репозитории 1:35:55 Сервисы 1:39:40 Контексты и модули 1:43:20 Агрегаты 1:48:06 Луковичные архитектуры (onion architecture) 1:59:35 Что почитать 2:01:57 РАНДОМ 2:09:17 КОНКУРС 2:12:58 Послешоу
@devracoon
@devracoon 2 года назад
Ну какое нафиг Symphony? Symfony, SYMFONYYYYYYYYYYYYYYYYYYYY
@itbeard
@itbeard 2 года назад
@@devracoon да всем похер на пыху)
@devracoon
@devracoon 2 года назад
@@itbeardобидно, но нет, я пхпшник 7 лет, симфони 5 из них, еще с 1 версией работал... В жопу пхп, сейчас на голанг и котлин 👍
@alexgaliy
@alexgaliy 2 года назад
A SSSSSS S SSSSSSSS SSSSSSSSSSSSSSESSIONSSSSSSSSSSSSßßSSSSSSSSßSSSSSSSSSSSßSSSSSSSSSßSßSßßSSSSSSSSßSSSßSSßSSS SSSßSßSßSßS S
@CS16kanal
@CS16kanal 2 года назад
А Поперечный в Айтишечке оказывается шарит
@vitaliinnest
@vitaliinnest 2 года назад
ахахах, весь выпуск думал, кого же он мне напоминает
@ostaprobin1189
@ostaprobin1189 2 года назад
Зашёл посмотреть на такой комментарий
@adambolotov3153
@adambolotov3153 2 года назад
Поперечный XL
@andreymorozov5256
@andreymorozov5256 2 года назад
Пригожин отрастил бороду и тоже начал вникать
@murtazina_raisa
@murtazina_raisa 11 месяцев назад
Чуть чуть похож реально
@piemka
@piemka 2 года назад
Так я ДДД. Каждый день делаю запросы в холодильник!
@Biankouski
@Biankouski 2 года назад
@xbsxbs22
@xbsxbs22 2 года назад
У него чёрный пояс по гастрономическим метафорам
@smookkee1
@smookkee1 2 года назад
Судя по пузику Лекса, он тоже не отстает
@piemka
@piemka 2 года назад
@@smookkee1 самое лучшее пузико на этой планете!
@KaputTV
@KaputTV 2 года назад
Ты Service)
@sergeydanilov4568
@sergeydanilov4568 2 года назад
Было бы круто, если бы такие вещи обсуждались с доской, на которой можно порисовать свои мысли)))
@k.kolomeitsev
@k.kolomeitsev 2 года назад
Спасибо, интеревью интересное, спикер интересный, но объяснение хромает 56:00 про пиццерию пример - есть пиццерия, у неё есть разные "отделы": кухня, продажи, склад - это домены. Когда ты реализуешь домен кухни, ты должен иметь "общий язык" с поварами, они говорят пицца - ты понимаешь что это тесто с сыром, томатной пастой и далее по списку. Пицца для продажников - это другое, для них пицца - это готовое кулинарное изделие, в коробке, готовое к транспортировке, соответственно продажи это другой домен и там у Вас свой "общий язык". DTO нужны чтобы допустим перенести пиццу из домена "кухни" в домен "продаж", скорее всего с участием домена "склада". Со склада Вам нужна коробка, с кухни само изделие, а затем в продажах Вы вешаете цену.
@user-zb9fo7qx1x
@user-zb9fo7qx1x Год назад
вот вы объяснили лучше, чем спикер за все видео
@Mbslr
@Mbslr Год назад
Вот. Сразу чувствуется структурное мышление
@timur43378
@timur43378 11 месяцев назад
Домен - это вся пиццерия. Отделы - это bounded context.
@k.kolomeitsev
@k.kolomeitsev 11 месяцев назад
@@timur43378 bounded context это бухгалтерия, рецепты, табель, меню. Для начала в терминах разберись
@Yarkendar
@Yarkendar 2 года назад
Люблю программистов из деревни - умеют простыми и понятными словами объяснять сложные вещи
@alexeylozenko6093
@alexeylozenko6093 2 года назад
Это индикатор понимания, причина почему полезно не только учится но и учить.
@danku1013
@danku1013 2 года назад
Всегда забавляет то, как люди поясняют сложную тему на казалось бы простом примере, но из-за простого примера(очевидно не подходящего) становиться всегда ещё только хуже
@valeravalera6201
@valeravalera6201 2 года назад
А все потому что эта сложная тема еле натягивается даже на простой пример. А на реальном сложном бизнесе придется в эти доменные сущности инжектить по 50 сервисов со всеми вытекающими проблемами с производительностью общения с базой.
@danku1013
@danku1013 2 года назад
@@valeravalera6201 поверьте, когда идут реальные примеры, все в разы проще, это в 100 раз проще понять когда у тебя просто микросервисы есть, а не какой-то монолит с одинаковым классами "Холодильник" которые лежат в разных модулях/неймпейсах. Любая ссылка про ДДД в гугле, намного понятнее это все поясняет, уверен гость понимает о чем говорит, но выбор "Холодильник + Монолит" объективно неудачный.
@itCODE
@itCODE 2 года назад
Лекс, классный и позитивный выпуск! Спасибо вашей команде! Нравятся твои видео, не напряжные и хорошо поставленные, хорошая атмосфера без всякого пафоса. Всем хорошего просмотра) Лекс, майка - огонь!)
@itbeard
@itbeard 2 года назад
спасибо!
@AlexMedinsky
@AlexMedinsky 2 года назад
Открываешь холодильник, а оттуда exception вылетает. Люблю DDD!
@vesh95
@vesh95 2 года назад
Call to a member function getKolbasa() on null
@sergeyyakushenok8092
@sergeyyakushenok8092 Месяц назад
@@vesh95 В голос 🤣🤣🤣
@user-ur4ev7vl6c
@user-ur4ev7vl6c 2 года назад
Такое ощущение что когда строил большой проект - мыслил 50/50 моделями как в DDD; Но вот на тесты не обращал внимания совсем :(; Но теперь захотелось больше!); Вы мои герои 💖💖💖
@InoksFiy
@InoksFiy 2 года назад
Это вышка! Спасибо за выпуск, я как раз изучаю DDD. Борис очень помог понять простыми словами
@leonid_konoplin
@leonid_konoplin 2 года назад
в тему выпуск! Книгу можно еще почитать - Вернон В. - Реализация методов предметно-ориентированного проектирования
@okke00
@okke00 2 года назад
Ее лучше на английском читать, перевод там ужасен
@kinvain
@kinvain 2 года назад
2:03:35 S. в single responsible это не про то что один класс\сущность - одна задача. Класс отвечает принципу единой ответственности если есть только одна причина для его изменений. Именно поэтому кухонный холодильник не может иметь метод взятьИнгридиенты и отремонтировать. Потому что тогда класс придется менять если меняется логика получения ингредиентов или логика ремонта.
@PolishchukMaxim
@PolishchukMaxim 2 года назад
"The single-responsibility principle (SRP) is a computer-programming principle that states that every module, class or function in a computer program should have responsibility over a single part of that program's functionality, and it should encapsulate that part." (c) Wiki Согласен, что "single part of that program's functionality" понятие не очень конкретное - границы part весьма условны, нет единого стандарта. Принцип помогает определить при проектировании сущности её будущую зону ответственности и при необходимости снижать функциональную "нагрузку". Я к тому, что принцип желательно использовать уже на этапе проектирования, иначе на этапе изменений могут возникнуть трудности 🙂
@AlexS-gn9tq
@AlexS-gn9tq 2 года назад
собственно Ваш ответ и иллюстрирует озвученную проблему с S - можно бесконечно спорить отвечает ли класс этому принципу, и при этом каждая из сторон спора будет по-своему права. "Одна причина для изменений" согласно теории - правильное определение, только в реальности, применительно к реальному классу написанному без какого-либо DDD и с соблюдением священного SOLIDа это можно трактовать по-разному. Кончается спор на code review как правило на том, что одна из сторон просто понимает, что продуктивнее будет просто перестать тратить время на бесполезный спор, согласиться с собеседником и идти дальше.
@kinvain
@kinvain 2 года назад
@@AlexS-gn9tq алюминь, брат. Постоянно с этим сталкиваюсь. И в плане споров это вообще топ. Самая боль когда приходится доказывать такому же синьёру-сениору что пихать валидацию, нотификацию, сбору объекта, логирование и созание платежа в сервис CreatePayment не есть гуд. Потому что с его точки зрения все эти процессы часть одной бизнес-логики - созания платежа. По своему опыту заметил что обычно таких вопросов будет меньше если начинать писать сервис с тестов, интефейсов и по принципу минимальной необходимости. То есть, если нужен валидный объект в сервисе то ты можешь либо сразу передать его (или получить) в сервис. И тогда никакой валидации не будет в принципе. Либо писать метод (возможно приватный) который будет собирать этот обьект и не дай бог там будет логика и значит тратишь время на тест и тут же можешь себя отрефлексировать что возможно это ответственность другого сервиса.
@artemvolt4600
@artemvolt4600 2 года назад
@@kinvain Я сейчас как раз на этапе, когда логика лежит в классе сервиса - как вы и описали на примере создания платежа. Я ментально понимаю, что здесь идет перемешивание, но пока это проще поддерживать, чем держать в контроллерах, но вы могли бы привести пример, как это концептуально должно быть? Например, сейчас это так PaymentService { create(creatorId, amount):Payment { this->transaction->start(); user = this->userStore->getExistent(creatorId) this->validator->validate(form = new CreatePaymentForm(creatorId, amount)) payment = Payment::new(form->creatorId, form->amount, user->id); this->paymentStore->save(payment) this->logger->createPayment(payment) this->notification->notifyCreatePayment(payment) this->transaction->end(); return payment; } } Логирование и нотификация должны срабатывать через события? Как это разносить. В данном случае, store - он просто сохраняет в бд модель activeRecord.
@kinvain
@kinvain 2 года назад
@@artemvolt4600 чисто интуитивно я бы предложил следующее PaymentService::create получает только те данные, которые нужны для созднаия платежа. А именно не creatorID и amount, а сразу объект типа Payment. И объект этот сразу должен быть валидным. То есть вы сначала собираете форму, в контроллере, например, валидируете её, создаёте объект платежа и дальше передаёте его в сервис создания. Выигрыш будет в том что когда вы захотите создавать платежи не только через web-страницу, но ещё и через API, а потом ещё напишете консольную команду, то единственное что будет отличаться - как собираются объекты Payment. Создание же будет всегда одинаковое PaymentService::create() Сделать интерфейс PaymentCreator с одним методом - create(Payment) и реализовать его для 1) непосредственно сервис создания платежа 2) логирование 3) нотификация. Дальше вы можете сделать стэк из этих сервисов (паттерн Декоратор) и каждый сервис будет заниматься только своим и вызывать следующий сервис. Например, PaymentCreateLoggerService будет логировать начало обработки, вызывать сервис создания, логировать результа (например, если было брошено исключение). Но логирование это вообще отдельная боль... Особенно когда приходится раскуривать логи и искать нужное. Нотификацию я бы предложил сделать через событие. PaymentService сохраняет платёж и делает какой-нибудь dispatch(new PaymentCreated($payment)). И добавить в систему слушатели этого сыбития для желаемого поведения. Я понимаю что это больше псевдо-код, но предложил бы делать конекретные сервисы. PaymentService - не понятно что он будет делать. Созадавать? Обноволять? Удалять? PaymentDeleteService - сразу понятно. И если кто-то захочете добавить в него метод по обновлению платежа то как минимум задумается. Моя идея в том что бы сервисы работали только с бизнес-объектами. Payment, к примеру, это бизнес-объект. А вот форма - нет. Потому что сегодня вы используете Symfony, а завтра решите переехать на Laravel реквесты. Такого, конечно, не будет, но смысл в том что бы вы могли написать свервис не думая о фреймворке и базе,
@user-iu7zo9gs7x
@user-iu7zo9gs7x 2 года назад
Ого! Огромное спасибо!!! Это архиполезный выпуск в разрезе ВЗАИМО понимания конечного заказчика и конечного исполнителя, которые, как зачастую бывает, живут в разных мирах! Класс!!!
@andreysakharov6210
@andreysakharov6210 2 года назад
По поводу ответов на рандомные вопросы. Как сказал Егор Малкевич (с которым есть охрененное интервью на этом канале) На вопрос, какой язык программирования учить в предстоящем году, я наконец то знаю правильный ответ - английский!
@danylo_pavenko
@danylo_pavenko 2 года назад
Я из Mobile разработки, мне было очень интересно послушать! В реальности TDD один раз за 8 лет использовали. Тогда давно не понял, а это прям тема. Спасибо за выпуск!
@ruslanshikhaliev9341
@ruslanshikhaliev9341 7 месяцев назад
Лекс и Борис, ну это пушка, посмотрел на одном дыхании)) Борис, не задумывался над собственным каналом?
@augustine582
@augustine582 2 года назад
Рад что в РБ есть бурления на тему DDD, я тоже из РБ и тоже интересуюсь этой темой, было бы неплохо замутить какое нить комьюнити )
@user-ip2uh5tz8v
@user-ip2uh5tz8v Год назад
К вопросу "Зачем нужен сервис, почему бы сразу с контроллера не управлять моделью?". Точек входа для выполнения одного и того же действия может быть несколько. Это может быть HTTP запрос, крон задача или ивент на который подписано приложение. Здесь очень важно, чтобы все эти точки входа оперировали моделью одинаково. То есть они должны вызывать один и тот же сервис, часто ещё применяют термин "use case". Отсюда получается, что задача контроллера и слушателя, который подписан на ивент, это преобразовать входящие параметры в параметры сервиса и вызвать его. Так сохраняется общая логика оперирования моделью. Именно по этому, такие сервисы ещё называют операционными и они размещаются в операционном слое (Application layer).
@user-ip2uh5tz8v
@user-ip2uh5tz8v Год назад
Досмотрел до этой точки ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-rkQ3-T82pkU.html , главную ответственность сервиса упомянули.
@agrokormby4308
@agrokormby4308 2 года назад
Аааааа, Алексей, что ты делаешь?!!!! :) Последнее время каждый новый гость, это просто праздник для сердца и ушей! Столько дел в воскресенье не переделаю из за твоего выпуска :) Спасибо огромное!!!
@pandao_12309
@pandao_12309 2 года назад
Как раз на новом проекте столкнулся с ДДД, сейчас в процессе изучения этого подхода, видос вышел прям в тему и вовремя для меня) спасибо!
@kensaitakeso
@kensaitakeso 2 года назад
1:08:55. Gherkin, это язык. А cucumber это фреймворк который использует этот язык
@akitmentorconsultant4696
@akitmentorconsultant4696 2 года назад
Зачем нужен сервис в DDD: сервис нужен для того чтобы 'спаять' два и более агрегата в одну транзакцию. Например, агрегатСклад.вывезти(уголь, 3тонны) и агрегатСчетПользователя.списать(КоммунальныеКслуги, 3 тонны * 1000руб/за тонну) И вот эти две операции должны быть в транзакции. Иначе консистентность данных в базе нарушится.
@akitmentorconsultant4696
@akitmentorconsultant4696 2 года назад
Но по хорошему два агрегата обновлять два агрегата в одном сервиса эта идея уже с запашком. Так как в первую очередь она не масштабируема, сложно переносима между между типами баз данных, например на реляционной базе данных этот пример будет работать, а в MongoDB уже его придётся переписывать, так как там нет транзакций между коллекциями документов. Вопрос как же быть в таком случае. Нужно определиться с какие у нас есть возможности баз данных, вот например, в MongoDB всё операции модификации атомарны на уровне документа. В реляционках есть транзакции. Теперь проводим черту между ними. Черта проходит ровненько через агрегат. Единственное что мы можем гарантировать для того чтобы система была консистента и масштабируема в одно и тоже время, так это атомарность агрегата на уровне апликешен логики. И тогда получается сервис как бы становится антипаттерном в данном случае. То есть проще как сказано выше просто из фабрики или репозитория дёрнуть агрегатСклад.вывезти() и сохранить агрегат в базу через репозиторий: репозиторийСклад.сохранить(агрегат склад). В методе сохранить будет конкретная имплементация под базу данных в MongoDB документ атомарен, а в SQL нужно будет создать транзакцию, если потребуется модифицировать записи из нескольких таблиц. В данном кейсе мы как пока решили ровно половину задачи выше касательно склада, назовем её левой ногой). Теперь нам нужно что-то решить с правой ногой то есть со списывание денег со счета пользователя. Пока без деталей применяем тот же подход что и для склада, ровно точно также. То есть у нас появляется правая нога. Обе эти ноги по отдельности они абсолютно масштабируемы, не зависисмы ни от базы данных, ни от фрейворков, чистая бизнес логика, которую можно и в браузере на JS запустить с in memory базой и на Lambda выполнить с бесконечным масштабированием, и протестировать, геркен тесты написать. Теперь есть выбор, можно раскидать эту логику в микросервисы, наносервисы, или оставить в монолите без изменения бизнес логики. Теперь остаётся самый важный этап как прикрутить две ноги к телу. Тут есть несколько вариантов, как по мне так мне ни один не нравится. Пример напишу в следующем коменте:
@akitmentorconsultant4696
@akitmentorconsultant4696 2 года назад
Варианты связки агрегатов, есть условие система должна быть масштабируема, но при этом есть другое условие, что атомарность мы гарантируем на уровне агрегата. В этом случае нам точно не подходят транзакции SQL, так как это привязка к типу базы, а так же это сразу блокирует масштабируемость. Нам не подходят по тойже причине распределеннные транзакции, то есть 2-3 фазные комиты. Единственный вариант на текущий момент, который можно прикрутить с довольно высокой степенью сложности реализации, так это асинхронное взаимодействие, тот самый event-driven development. Реализация вроде как проста, обычно виду два варианта, первый: пуляем ивенты в момент сохранения агрегата в базу или в очередь ивентов, а с другой стороны их обрабатываем. При такой асинхронной работе обычно нужно решать подзадачу, которая звучит так: "если уголь со склада вывезли (кинули ивент), но денег на счёте пользователя не хватило для оплаты, то верните (кинули ивент) пожалуйста уголь на склад". (То что в кавычках это и есть тот самый ubiquitous language, мы уже на нем общаемся если что 😀). Можно перефразировать: "отложите на складе 3 тонны угля для пользователя и когда пройдет оплата, то вывезите уголь со склада для пользователя." Вы поняли что у нас появились пара новых слов в нашем глобальном языке для агрегата склад: "отложить" и "вернуть". Как вы выберете будет зависеть от вашего бизнеса и требований. Теперь получается задача решена, но сложность системы повышена раза в 3. За счёт асинхронных компенсирующих операций. В этом примере есть на самом деле очень низкоуровневая проблема с самим процессом кидания ивента. Что если агрегат сохранился в базу, но сообщение не отправилось в очередь так как не было связи. Ну это уже отдельная тема.
@alexandrucostas8956
@alexandrucostas8956 2 года назад
Related to SOLID and single responsibility. Robert Martin in book "Clean Architecture" specifying that this principle relies to single actor, doesn't tell that a class shall be responsible for single action or thing to do, but relies to reason why you have to change this class. I guess a good example refrigerator, two models for two actors, cook and mechanic.
@nickfischer7374
@nickfischer7374 2 года назад
Лекс, привет! Сложно кратко описать словами, как мне нравятся твои интервью. Сколько уже посмотрел, и ни одного неинтересного собеседника встретил. Особо радует твой простой и свойский, "без понтов", подход ко всему. Лично я сейчас занят изменением своих подходов к работе, и твои видео о DDD в частности и о новых технологиях вцелом очень помогают мне понять, где мои рассуждения верны, а где нет. Особо приятно замечать тот же, что и у самого себя, блеск в глазах собеседников, когда они рассказывают о своих первых шагах в IT. Удивительно, мой путь и путь твоих гостей во многом похожи. В общем, так держать!
@itbeard
@itbeard 2 года назад
Спасибо и удачи!))
@eugenesidelnyk4600
@eugenesidelnyk4600 2 года назад
Наверное самый позитивный гость из всех, кто были на этом канале. Ждём ещё Макса True
@goriaev
@goriaev 2 года назад
Ещё был про с# и релокейт в Чехию позитивный гость)
@igolka97
@igolka97 2 года назад
Несколько месяцев назад начал погружаться в DDD. Как же знакомы все эти чувства когда впервые написал модель с поведением!
@dmitryn.4506
@dmitryn.4506 2 года назад
Интересно! Здесь суть концепции даже не в ПО, а в организации работы с заказчиком и бизнесом...
@ilyaplot
@ilyaplot 2 года назад
Так в разработке ПО большая доля работы заключается в правильной комминикации с заказчиком. DDD просто упрощает жизнь разработчикам на больших длительных проектах с изменяющимися условиями. Для стартапов очень хорошо подходит.
@kurasaored2775
@kurasaored2775 2 года назад
Офигенный гость!! Очень приятно слушать
@jaskier6295
@jaskier6295 Год назад
Лучше видео по ддд что я видел в жизни. Респектище гостю и автору
@andreyf3975
@andreyf3975 Год назад
Пушка. Соскучился по твоим интервью, и тема как раз актуальная. У меня сейчас процесс трансформации в DDD как раз :D
@malferov
@malferov 2 года назад
О, Поперечный стал хорошо питаться.
@verikusredis3384
@verikusredis3384 2 года назад
Классный и такой позитивный гость! Интересно про пиццу рассказывает.
@dpelipen
@dpelipen 2 года назад
Лекс, привет! Очень классный выпуск). Как тебе идея в следующий раз принести планшет или ноут со стилусом, чтобы гость рисовал схемки или схематично писал код для большего понимания и удержания в голове всех мелочей? И вывести все это где-нибудь на экран.
@itbeard
@itbeard 2 года назад
Ку! Идея гуд, думали доску поставить. Но! Монтаж тогда будет совсем не очень, плюс ребята, которые в аудио слушают очень расстроится, а таких много.
@itbeard
@itbeard 2 года назад
Так что для старта пойдет, а дальше уже можно искать целенаправленно курсы😊
@user-eu5ee8vk7p
@user-eu5ee8vk7p 2 года назад
Лекс, проведи, пожалуйста, интервью с экспертами в ДДД. Парень молодец, но он совсем не эксперт в данной теме. Из экспертов, например, Женя Пешков, Влад Хориков, Влад Хононов и т.д.
@popidolil5184
@popidolil5184 2 года назад
Согласен. Борис совсем не про DDD
@user-vz2ln5mw2w
@user-vz2ln5mw2w 2 года назад
Влад Хориков норм, смотрел его курс по DDD на pluralsight
@user-rn4cq8bk7f
@user-rn4cq8bk7f 2 года назад
Есть ещё Максим Аршинов
@user-li5wc5ki6n
@user-li5wc5ki6n 2 года назад
Человек целый час рассказывает про 1С и почему-то называет его DDD
@MrAkabrr
@MrAkabrr 2 года назад
Тоже ловил себя на - да он же про 1с рассказывает :)
@dmitryfokin5205
@dmitryfokin5205 2 года назад
вообще не 1С. до 1С надо еще кучу абстракций сделать. и понять, что продукт не лажит в домене холодильника, а лежит в отдельном домене остатков по местам хранения. И нет у домена метода или контекста - взять продукт, или ремонт, а есть два домена `взять продукты из холодильника`, `ремонт холодильника`
@user-ms5pc2vj8u
@user-ms5pc2vj8u Год назад
Вот это контент подъехал! то что нужно!
@i.am.rossalex
@i.am.rossalex Год назад
Весело было :) Классное интервью! Отличный собеседник!
@EugeneMaruschin
@EugeneMaruschin 2 года назад
Ооо, это залет. Scott Wlaschin - Domain Modeling Made Functional - есть DDD в мире функциональщины.
@Legatdestr
@Legatdestr 2 года назад
DDD, как я понимаю, не обязательно про ООП. Стратегическая составляющая вообще про бизнес, аналитику и т.д. а тактические паттерны ничего не мешает и в процедурном стиле реализовать (к примеру)
@Edvard-Aliev
@Edvard-Aliev 2 года назад
НУ наконец то! Что-то годное в плане архитектур! А то надоели эти все ваши ООП и т.д
@user-wr5pu5gi9q
@user-wr5pu5gi9q 2 года назад
Скажите, Борис, а где можно ознакомиться с примерами вашего кода, в котором применен DDD, не обязательно реальный, вполне сгодится чтото вроде пиццерии с холодильниками.
@AndrewAndZz
@AndrewAndZz 2 года назад
Супер! Это просто топ! Я долго не мог въехать в DDD, а этот парень так просто и интересно об этом рассказал, разложил по полочкам! Как по мне, один из самых полезных роликов на канале! Давай ещё в таком же духе!
@dima__rx5fw3rm1n
@dima__rx5fw3rm1n 10 месяцев назад
Хорошо. Это работает с 1 доменом. Допустим, с теми-же лифтами. Что делать, если доменов много и модель лифта необходима в 5 вариациях? Если я сделаю 1 модель для 5 доменов, то она будет устрашающе огромной. Но необходимы данные для лифта всех пяти доменов. Какой может быть стратегия построения моделей/классов в таком случае? Например (наброски): 1. Доставка (комплектация запчастей, квалификация персонала, который допущен к работам); 2. Монтаж/демонтаж (конфигурация места установки, совместимая с лифтом, дополнительные работы по подготовке к лифту); 3. Установка ПО; 4. Сигнализация планового тех обслуживания, система охраны, health check; 5. Система камер видеонаблюдения за лифтом.
@tier2003
@tier2003 2 года назад
Интересный дискус, спасибо! По ТДД есть мысль, что юниты будут выходить на сцену на конечных стадиях разработки сценариев. Так сказать для "шлифовки". А начальные ТДД должны начинаться с интеграционных, получается. Где более одного сервиса-сущности-модели-класса-юнита, захватывая и "инициализацию холодильника" и "выдачу ингредиентов". Таким образом на старте у нас тесты совсем не SRP, но потом "расслаиваются" 🤔
@daranos
@daranos 2 года назад
Полностью согласен с тем что тут обсуждаете по DDD) Инварианты и программирование по контракту пришли от Бертрана Майера Bounded Coxtext DDD = SRP Дяди Боба Рано или поздно начинаешь замечать где и какие принципы заложены)
@user-fh2iz2vk9g
@user-fh2iz2vk9g 2 года назад
Davay Davay Deploy
@goriaev
@goriaev 2 года назад
1:23:00 может дальше будет объясняться. По идее сервис нужен для того, чтобы не привязываться к инфраструктуре. То есть может быть веб контроллер (с гетом), консоль контроллер (с параметрами) и дальше уже на что фантазии хватит
@pseudouser55
@pseudouser55 2 года назад
Супер интересно, Спасибо за интервью
@ii3246
@ii3246 2 года назад
поддерживаю идею приходить в универы послушать лекции! вот это реально было бы круть! хотя бы пусть бы онлайн трансляции сделали, можно платно. огонь тема!
@bb_Jam
@bb_Jam 2 года назад
Уже года как 2 есть трансляции
@Aragnir
@Aragnir 2 года назад
чувак реально любит пиццу
@user-sm6dw2zw8o
@user-sm6dw2zw8o 2 года назад
Берг Джонсон, Деоган, Савано «Безопасно by design» - все основные тезисы применимости DDD, но через призму безопасности кода.
@michaelsloushch3950
@michaelsloushch3950 2 года назад
01:32:35 не согласен с определением Unit Of Work, тут нам чувак рассказывает про кэш) Идея Unit Of Work заключается в том, что когда мы хотим использовать 2 и более репозитория для выполненения одной задачи - они будутиспользовать один контекст подключения к бд, или же конкретные типы в generic репозиториях.
@FrolovDaniil
@FrolovDaniil 2 года назад
И какого же размера модели в DDD, в сколько хоть нибудь сложном проекте? Rich Domain Model очень сложно поддерживать, имхо.
@evgenyamorozov
@evgenyamorozov 2 года назад
Прекрасное интервью! Мне очень понравилось, как Борис рассказал про DDD. Но не могу согласиться с тем, что 15 лет в разработке - это очень много... Всё, что мы используем в разработке сейчас (2021), придумано в 1960х: процедурное, функциональное, ООП, юнит-тестирование и ТДД - придумано и опробовано тогда.
@itbeard
@itbeard 2 года назад
Полностью согласен
@bellmoon2754
@bellmoon2754 2 года назад
Не надо все грести под одну гребёнку, ТДД гораздо позже появился
@ivan_lebedev
@ivan_lebedev 2 года назад
в 2003 DDD примерно появился и TDD примерно тогда же.
@evgenyamorozov
@evgenyamorozov 2 года назад
@@bellmoon2754 "Автор" ТДД Кент Бек сам писал, что он переоткрыл эту идею, а не изобрёл её заново. И он ссылается на идею с перфокартами, которая описывает процесс ТДД.
@evgenyamorozov
@evgenyamorozov 2 года назад
@@ivan_lebedev DDD - это чистое объектно-ориентированное программирование. В нём новым оказывается позабытое старое, когда в 60х программисты знали предметную область и писали программы от неё отталкиваясь. В современном мире программисты абстрактные - они могут запрограммировать всё, но мало в каких предметных областях разбираются. И DDD напоминает, что вообще-то мы моделируем реальный мир и его конкретную часть, используя ООП.
@valiantsinshauchenka4474
@valiantsinshauchenka4474 Год назад
добрый день, скажите плиз а про какие платные видосы из космоса говорит автор упоминая совершенный код? 1:58:58? заранее спасибо
@ionware
@ionware Год назад
Какой ламповый и трушный гость, прям вспомнил молодость )
@firstlast2655
@firstlast2655 2 года назад
спасибо за видео ребят, один вопрос. 1:41:01 тут получается что все равно у нас будет достаточное количество логики в сервисах, немного размазываем логику по слоям. нет ли способов это запихнуть в модели? хз правда в какую в вашем примере, cookRefrigerator или cleanRefrigerator. мб базовый Refrigerator для таких вещей создавать?
@Biankouski
@Biankouski 2 года назад
> тут получается что все равно у нас будет достаточное количество логики в сервисах Все верно заметили. Да, я ошибся в том моменте, и чуть позже (в следующих фразах) постарался исправиться. Из RepairingService нужно вызывать ровно одну строку (без всяких дополнительных проверок - считайте нет логики) `KitchenService->cleanRefrigerator(Identity $id)`. Таким образом мы оказываемся в модуле кухни. Дальше уже в модуле кухни идем по стандартному пути (в зависимости от бизнеса) загружаем модельку (уже кухонную) и вызываем у этой модельки метод с бизнес логикой > мб базовый Refrigerator для таких вещей создавать? Если речь про abstract class то не стоит. Это нарушит разделение Bounded Context.
@hysapod
@hysapod 2 года назад
@@Biankouski Насколько ошибочно делать в модели холодильника вызов модели сыра? Условно "получить сыр, который находится в этом холодильнике".
@Biankouski
@Biankouski 2 года назад
@@hysapod Спросите у Бизнес Овнера. ДДД это про "записать код как в голове у людей, кто платит вам за этот код". Если в каком-то бизнес процессе нужно "получить сыр, который находится в этом холодильнике" - значит нужно получить сыр, который находится в этом холодильнике
@dmitryfokin5205
@dmitryfokin5205 2 года назад
@@hysapod крайне ошибочно. у модели (домена) холодильник не должно быть методов. в правильной вселенной: домен холодильник имеет свойства: режимы охлаждения, объем загрузки. домен сыр(продукт) имеет свойство объем упаковки домен остатков в холодильнике имеет свойства: ссылка на домен холодильник, ссылка на домен продукт, количество занятого объема, количество упаковок продукта домен действия `взять продукт из холодильника` имеет свойства: ссылка на домен холодильника, ссылка на домен продукта, количество упаковок продукта
@DanilaSiniak
@DanilaSiniak 2 года назад
Спасибо за видео! Будет ли видео о Salesforce? Довольно узкое направление, но мне кажется было бы интересно
@itbeard
@itbeard 2 года назад
Когда-то точно будет, раз 1с был) и сап ещё надо бы..
@SquamishMusqueam
@SquamishMusqueam 2 года назад
@@itbeard SAP koniecznie! :)
@DzmitryCybulka
@DzmitryCybulka 2 года назад
@@itbeard дааа Salesforce надо! говорят в Буларуси это самые "зажравшиеся" аутсорсеры, которые легко делают 3х-5х от среднего с девбай по стажу.
@GeorgiiGalechyan
@GeorgiiGalechyan 2 года назад
Шикарное интервью. Я прям чувствую как прокачиваюсь.
@orange-vlcybpd2
@orange-vlcybpd2 2 года назад
Похоже на воплощение Закона Конвея: "Организации проектируют системы, которые копируют структуру коммуникаций в этой организации."
@sleeck
@sleeck 2 года назад
Мне 36 лет я инженер-конструктор на 1:22:00 я подумал "да ну нахрен, я пошел" но все же досмотрел! Правда у меня есть образование программиста, но в 2007-2011 году у меня с этим не задалось! Спасибо за видосы
@andrispikarevskis5513
@andrispikarevskis5513 2 года назад
2:12:58 я знал что будет полезным до самого конца досмотреть :)
@user-uy5ps9us4l
@user-uy5ps9us4l 2 года назад
Борька красава!!! Привет из Минска!)
@eugenefedoryachenko8793
@eugenefedoryachenko8793 2 года назад
Очень крутой гость! Читал 45 татуировок менеджера, и надеюсь что будущему владельцу этой книги она очень понравится и поможет развиться :)
@user-ex9zs4zv3e
@user-ex9zs4zv3e 2 года назад
Борис немного напутал с unit of work (UoW), от того он и сказал что "не знаю почему его так назвали" UoW отвечает за то чтобы изменения сохранялись атомарно, от того он так и называется а то о чём говорил Борис (холодильники с одним id будут одним и тем-же холодильником) -- это Identity map
@Biankouski
@Biankouski 2 года назад
Спасибо!
@ilyaplot
@ilyaplot 2 года назад
Борода, спасибо за видео. Теперь смогу с легкостью Эванса дочитать ) Не хватало общего понимания без кучи деталей, из которых и состоит книга. level up )
@ilyaplot
@ilyaplot 2 года назад
А еще придется рассказать команде, что у нас личинка DDD, но никак не DDD )
@evgenyamorozov
@evgenyamorozov 2 года назад
На мой взгляд, можно читать только bounded context. Сам Эванс через цать лет после первой книги сказал, что это ключевая идея. И если писать вторую редакцию, то именно это будет центральной частью.
@grommaks
@grommaks 2 года назад
@@evgenyamorozov И Вон Вернон написал книгу именно с учетом этих мыслей)
@cloudofgeorge
@cloudofgeorge 2 года назад
Посмотрел, чтобы подтвердить свое мнение. DDD - отличный подход, что-бы быть ближе к бизнесу. Формировать архитектуру и сущности проекта в соответствие с требованиями/задачами бизнеса. Работаю по DDD последние пару лет. Рекомендую попробовать, тем кто еще не использует
@thetraveler7779
@thetraveler7779 2 года назад
*_Надеюсь доживу до того дня, когда увижу в названии нового видоса "Язык ассемблера....."._* *_Ну и по классике вопрос: -Айтиборода, где ассемблер?_* 😂
@UniXoiD69
@UniXoiD69 2 года назад
Обычно под моделью в ддд понимают не класс бизнес объекта, а модель предметной области (та самая имплементация домена).
@UniXoiD69
@UniXoiD69 2 года назад
Крайне рекомендую книгу Вон Вернона
@andyp.6545
@andyp.6545 2 года назад
А знаете, почему канал называется АйТиБорода? Не каждый догадается, но я готов прийти на помощь всем интересующимся! Итак, во-первых, канал об информационных технологиях. А во-вторых, у ведущего есть вполне заметная борода! Всё гениальное просто! Главное быть любопытным, наблюдательным и верить в себя!
@vik_2743
@vik_2743 2 года назад
пора бы переименовывать канал в АйТиПузико
@ItMohican
@ItMohican 2 года назад
Привет! У тебя очень крутые интервью! Очень прошу, может найдешь на интервью человека, который занимается VR? Мне кажется очень интересное направление, многим зайдёт
@AntonGorbachevDev
@AntonGorbachevDev 2 года назад
Плюсую, тоже было бы очень интересно послушать)
@Legatdestr
@Legatdestr 2 года назад
Борис, а можете подсказать? Интернет магазин, продажа услуг. У услуг есть описания-статьи, категории, хеш-тэги. Хеш-тэги считать value object-ом или все-таки entity?
@Biankouski
@Biankouski 2 года назад
Без задачи (цели\бизнеса) сложно сказать. Если задача - это редактировать теги в админке и навешивать по категориям\статьям, то Entity. Все всегда зависит от BoundedContext и решаемой бизнесовой задачи
@Mr43046721
@Mr43046721 2 года назад
Правда - ДДД непонятно, но очень интересно)) спасиб за выпуск!
@spartakusbund1916
@spartakusbund1916 2 года назад
Можно упороться еще дальше и отказаться вобще от сервисов и заюзать CQRS, где команды будут представлять конкретный use-case и больше не будет необходимости в сервисе-проксе к репозиторию.
@amNuke
@amNuke 2 года назад
Рассказал про 1с и предметно-ориентированное программирование)
@alexmcarrow
@alexmcarrow 2 года назад
Верно подмечено что DDD это не "правила", а "пожелания". Помогал знакомому переписывать MVP`шку на новый рельсы - и подсунул ему легкий уровень DDD... Ему было крайне тяжело, всегда хотелось писать сразу в контроллере, но я его тормозил и заставлял все расписывать по доменам, агрегаторам, моделям и т.д. Времени было заложено на "реврайт" 4 месяца, сроки из-за сложности первичного входа растянулись до 5 месяцев. И через неделю после старта новой версии, заказчик прибежал с новой идеей - сколько было счастья в его голосе, когда он рассказывал что в MVP ему пришлось бы треть кода переписывать, а тут сделал новый домен, сформировал агрегатор и настроил роуты - готово. При этом 99.99[9]% гарантии что ничего ранее написанного не сломалось. ---- Полностью согласен с Борисом - главное начать, будет тяжело, будет "ломать" писать каждую новую "фишку" в пяти-семи местах, вместо одного куска кода в контроллере - зато потом начнешь пожимать плоды своих трудов. === Теперь дам ему ссылочку на данное видео - а то ведь даже не знает что это было DDD (хоть и маленькое, но все же) 😀
@artemvolt4600
@artemvolt4600 2 года назад
Александр, а вы могли бы привести пример домена? Например, как ваш колета сделал новый домен, сформировал агрегат? Может от себя что-нибудь посоветуете, с чего начать для изучения этой темы?
@sergeymachel2278
@sergeymachel2278 2 года назад
DDD очень сладко звучит, но я для себя так до конца и не понял как происходит синхронизация работы с базой? (в особенности когда много серверов, юзеров и т.д., ведь модель - это по сути InMemory объект, который зачастую имеет очень много зависимостей, даже на очень простых бизнес моделях) Можно конечно запилить exclusive lock, но в таком случае с перфомансом можно прощаться на веки (даже для небольших моделей, про средние и выше - промолчим). Да и не очень понятно как это всё ложиться на REST API (где мы фокусируемся не на бизнесе модели, а на ресурсах, читай данных). Очень интересен DDD, очень ждал ответа на эти вопросы, но не дождался (как и во многих других выступлениях про DDD)
@Biankouski
@Biankouski 2 года назад
> который зачастую имеет очень много зависимостей, даже на очень простых бизнес моделях) скорее всего у вас нарушается разделение Bounded Context. "зачастую" должно быть, что один агрегат (энтити с зависимостями другими энтитями) для одной задачи. Да, бывает что какая-то лишняя зависимость читается из БД, и при этом в бизнес логике на конкретном запросе не участвует (но и вызов в БД на сохранение не идет благодаря UnitOfWork), но единицы, а не "зачастую". > Можно конечно запилить exclusive lock То-ли я не понял вашу проблему, то-ли вы все проблемы смешали в кучу. Плюсы\минусы работы с транзакциями (и их типами) не отличаются от классической слоеной архитектуры. DDD это про то, как держать сложную бизнеслогику чистой (и от того понятной), в БД вроде как сложностей не добавляется. > Да и не очень понятно как это всё ложиться на REST API (где мы фокусируемся не на бизнесе модели, а на ресурсах, читай данных). 1. Если ваше API отлично ложится на RESTful (бекенд для SinglePageApplication админки) то скорее всего логики там и нет. Чекнул ACL да сохранил. Вам не нужен DDD. 2. Если ваше API маскируется под REST, при этом, например, за `PATCH /order/25 {orderStatus:processed}` скрывается туча логики, типо - заказ был в состоянии "в корзине", - теперь прилетело состояние "процессед" - значит это пользователь нажал кнопку "checkout" на корзине, - и т.д. то я могу предложить 3 опции (не зная всей вашей доменной области это будут "так-себе" советы, но попробую, в порядке приоритета): - для простых (crud) задач оставить RESTful и без ДДД, для задач "посложнее" обычный REST `POST /order/25/process` + DDD логика - вам не нужен RESTful вообще. Все технологии (и ДДД и Rest и PHP и Java) должны использоваться для упрощения жизни. Не упрощает - выбрасывайте. - добавлять какую-то прослойку\роутер маппинга RESTful запроса на ресурс на бизнес сервис. Условно пример выше " если пришел PATH с полем orderStatus значит CheckoutService->processOrder(25)" - RESTful бизнес моделей это "и есть ваш домен". Принять это как факт, и .. тогда вызывать сервисы вроде "OrderCrudService->patch(25)" ... выглядит, как первая опция самая адекватная :)
@sergeymachel2278
@sergeymachel2278 2 года назад
@@Biankouski спасибо большое, по REST API согласен, скорее его нужно использовать для внешних интеграций, в дополнение к DDD. По поводу работы с базой я имел ввиду следующее: вот есть холодильник, чтобы забрать продукт нужно чтобы его количество было больше нуля. Но мы ведь работаем со снэпшотом холодильника в какой то момент времени и к моменту сохранения его состояния в базу - кто то другой его уже проапдэйтит (забрав все продукты) и наша операция сохранения упадёт (если написана верно). Как обычно подобные кейсы хэндляться?
@Zlobusz
@Zlobusz 2 года назад
@@sergeymachel2278 по моему это головная боль менеджера модели, а не самой модели. Менеджер модели маппит данные из БД на модель. Пока вы что-то со своей моделью делали, кто-то изменил состояние данных в БД, теперь, перед обновлением этой записи, ModelManager должен об этом позаботится.
@sergeymachel2278
@sergeymachel2278 2 года назад
@@Zlobusz Окей, мы взяли снэпшот холодильника, отобразили на юае. Юзер видит что нужные ему продукты в наличие, накидывает рецепт, сабмитает - и получает обратно "сори, на самом деле ваши продукту уже утащили". Ведь наш ModelManager будет заботиться о синхронизации перед непосредственным сохранением в базу (когда юзер уже сделал много стэпов). Это классический кейс конкуренции за общий ресурс (в нашем случае холодильник). Единственный выход что я вижу - это временное "бронирование" продукта, т.е. при любом обновлении модели (которое могут обновить другие клиенты) нужно делать колл в базу и лочить какой-то ресурс на определённый промежуток времени. Я вот всё хочу попробовать в продакшене, но боюсь что на нашем энтэрпрайзе это рано или поздно вылезет боком (с ростом сложности модели(ей) и агрегаций)
@alzasr
@alzasr 2 года назад
Спасибо! Ещё один случай, когда не подойдёт. Если сайдэффект должен быть вызван до оеончания бизнеслогики. Например сохранять статус операции.
@vdawork
@vdawork 2 года назад
оч крутой ролик, но рекомендую промотать половину)
@sergioabromovich4770
@sergioabromovich4770 2 года назад
Народ, очень важный вопрос. Есть смысл изучать программирование, если я в принципе понимаю теорию и понимаю будущую логику( которую предстоит написать) , но не могу ничего написать. начал изучать программирования 2 месяца назад и пока очень тяжело писать код ( хотя задачки очень детские и простые). Я зык C#. С математикой очень туго у меня.
@AlexS-gn9tq
@AlexS-gn9tq 2 года назад
Смысл, конечно есть, но в долгую имхо ветка Product Owner -> Product Manager в сочетании с английским уровня от C1 намного более перспективна.
@dmitryivanov6812
@dmitryivanov6812 2 года назад
довольно давно пишу на пхп, но такое чувство, что разговор был про что-то другое... ;) очень интересно, но мало что понятно... в плане практического применения. нужно будет на досуге покопать тему...
@oeaoo
@oeaoo Год назад
Здорово.
@NofaceAndrew
@NofaceAndrew Год назад
Непонятно. в случае ремонта холодильника нужно вызвать на уровне контроллера пустойХолодильник = кухонныйСервис.очистиХолодильник(), затем сервисРемонта.произведиРемонт(пустойХолодильник). Получается, что контроллер должен знать что перед ремонтом его нужно очистить, а это разве не часть бизнес-логики?
@grommaks
@grommaks 2 года назад
Вон Вернон - Красная книга по DDD в 2013+ году написал более свежую книгу с пояснениями) рекомендую
@Alexander-dg5id
@Alexander-dg5id 13 дней назад
Ох, все на самом деле куда сложнее, чем тут рассказывается))
@user-ip2uh5tz8v
@user-ip2uh5tz8v Год назад
На все 100% согласен с утверждением "У меня было программирование до DDD и после". Я всем знакомым говорю так: "Я как разработчик до DDD и после это два разных разработчика". Эти принципы кардинально поменяли мой взгляд на программирование.
@extense1337
@extense1337 2 года назад
История со стеклянной дверью и кофе очень знакома))
@user-kl2nv3ct7u
@user-kl2nv3ct7u 2 года назад
респект за PHP
@nbes6328
@nbes6328 2 года назад
Я не могу отделаться от мысли, что всё это сводится к идеям из Grokking Simplicity, точнее к трём вещам: 1. Данные (Data): факты, которые могут использоваться как угодно. 2. Функции-расчёты (Calculations): когда на любой вход, у нас одинаковый выход. В видео это называли без side-effect'ов. 3. Функции-Действия (Actions): что угодно зависящее от того, когда было вызвано или сколько раз. Любое действие "заражает" всё что выше. В примерах это было ActiveRecord, вызов функции now () и т.п.
@alexeylozenko6093
@alexeylozenko6093 2 года назад
Про экзамен в лицей, и единицы измерения, уже там Борис использовал приведение типов ;).
@ruflection
@ruflection 7 месяцев назад
TDD подход ваш очень хорош, мне тоже не зашёл красный зелёный красный
@alexanderobuhov8231
@alexanderobuhov8231 2 года назад
Говорим Беларусь, подразумеваем холодильники, говорим холодильники, подразумеваем Беларусь. Никак не могу избавиться от этой ассоциации.
@user-vz2ln5mw2w
@user-vz2ln5mw2w 2 года назад
Вопрос Лексу , а ты в своей практике с Unit of work разве не работал ? Исходя из вопросов сложилось такое впечатление, что ты первый раз слышишь(либо специально так вопросы задаешь)? Просто я сам работаю с .net (.NET core, Web API, .NET 6) на бэке. У тебя уровень явно лучше моего. Почти на всех проектах работал с Unit of Work .
@itbeard
@itbeard 2 года назад
Ты все верно понял :)
@xbsxbs22
@xbsxbs22 2 года назад
В зависимости от реализации, конечно, но MVC может провоцировать technologically partitioned структуру проекта, в свою очередь, DDD провоцирует следование в сторону domain partitioned структуризации ваших модулей.
@user-no1ig1er9s
@user-no1ig1er9s 2 года назад
А разве DDD не занимает только М из MVC? Правда, в таких проектах чаще 4 слоя. Слой предметной области, слой инфраструктурной области, сервисный слой, слой приложения.
@xbsxbs22
@xbsxbs22 2 года назад
@@user-no1ig1er9s Люди по разному понимают DDD, у кого-то действительно доменный дизайн это только часть модели из MVC. У других MVC используется внутри закрытых контекстов. Что стоит понимать под МVC? MVC паттерн может быть использован в бизнес логике домена для своих внутренних целей разделения контроля за производство отображений. Третьи понимают под DDD методологию, придуманную проблемными аналитиками, чтобы они поимели ощущение причастности к разработке.
@Legatdestr
@Legatdestr 2 года назад
Я ж правильно понимаю, холодильник для ремонта и холодильник в контексте готовки физически, если говорить про базу, будут храниться в РАЗНЫХ таблицах, базах, хранилищах и т.д. А объединять их будет Identity, например, поле externalId?
@Biankouski
@Biankouski 2 года назад
В 99% случаев - да. Готовые датамапперы не позволят сделать наоборот. Но надо понимать, что DDD это про бизнесс, а не про хранение данных. Например, в виде исключения (а точнее, если Вы взвесили все плюсы и минусы) можно сделать и так: Вы пилите легас, и у вас уже случилась одна жирная таблица, содержащая два различных BoundedContext, и разделить данные сложно, то можете попробовать запилить такое сохранение сущностей (такой UnitOfWork), чтобы разные бизнес сущности (Entity\Aggergates) сохранялись в одну табличку.
@RodionAndreev-gz1cy
@RodionAndreev-gz1cy 2 года назад
В одной. Дтошки разные
@aliaksandrhubanau4933
@aliaksandrhubanau4933 2 года назад
Красавчик! Интервью гонь!
@Legatdestr
@Legatdestr 2 года назад
По поводу ActiveRecord. Да, нарушение SRP и т.д. Но, почему бы не использовать все таки ее на уровне инфраструктуры. В тех же репозиториях, к примеру? Удобно же )
@Biankouski
@Biankouski 2 года назад
Иметь plain объект описывающий одну строку из таблички только с одним методом SAVE - да, пожалуйста, используйте. Но фаулеровский "ActiveRecord" это смесь save() и других бизнесовых методов. Это легко на старте, но через пару недель за один запрос на сервер появляется несколько вызовов save() и вот уже и перфоманс проседает и тесты влом писать, ибо не сценарий, а полотно моков и тд :)
@popidolil5184
@popidolil5184 2 года назад
@@Biankouski Упакуй весь бизнес-процесс над объектом в одном хранимку на сервере, получишь один save
@user-kq8nk5vj5r
@user-kq8nk5vj5r 2 года назад
А проектирование и разработку на 1С-ке, получается, можно назвать DDD? Предметметно-ориентированный подход этоже оно и есть, или всё не так?
@dmitryfokin5205
@dmitryfokin5205 2 года назад
ну концепции ддд до 1С не дорасти, т.к. есть священое писание ддд и развития не предполагает. мешает наложение ооп. то что они считают методом модели (домена) является само по себе моделью (доменом)
@RodionAndreev-gz1cy
@RodionAndreev-gz1cy 2 года назад
Наверное моё ИМХО, но про ДДД без вайтборда рассказывать нельзя))) Мало внимания было уделено immutable. И объяснение UoW мне, как шарписту, совсем не понравилось. В целом, гут, чел без заготовленного текста рассказал сложную тему. Но, ведь ДДД не сложный, если рассказывать, не прыгая с место на место ;)
@Biankouski
@Biankouski 2 года назад
О да, спасибо за понимание! Я пытался убедить лекса дать доску, но сошлись что "формат не тот". А вот то, что он "не сложный" зависит от прогресса :)
@user-tf6cn7vd2m
@user-tf6cn7vd2m 2 года назад
Даня Поперечный отжигает про ДДД😀
Далее
small vs big hoop #tiktok
00:12
Просмотров 3,3 млн
DDD (Domain Driven Design) | Symfony PHP
30:52
Просмотров 9 тыс.
Максим Морев - DDD в действии
51:54
ВИPУC НА МАКБУК
0:21
Просмотров 29 тыс.
WWDC 2024 - June 10 | Apple
1:43:37
Просмотров 10 млн