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

Поділитися
Вставка
  • Опубліковано 10 чер 2024
  • Станьте универсальным разработчиком с помощью курса Нетологии «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 Послешоу
    МОИ КОНТАКТЫ:
    - UA-cam: / itbeard
    - Telegram: t.me/itbeard
    - Instagram: / itbeard
    - Twitter: / iamitbeard
    - Discord: / discord
    - Сайт: itbeard.com
    #айтиборода #ityoutubersru #ddd
  • Наука та технологія

КОМЕНТАРІ • 472

  • @itbeard
    @itbeard  2 роки тому +20

    НАВИГАЦИЯ:
    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 роки тому +2

      Ну какое нафиг Symphony?
      Symfony, SYMFONYYYYYYYYYYYYYYYYYYYY

    • @itbeard
      @itbeard  2 роки тому +6

      @@devracoon да всем похер на пыху)

    • @devracoon
      @devracoon 2 роки тому +1

      @@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 роки тому +629

    А Поперечный в Айтишечке оказывается шарит

    • @vitaliinnest
      @vitaliinnest 2 роки тому +7

      ахахах, весь выпуск думал, кого же он мне напоминает

    • @ostaprobin1189
      @ostaprobin1189 2 роки тому +13

      Зашёл посмотреть на такой комментарий

    • @adambolotov3153
      @adambolotov3153 2 роки тому +16

      Поперечный XL

    • @andreymorozov5256
      @andreymorozov5256 2 роки тому

      Пригожин отрастил бороду и тоже начал вникать

    • @murtazina_raisa
      @murtazina_raisa 11 місяців тому +1

      Чуть чуть похож реально

  • @sergeydanilov4568
    @sergeydanilov4568 2 роки тому +57

    Было бы круто, если бы такие вещи обсуждались с доской, на которой можно порисовать свои мысли)))

  • @piemka
    @piemka 2 роки тому +78

    Так я ДДД. Каждый день делаю запросы в холодильник!

    • @Biankouski
      @Biankouski 2 роки тому +5

    • @xbsxbs22
      @xbsxbs22 2 роки тому

      У него чёрный пояс по гастрономическим метафорам

    • @smookkee1
      @smookkee1 2 роки тому

      Судя по пузику Лекса, он тоже не отстает

    • @piemka
      @piemka 2 роки тому

      @@smookkee1 самое лучшее пузико на этой планете!

    • @KaputTV
      @KaputTV 2 роки тому +2

      Ты Service)

  • @k.kolomeitsev
    @k.kolomeitsev 2 роки тому +60

    Спасибо, интеревью интересное, спикер интересный, но объяснение хромает
    56:00 про пиццерию пример - есть пиццерия, у неё есть разные "отделы": кухня, продажи, склад - это домены.
    Когда ты реализуешь домен кухни, ты должен иметь "общий язык" с поварами, они говорят пицца - ты понимаешь что это тесто с сыром, томатной пастой и далее по списку.
    Пицца для продажников - это другое, для них пицца - это готовое кулинарное изделие, в коробке, готовое к транспортировке, соответственно продажи это другой домен и там у Вас свой "общий язык".
    DTO нужны чтобы допустим перенести пиццу из домена "кухни" в домен "продаж", скорее всего с участием домена "склада". Со склада Вам нужна коробка, с кухни само изделие, а затем в продажах Вы вешаете цену.

    • @user-zb9fo7qx1x
      @user-zb9fo7qx1x Рік тому +10

      вот вы объяснили лучше, чем спикер за все видео

    • @Mbslr
      @Mbslr Рік тому +1

      Вот. Сразу чувствуется структурное мышление

    • @timur43378
      @timur43378 10 місяців тому

      Домен - это вся пиццерия. Отделы - это bounded context.

    • @k.kolomeitsev
      @k.kolomeitsev 10 місяців тому +1

      @@timur43378 bounded context это бухгалтерия, рецепты, табель, меню. Для начала в терминах разберись

  • @Yarkendar
    @Yarkendar 2 роки тому +114

    Люблю программистов из деревни - умеют простыми и понятными словами объяснять сложные вещи

    • @alexeylozenko6093
      @alexeylozenko6093 2 роки тому +4

      Это индикатор понимания, причина почему полезно не только учится но и учить.

  • @danku1013
    @danku1013 2 роки тому +44

    Всегда забавляет то, как люди поясняют сложную тему на казалось бы простом примере, но из-за простого примера(очевидно не подходящего) становиться всегда ещё только хуже

    • @valeravalera6201
      @valeravalera6201 2 роки тому +5

      А все потому что эта сложная тема еле натягивается даже на простой пример. А на реальном сложном бизнесе придется в эти доменные сущности инжектить по 50 сервисов со всеми вытекающими проблемами с производительностью общения с базой.

    • @danku1013
      @danku1013 2 роки тому +5

      @@valeravalera6201 поверьте, когда идут реальные примеры, все в разы проще, это в 100 раз проще понять когда у тебя просто микросервисы есть, а не какой-то монолит с одинаковым классами "Холодильник" которые лежат в разных модулях/неймпейсах.
      Любая ссылка про ДДД в гугле, намного понятнее это все поясняет, уверен гость понимает о чем говорит, но выбор "Холодильник + Монолит" объективно неудачный.

  • @AlexMedinsky
    @AlexMedinsky 2 роки тому +15

    Открываешь холодильник, а оттуда exception вылетает. Люблю DDD!

    • @vesh95
      @vesh95 2 роки тому

      Call to a member function getKolbasa() on null

    • @sergeyyakushenok8092
      @sergeyyakushenok8092 Місяць тому

      @@vesh95 В голос 🤣🤣🤣

  • @itCODE
    @itCODE 2 роки тому +42

    Лекс, классный и позитивный выпуск! Спасибо вашей команде!
    Нравятся твои видео, не напряжные и хорошо поставленные, хорошая атмосфера без всякого пафоса.
    Всем хорошего просмотра)
    Лекс, майка - огонь!)

    • @itbeard
      @itbeard  2 роки тому +2

      спасибо!

  • @leonid_konoplin
    @leonid_konoplin 2 роки тому +26

    в тему выпуск! Книгу можно еще почитать - Вернон В. - Реализация методов предметно-ориентированного проектирования

    • @okke00
      @okke00 2 роки тому +1

      Ее лучше на английском читать, перевод там ужасен

  • @ruslanshikhaliev9341
    @ruslanshikhaliev9341 6 місяців тому +1

    Лекс и Борис, ну это пушка, посмотрел на одном дыхании))
    Борис, не задумывался над собственным каналом?

  • @eugenesidelnyk4600
    @eugenesidelnyk4600 2 роки тому +19

    Наверное самый позитивный гость из всех, кто были на этом канале. Ждём ещё Макса True

    • @goriaev
      @goriaev 2 роки тому

      Ещё был про с# и релокейт в Чехию позитивный гость)

  • @andreysakharov6210
    @andreysakharov6210 2 роки тому +13

    По поводу ответов на рандомные вопросы.
    Как сказал Егор Малкевич (с которым есть охрененное интервью на этом канале)
    На вопрос, какой язык программирования учить в предстоящем году, я наконец то знаю правильный ответ - английский!

  • @user-ur4ev7vl6c
    @user-ur4ev7vl6c 2 роки тому +5

    Такое ощущение что когда строил большой проект - мыслил 50/50 моделями как в DDD; Но вот на тесты не обращал внимания совсем :(; Но теперь захотелось больше!); Вы мои герои 💖💖💖

  • @InoksFiy
    @InoksFiy 2 роки тому +3

    Это вышка! Спасибо за выпуск, я как раз изучаю DDD. Борис очень помог понять простыми словами

  • @user-iu7zo9gs7x
    @user-iu7zo9gs7x 2 роки тому

    Ого! Огромное спасибо!!! Это архиполезный выпуск в разрезе ВЗАИМО понимания конечного заказчика и конечного исполнителя, которые, как зачастую бывает, живут в разных мирах! Класс!!!

  • @kinvain
    @kinvain 2 роки тому +14

    2:03:35 S. в single responsible это не про то что один класс\сущность - одна задача. Класс отвечает принципу единой ответственности если есть только одна причина для его изменений.
    Именно поэтому кухонный холодильник не может иметь метод взятьИнгридиенты и отремонтировать. Потому что тогда класс придется менять если меняется логика получения ингредиентов или логика ремонта.

    • @PolishchukMaxim
      @PolishchukMaxim 2 роки тому +1

      "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 роки тому +2

      собственно Ваш ответ и иллюстрирует озвученную проблему с S - можно бесконечно спорить отвечает ли класс этому принципу, и при этом каждая из сторон спора будет по-своему права. "Одна причина для изменений" согласно теории - правильное определение, только в реальности, применительно к реальному классу написанному без какого-либо DDD и с соблюдением священного SOLIDа это можно трактовать по-разному. Кончается спор на code review как правило на том, что одна из сторон просто понимает, что продуктивнее будет просто перестать тратить время на бесполезный спор, согласиться с собеседником и идти дальше.

    • @kinvain
      @kinvain 2 роки тому +2

      @@AlexS-gn9tq алюминь, брат. Постоянно с этим сталкиваюсь. И в плане споров это вообще топ. Самая боль когда приходится доказывать такому же синьёру-сениору что пихать валидацию, нотификацию, сбору объекта, логирование и созание платежа в сервис CreatePayment не есть гуд. Потому что с его точки зрения все эти процессы часть одной бизнес-логики - созания платежа.
      По своему опыту заметил что обычно таких вопросов будет меньше если начинать писать сервис с тестов, интефейсов и по принципу минимальной необходимости. То есть, если нужен валидный объект в сервисе то ты можешь либо сразу передать его (или получить) в сервис. И тогда никакой валидации не будет в принципе. Либо писать метод (возможно приватный) который будет собирать этот обьект и не дай бог там будет логика и значит тратишь время на тест и тут же можешь себя отрефлексировать что возможно это ответственность другого сервиса.

    • @artemvolt4600
      @artemvolt4600 2 роки тому +1

      @@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 реквесты. Такого, конечно, не будет, но смысл в том что бы вы могли написать свервис не думая о фреймворке и базе,

  • @malferov
    @malferov 2 роки тому +7

    О, Поперечный стал хорошо питаться.

  • @agrokormby4308
    @agrokormby4308 2 роки тому +7

    Аааааа, Алексей, что ты делаешь?!!!! :)
    Последнее время каждый новый гость, это просто праздник для сердца и ушей!
    Столько дел в воскресенье не переделаю из за твоего выпуска :)
    Спасибо огромное!!!

  • @kensaitakeso
    @kensaitakeso 2 роки тому +11

    1:08:55. Gherkin, это язык. А cucumber это фреймворк который использует этот язык

  • @dmitryn.4506
    @dmitryn.4506 2 роки тому +18

    Интересно! Здесь суть концепции даже не в ПО, а в организации работы с заказчиком и бизнесом...

    • @ilyaplot
      @ilyaplot 2 роки тому +3

      Так в разработке ПО большая доля работы заключается в правильной комминикации с заказчиком. DDD просто упрощает жизнь разработчикам на больших длительных проектах с изменяющимися условиями. Для стартапов очень хорошо подходит.

  • @danylopavenko1691
    @danylopavenko1691 2 роки тому +1

    Я из Mobile разработки, мне было очень интересно послушать! В реальности TDD один раз за 8 лет использовали. Тогда давно не понял, а это прям тема. Спасибо за выпуск!

  • @augustine582
    @augustine582 2 роки тому +4

    Рад что в РБ есть бурления на тему DDD, я тоже из РБ и тоже интересуюсь этой темой, было бы неплохо замутить какое нить комьюнити )

  • @user-li5wc5ki6n
    @user-li5wc5ki6n 2 роки тому +19

    Человек целый час рассказывает про 1С и почему-то называет его DDD

    • @MrAkabrr
      @MrAkabrr 2 роки тому +3

      Тоже ловил себя на - да он же про 1с рассказывает :)

    • @dmitryfokin5205
      @dmitryfokin5205 2 роки тому

      вообще не 1С. до 1С надо еще кучу абстракций сделать. и понять, что продукт не лажит в домене холодильника, а лежит в отдельном домене остатков по местам хранения. И нет у домена метода или контекста - взять продукт, или ремонт, а есть два домена `взять продукты из холодильника`, `ремонт холодильника`

  • @kurasaored2775
    @kurasaored2775 2 роки тому +3

    Офигенный гость!! Очень приятно слушать

  • @Edvard-Aliev
    @Edvard-Aliev 2 роки тому +14

    НУ наконец то! Что-то годное в плане архитектур! А то надоели эти все ваши ООП и т.д

  • @jaskier6295
    @jaskier6295 Рік тому

    Лучше видео по ддд что я видел в жизни. Респектище гостю и автору

  • @pandao_12309
    @pandao_12309 2 роки тому

    Как раз на новом проекте столкнулся с ДДД, сейчас в процессе изучения этого подхода, видос вышел прям в тему и вовремя для меня) спасибо!

  • @ionware
    @ionware Рік тому +1

    Какой ламповый и трушный гость, прям вспомнил молодость )

  • @user-ip2uh5tz8v
    @user-ip2uh5tz8v Рік тому +3

    К вопросу "Зачем нужен сервис, почему бы сразу с контроллера не управлять моделью?". Точек входа для выполнения одного и того же действия может быть несколько. Это может быть HTTP запрос, крон задача или ивент на который подписано приложение. Здесь очень важно, чтобы все эти точки входа оперировали моделью одинаково. То есть они должны вызывать один и тот же сервис, часто ещё применяют термин "use case". Отсюда получается, что задача контроллера и слушателя, который подписан на ивент, это преобразовать входящие параметры в параметры сервиса и вызвать его. Так сохраняется общая логика оперирования моделью. Именно по этому, такие сервисы ещё называют операционными и они размещаются в операционном слое (Application layer).

    • @user-ip2uh5tz8v
      @user-ip2uh5tz8v Рік тому

      Досмотрел до этой точки ua-cam.com/video/rkQ3-T82pkU/v-deo.html , главную ответственность сервиса упомянули.

  • @user-eu5ee8vk7p
    @user-eu5ee8vk7p 2 роки тому +22

    Лекс, проведи, пожалуйста, интервью с экспертами в ДДД. Парень молодец, но он совсем не эксперт в данной теме. Из экспертов, например, Женя Пешков, Влад Хориков, Влад Хононов и т.д.

    • @popidolil5184
      @popidolil5184 2 роки тому +1

      Согласен. Борис совсем не про DDD

    • @user-vz2ln5mw2w
      @user-vz2ln5mw2w 2 роки тому

      Влад Хориков норм, смотрел его курс по DDD на pluralsight

    • @user-rn4cq8bk7f
      @user-rn4cq8bk7f 2 роки тому

      Есть ещё Максим Аршинов

  • @akitmentorconsultant4696
    @akitmentorconsultant4696 2 роки тому +5

    Зачем нужен сервис в 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 роки тому +3

    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.

  • @igolka97
    @igolka97 2 роки тому +2

    Несколько месяцев назад начал погружаться в DDD. Как же знакомы все эти чувства когда впервые написал модель с поведением!

  • @dpelipen
    @dpelipen 2 роки тому +12

    Лекс, привет! Очень классный выпуск). Как тебе идея в следующий раз принести планшет или ноут со стилусом, чтобы гость рисовал схемки или схематично писал код для большего понимания и удержания в голове всех мелочей? И вывести все это где-нибудь на экран.

    • @itbeard
      @itbeard  2 роки тому +6

      Ку! Идея гуд, думали доску поставить. Но! Монтаж тогда будет совсем не очень, плюс ребята, которые в аудио слушают очень расстроится, а таких много.

    • @itbeard
      @itbeard  2 роки тому +2

      Так что для старта пойдет, а дальше уже можно искать целенаправленно курсы😊

  • @user-wr5pu5gi9q
    @user-wr5pu5gi9q 2 роки тому +1

    Скажите, Борис, а где можно ознакомиться с примерами вашего кода, в котором применен DDD, не обязательно реальный, вполне сгодится чтото вроде пиццерии с холодильниками.

  • @verikusredis3384
    @verikusredis3384 2 роки тому +1

    Классный и такой позитивный гость! Интересно про пиццу рассказывает.

  • @EugeneMaruschin
    @EugeneMaruschin 2 роки тому +9

    Ооо, это залет. Scott Wlaschin - Domain Modeling Made Functional - есть DDD в мире функциональщины.

    • @Legatdestr
      @Legatdestr 2 роки тому +2

      DDD, как я понимаю, не обязательно про ООП. Стратегическая составляющая вообще про бизнес, аналитику и т.д. а тактические паттерны ничего не мешает и в процедурном стиле реализовать (к примеру)

  • @FrolovDaniil
    @FrolovDaniil 2 роки тому +2

    И какого же размера модели в DDD, в сколько хоть нибудь сложном проекте? Rich Domain Model очень сложно поддерживать, имхо.

  • @i.am.rossalex
    @i.am.rossalex Рік тому

    Весело было :) Классное интервью! Отличный собеседник!

  • @nickfischer7374
    @nickfischer7374 2 роки тому

    Лекс, привет! Сложно кратко описать словами, как мне нравятся твои интервью. Сколько уже посмотрел, и ни одного неинтересного собеседника встретил. Особо радует твой простой и свойский, "без понтов", подход ко всему.
    Лично я сейчас занят изменением своих подходов к работе, и твои видео о DDD в частности и о новых технологиях вцелом очень помогают мне понять, где мои рассуждения верны, а где нет. Особо приятно замечать тот же, что и у самого себя, блеск в глазах собеседников, когда они рассказывают о своих первых шагах в IT. Удивительно, мой путь и путь твоих гостей во многом похожи.
    В общем, так держать!

    • @itbeard
      @itbeard  2 роки тому

      Спасибо и удачи!))

  • @user-fh2iz2vk9g
    @user-fh2iz2vk9g 2 роки тому +8

    Davay Davay Deploy

  • @user-ms5pc2vj8u
    @user-ms5pc2vj8u Рік тому

    Вот это контент подъехал! то что нужно!

  • @andreyf3975
    @andreyf3975 Рік тому

    Пушка. Соскучился по твоим интервью, и тема как раз актуальная. У меня сейчас процесс трансформации в DDD как раз :D

  • @Aragnir
    @Aragnir 2 роки тому +4

    чувак реально любит пиццу

  • @orange-vlcybpd2
    @orange-vlcybpd2 2 роки тому +3

    Похоже на воплощение Закона Конвея: "Организации проектируют системы, которые копируют структуру коммуникаций в этой организации."

  • @dima__rx5fw3rm1n
    @dima__rx5fw3rm1n 10 місяців тому +2

    Хорошо. Это работает с 1 доменом. Допустим, с теми-же лифтами. Что делать, если доменов много и модель лифта необходима в 5 вариациях?
    Если я сделаю 1 модель для 5 доменов, то она будет устрашающе огромной. Но необходимы данные для лифта всех пяти доменов. Какой может быть стратегия построения моделей/классов в таком случае?
    Например (наброски):
    1. Доставка (комплектация запчастей, квалификация персонала, который допущен к работам);
    2. Монтаж/демонтаж (конфигурация места установки, совместимая с лифтом, дополнительные работы по подготовке к лифту);
    3. Установка ПО;
    4. Сигнализация планового тех обслуживания, система охраны, health check;
    5. Система камер видеонаблюдения за лифтом.

  • @AndrewAndZz
    @AndrewAndZz 2 роки тому +7

    Супер! Это просто топ! Я долго не мог въехать в DDD, а этот парень так просто и интересно об этом рассказал, разложил по полочкам!
    Как по мне, один из самых полезных роликов на канале! Давай ещё в таком же духе!

  • @valiantsinshauchenka4474
    @valiantsinshauchenka4474 Рік тому +1

    добрый день, скажите плиз а про какие платные видосы из космоса говорит автор упоминая совершенный код? 1:58:58? заранее спасибо

  • @GeorgiiGalechyan
    @GeorgiiGalechyan 2 роки тому

    Шикарное интервью. Я прям чувствую как прокачиваюсь.

  • @firstlast2655
    @firstlast2655 2 роки тому +1

    спасибо за видео ребят, один вопрос.
    1:41:01 тут получается что все равно у нас будет достаточное количество логики в сервисах, немного размазываем логику по слоям.
    нет ли способов это запихнуть в модели? хз правда в какую в вашем примере, cookRefrigerator или cleanRefrigerator. мб базовый Refrigerator для таких вещей создавать?

    • @Biankouski
      @Biankouski 2 роки тому +1

      > тут получается что все равно у нас будет достаточное количество логики в сервисах
      Все верно заметили. Да, я ошибся в том моменте, и чуть позже (в следующих фразах) постарался исправиться.
      Из RepairingService нужно вызывать ровно одну строку (без всяких дополнительных проверок - считайте нет логики) `KitchenService->cleanRefrigerator(Identity $id)`.
      Таким образом мы оказываемся в модуле кухни. Дальше уже в модуле кухни идем по стандартному пути (в зависимости от бизнеса) загружаем модельку (уже кухонную) и вызываем у этой модельки метод с бизнес логикой
      > мб базовый Refrigerator для таких вещей создавать?
      Если речь про abstract class то не стоит. Это нарушит разделение Bounded Context.

    • @hysapod
      @hysapod 2 роки тому

      @@Biankouski Насколько ошибочно делать в модели холодильника вызов модели сыра? Условно "получить сыр, который находится в этом холодильнике".

    • @Biankouski
      @Biankouski 2 роки тому +1

      @@hysapod Спросите у Бизнес Овнера. ДДД это про "записать код как в голове у людей, кто платит вам за этот код". Если в каком-то бизнес процессе нужно "получить сыр, который находится в этом холодильнике" - значит нужно получить сыр, который находится в этом холодильнике

    • @dmitryfokin5205
      @dmitryfokin5205 2 роки тому +1

      @@hysapod крайне ошибочно. у модели (домена) холодильник не должно быть методов.
      в правильной вселенной:
      домен холодильник имеет свойства: режимы охлаждения, объем загрузки.
      домен сыр(продукт) имеет свойство объем упаковки
      домен остатков в холодильнике имеет свойства: ссылка на домен холодильник, ссылка на домен продукт, количество занятого объема, количество упаковок продукта
      домен действия `взять продукт из холодильника` имеет свойства: ссылка на домен холодильника, ссылка на домен продукта, количество упаковок продукта

  • @ii3246
    @ii3246 2 роки тому

    поддерживаю идею приходить в универы послушать лекции! вот это реально было бы круть! хотя бы пусть бы онлайн трансляции сделали, можно платно. огонь тема!

    • @bb_Jam
      @bb_Jam 2 роки тому

      Уже года как 2 есть трансляции

  • @DanilaSiniak
    @DanilaSiniak 2 роки тому +4

    Спасибо за видео!
    Будет ли видео о Salesforce? Довольно узкое направление, но мне кажется было бы интересно

    • @itbeard
      @itbeard  2 роки тому +2

      Когда-то точно будет, раз 1с был) и сап ещё надо бы..

    • @SquamishMusqueam
      @SquamishMusqueam 2 роки тому

      @@itbeard SAP koniecznie! :)

    • @DzmitryCybulka
      @DzmitryCybulka 2 роки тому

      @@itbeard дааа Salesforce надо! говорят в Буларуси это самые "зажравшиеся" аутсорсеры, которые легко делают 3х-5х от среднего с девбай по стажу.

  • @andrispikarevskis5513
    @andrispikarevskis5513 2 роки тому +4

    2:12:58 я знал что будет полезным до самого конца досмотреть :)

  • @user-uy5ps9us4l
    @user-uy5ps9us4l 2 роки тому +3

    Борька красава!!! Привет из Минска!)

  • @Alexander-dg5id
    @Alexander-dg5id 4 дні тому

    Ох, все на самом деле куда сложнее, чем тут рассказывается))

  • @andyp.6545
    @andyp.6545 2 роки тому +1

    А знаете, почему канал называется АйТиБорода? Не каждый догадается, но я готов прийти на помощь всем интересующимся! Итак, во-первых, канал об информационных технологиях. А во-вторых, у ведущего есть вполне заметная борода! Всё гениальное просто! Главное быть любопытным, наблюдательным и верить в себя!

    • @vik_2743
      @vik_2743 2 роки тому

      пора бы переименовывать канал в АйТиПузико

  • @pseudouser55
    @pseudouser55 2 роки тому

    Супер интересно, Спасибо за интервью

  • @michaelsloushch3950
    @michaelsloushch3950 2 роки тому +6

    01:32:35 не согласен с определением Unit Of Work, тут нам чувак рассказывает про кэш) Идея Unit Of Work заключается в том, что когда мы хотим использовать 2 и более репозитория для выполненения одной задачи - они будутиспользовать один контекст подключения к бд, или же конкретные типы в generic репозиториях.

  • @user-sm6dw2zw8o
    @user-sm6dw2zw8o 2 роки тому +1

    Берг Джонсон, Деоган, Савано «Безопасно by design» - все основные тезисы применимости DDD, но через призму безопасности кода.

  • @daranos
    @daranos 2 роки тому

    Полностью согласен с тем что тут обсуждаете по DDD)
    Инварианты и программирование по контракту пришли от Бертрана Майера
    Bounded Coxtext DDD = SRP Дяди Боба
    Рано или поздно начинаешь замечать где и какие принципы заложены)

  • @tier2003
    @tier2003 2 роки тому

    Интересный дискус, спасибо!
    По ТДД есть мысль, что юниты будут выходить на сцену на конечных стадиях разработки сценариев. Так сказать для "шлифовки". А начальные ТДД должны начинаться с интеграционных, получается. Где более одного сервиса-сущности-модели-класса-юнита, захватывая и "инициализацию холодильника" и "выдачу ингредиентов". Таким образом на старте у нас тесты совсем не SRP, но потом "расслаиваются" 🤔

  • @evgenyamorozov
    @evgenyamorozov 2 роки тому +4

    Прекрасное интервью! Мне очень понравилось, как Борис рассказал про DDD.
    Но не могу согласиться с тем, что 15 лет в разработке - это очень много... Всё, что мы используем в разработке сейчас (2021), придумано в 1960х: процедурное, функциональное, ООП, юнит-тестирование и ТДД - придумано и опробовано тогда.

    • @itbeard
      @itbeard  2 роки тому

      Полностью согласен

    • @bellmoon2754
      @bellmoon2754 2 роки тому +2

      Не надо все грести под одну гребёнку, ТДД гораздо позже появился

    • @ivan_lebedev
      @ivan_lebedev 2 роки тому

      в 2003 DDD примерно появился и TDD примерно тогда же.

    • @evgenyamorozov
      @evgenyamorozov 2 роки тому

      @@bellmoon2754 "Автор" ТДД Кент Бек сам писал, что он переоткрыл эту идею, а не изобрёл её заново. И он ссылается на идею с перфокартами, которая описывает процесс ТДД.

    • @evgenyamorozov
      @evgenyamorozov 2 роки тому +1

      @@ivan_lebedev DDD - это чистое объектно-ориентированное программирование. В нём новым оказывается позабытое старое, когда в 60х программисты знали предметную область и писали программы от неё отталкиваясь. В современном мире программисты абстрактные - они могут запрограммировать всё, но мало в каких предметных областях разбираются. И DDD напоминает, что вообще-то мы моделируем реальный мир и его конкретную часть, используя ООП.

  • @alexanderobuhov8231
    @alexanderobuhov8231 2 роки тому +2

    Говорим Беларусь, подразумеваем холодильники, говорим холодильники, подразумеваем Беларусь. Никак не могу избавиться от этой ассоциации.

  • @eugenefedoryachenko8793
    @eugenefedoryachenko8793 2 роки тому

    Очень крутой гость! Читал 45 татуировок менеджера, и надеюсь что будущему владельцу этой книги она очень понравится и поможет развиться :)

  • @Legatdestr
    @Legatdestr 2 роки тому

    Борис, а можете подсказать? Интернет магазин, продажа услуг. У услуг есть описания-статьи, категории, хеш-тэги. Хеш-тэги считать value object-ом или все-таки entity?

    • @Biankouski
      @Biankouski 2 роки тому

      Без задачи (цели\бизнеса) сложно сказать. Если задача - это редактировать теги в админке и навешивать по категориям\статьям, то Entity. Все всегда зависит от BoundedContext и решаемой бизнесовой задачи

  • @thetraveler7779
    @thetraveler7779 2 роки тому +2

    *_Надеюсь доживу до того дня, когда увижу в названии нового видоса "Язык ассемблера....."._*
    *_Ну и по классике вопрос: -Айтиборода, где ассемблер?_* 😂

  • @andreysakharov6210
    @andreysakharov6210 2 роки тому +2

    Всем очень рекомендую так же посмотреть вот это видео про DDD
    Объясняют очень доходчиво.
    ua-cam.com/video/CR9mLGN9jh0/v-deo.html

  • @amNuke
    @amNuke 2 роки тому +1

    Рассказал про 1с и предметно-ориентированное программирование)

  • @user-ip2uh5tz8v
    @user-ip2uh5tz8v Рік тому

    На все 100% согласен с утверждением "У меня было программирование до DDD и после". Я всем знакомым говорю так: "Я как разработчик до DDD и после это два разных разработчика". Эти принципы кардинально поменяли мой взгляд на программирование.

  • @Mr43046721
    @Mr43046721 2 роки тому

    Правда - ДДД непонятно, но очень интересно)) спасиб за выпуск!

  • @user-kl2nv3ct7u
    @user-kl2nv3ct7u 2 роки тому +6

    респект за PHP

  • @UniXoiD69
    @UniXoiD69 2 роки тому +3

    Обычно под моделью в ддд понимают не класс бизнес объекта, а модель предметной области (та самая имплементация домена).

    • @UniXoiD69
      @UniXoiD69 2 роки тому +2

      Крайне рекомендую книгу Вон Вернона

  • @sleeck
    @sleeck 2 роки тому

    Мне 36 лет я инженер-конструктор на 1:22:00 я подумал "да ну нахрен, я пошел" но все же досмотрел! Правда у меня есть образование программиста, но в 2007-2011 году у меня с этим не задалось! Спасибо за видосы

  • @user-ex9zs4zv3e
    @user-ex9zs4zv3e 2 роки тому +4

    Борис немного напутал с unit of work (UoW), от того он и сказал что "не знаю почему его так назвали"
    UoW отвечает за то чтобы изменения сохранялись атомарно, от того он так и называется
    а то о чём говорил Борис (холодильники с одним id будут одним и тем-же холодильником) -- это Identity map

  • @vdawork
    @vdawork 2 роки тому

    оч крутой ролик, но рекомендую промотать половину)

  • @ilyaplot
    @ilyaplot 2 роки тому +3

    Борода, спасибо за видео. Теперь смогу с легкостью Эванса дочитать ) Не хватало общего понимания без кучи деталей, из которых и состоит книга. level up )

    • @ilyaplot
      @ilyaplot 2 роки тому

      А еще придется рассказать команде, что у нас личинка DDD, но никак не DDD )

    • @evgenyamorozov
      @evgenyamorozov 2 роки тому

      На мой взгляд, можно читать только bounded context. Сам Эванс через цать лет после первой книги сказал, что это ключевая идея. И если писать вторую редакцию, то именно это будет центральной частью.

    • @grommaks
      @grommaks 2 роки тому

      @@evgenyamorozov И Вон Вернон написал книгу именно с учетом этих мыслей)

  • @ItMohican
    @ItMohican 2 роки тому +3

    Привет! У тебя очень крутые интервью! Очень прошу, может найдешь на интервью человека, который занимается VR? Мне кажется очень интересное направление, многим зайдёт

    • @AntonGorbachevDev
      @AntonGorbachevDev 2 роки тому

      Плюсую, тоже было бы очень интересно послушать)

  • @sergioabromovich4770
    @sergioabromovich4770 2 роки тому

    Народ, очень важный вопрос. Есть смысл изучать программирование, если я в принципе понимаю теорию и понимаю будущую логику( которую предстоит написать) , но не могу ничего написать. начал изучать программирования 2 месяца назад и пока очень тяжело писать код ( хотя задачки очень детские и простые). Я зык C#. С математикой очень туго у меня.

    • @AlexS-gn9tq
      @AlexS-gn9tq 2 роки тому

      Смысл, конечно есть, но в долгую имхо ветка Product Owner -> Product Manager в сочетании с английским уровня от C1 намного более перспективна.

  • @goriaev
    @goriaev 2 роки тому +1

    1:23:00 может дальше будет объясняться. По идее сервис нужен для того, чтобы не привязываться к инфраструктуре. То есть может быть веб контроллер (с гетом), консоль контроллер (с параметрами) и дальше уже на что фантазии хватит

  • @NofaceAndrew
    @NofaceAndrew Рік тому

    Непонятно. в случае ремонта холодильника нужно вызвать на уровне контроллера пустойХолодильник = кухонныйСервис.очистиХолодильник(), затем сервисРемонта.произведиРемонт(пустойХолодильник). Получается, что контроллер должен знать что перед ремонтом его нужно очистить, а это разве не часть бизнес-логики?

  • @alexmcarrow
    @alexmcarrow 2 роки тому

    Верно подмечено что DDD это не "правила", а "пожелания".
    Помогал знакомому переписывать MVP`шку на новый рельсы - и подсунул ему легкий уровень DDD...
    Ему было крайне тяжело, всегда хотелось писать сразу в контроллере, но я его тормозил и заставлял все расписывать по доменам, агрегаторам, моделям и т.д.
    Времени было заложено на "реврайт" 4 месяца, сроки из-за сложности первичного входа растянулись до 5 месяцев.
    И через неделю после старта новой версии, заказчик прибежал с новой идеей - сколько было счастья в его голосе, когда он рассказывал что в MVP ему пришлось бы треть кода переписывать, а тут сделал новый домен, сформировал агрегатор и настроил роуты - готово. При этом 99.99[9]% гарантии что ничего ранее написанного не сломалось.
    ----
    Полностью согласен с Борисом - главное начать, будет тяжело, будет "ломать" писать каждую новую "фишку" в пяти-семи местах, вместо одного куска кода в контроллере - зато потом начнешь пожимать плоды своих трудов.
    ===
    Теперь дам ему ссылочку на данное видео - а то ведь даже не знает что это было DDD (хоть и маленькое, но все же) 😀

    • @artemvolt4600
      @artemvolt4600 2 роки тому

      Александр, а вы могли бы привести пример домена? Например, как ваш колета сделал новый домен, сформировал агрегат?
      Может от себя что-нибудь посоветуете, с чего начать для изучения этой темы?

  • @extense1337
    @extense1337 Рік тому

    История со стеклянной дверью и кофе очень знакома))

  • @alzasr
    @alzasr 2 роки тому

    Спасибо! Ещё один случай, когда не подойдёт. Если сайдэффект должен быть вызван до оеончания бизнеслогики. Например сохранять статус операции.

  • @oeaoo
    @oeaoo Рік тому +1

    Здорово.

  • @sergeymachel2278
    @sergeymachel2278 2 роки тому +5

    DDD очень сладко звучит, но я для себя так до конца и не понял как происходит синхронизация работы с базой? (в особенности когда много серверов, юзеров и т.д., ведь модель - это по сути InMemory объект, который зачастую имеет очень много зависимостей, даже на очень простых бизнес моделях)
    Можно конечно запилить exclusive lock, но в таком случае с перфомансом можно прощаться на веки (даже для небольших моделей, про средние и выше - промолчим).
    Да и не очень понятно как это всё ложиться на REST API (где мы фокусируемся не на бизнесе модели, а на ресурсах, читай данных).
    Очень интересен DDD, очень ждал ответа на эти вопросы, но не дождался (как и во многих других выступлениях про DDD)

    • @Biankouski
      @Biankouski 2 роки тому +1

      > который зачастую имеет очень много зависимостей, даже на очень простых бизнес моделях)
      скорее всего у вас нарушается разделение 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 будет заботиться о синхронизации перед непосредственным сохранением в базу (когда юзер уже сделал много стэпов). Это классический кейс конкуренции за общий ресурс (в нашем случае холодильник). Единственный выход что я вижу - это временное "бронирование" продукта, т.е. при любом обновлении модели (которое могут обновить другие клиенты) нужно делать колл в базу и лочить какой-то ресурс на определённый промежуток времени.
      Я вот всё хочу попробовать в продакшене, но боюсь что на нашем энтэрпрайзе это рано или поздно вылезет боком (с ростом сложности модели(ей) и агрегаций)

  • @cloudofgeorge
    @cloudofgeorge 2 роки тому +3

    Посмотрел, чтобы подтвердить свое мнение. DDD - отличный подход, что-бы быть ближе к бизнесу. Формировать архитектуру и сущности проекта в соответствие с требованиями/задачами бизнеса. Работаю по DDD последние пару лет. Рекомендую попробовать, тем кто еще не использует

  • @aliaksandrhubanau4933
    @aliaksandrhubanau4933 2 роки тому

    Красавчик! Интервью гонь!

  • @spartakusbund1916
    @spartakusbund1916 2 роки тому

    Можно упороться еще дальше и отказаться вобще от сервисов и заюзать CQRS, где команды будут представлять конкретный use-case и больше не будет необходимости в сервисе-проксе к репозиторию.

  • @nbes6328
    @nbes6328 2 роки тому

    Я не могу отделаться от мысли, что всё это сводится к идеям из Grokking Simplicity, точнее к трём вещам:
    1. Данные (Data): факты, которые могут использоваться как угодно.
    2. Функции-расчёты (Calculations): когда на любой вход, у нас одинаковый выход. В видео это называли без side-effect'ов.
    3. Функции-Действия (Actions): что угодно зависящее от того, когда было вызвано или сколько раз.
    Любое действие "заражает" всё что выше. В примерах это было ActiveRecord, вызов функции now () и т.п.

  • @ruflection
    @ruflection 7 місяців тому +1

    TDD подход ваш очень хорош, мне тоже не зашёл красный зелёный красный

  • @user-bw8vd6rl9y
    @user-bw8vd6rl9y 2 роки тому +2

    Я бы в 1с эту пиццерию сделал))

  • @StasLeo1987
    @StasLeo1987 2 роки тому +1

    Боря, привет!

  • @dmitryivanov6812
    @dmitryivanov6812 2 роки тому

    довольно давно пишу на пхп, но такое чувство, что разговор был про что-то другое... ;) очень интересно, но мало что понятно... в плане практического применения. нужно будет на досуге покопать тему...

  • @alexeylozenko6093
    @alexeylozenko6093 2 роки тому

    Про экзамен в лицей, и единицы измерения, уже там Борис использовал приведение типов ;).

  • @user-kq8nk5vj5r
    @user-kq8nk5vj5r 2 роки тому

    А проектирование и разработку на 1С-ке, получается, можно назвать DDD? Предметметно-ориентированный подход этоже оно и есть, или всё не так?

    • @dmitryfokin5205
      @dmitryfokin5205 2 роки тому

      ну концепции ддд до 1С не дорасти, т.к. есть священое писание ддд и развития не предполагает. мешает наложение ооп. то что они считают методом модели (домена) является само по себе моделью (доменом)

  • @korotindev
    @korotindev 2 роки тому

    Классный выпуск, лойс!
    Одно НО: гость больно часто прыгал по темам туда и обратно :)

  • @user-tf6cn7vd2m
    @user-tf6cn7vd2m 2 роки тому +1

    Даня Поперечный отжигает про ДДД😀

  • @inzhener2007
    @inzhener2007 2 роки тому

    Сильная связность и слабое сцепление, а не "зацепление", от слова цепь.

  • @Legatdestr
    @Legatdestr 2 роки тому +1

    Я ж правильно понимаю, холодильник для ремонта и холодильник в контексте готовки физически, если говорить про базу, будут храниться в РАЗНЫХ таблицах, базах, хранилищах и т.д. А объединять их будет Identity, например, поле externalId?

    • @Biankouski
      @Biankouski 2 роки тому +2

      В 99% случаев - да. Готовые датамапперы не позволят сделать наоборот. Но надо понимать, что DDD это про бизнесс, а не про хранение данных.
      Например, в виде исключения (а точнее, если Вы взвесили все плюсы и минусы) можно сделать и так:
      Вы пилите легас, и у вас уже случилась одна жирная таблица, содержащая два различных BoundedContext, и разделить данные сложно, то можете попробовать запилить такое сохранение сущностей (такой UnitOfWork), чтобы разные бизнес сущности (Entity\Aggergates) сохранялись в одну табличку.

    • @RodionAndreev-gz1cy
      @RodionAndreev-gz1cy 2 роки тому

      В одной. Дтошки разные