Upgrade to Pro — share decks privately, control downloads, hide ads and more …

«Рефакторинг PHP-кода с применением DDD» — Виталий Чирков, FunCorp

Badoo Tech
February 15, 2020

«Рефакторинг PHP-кода с применением DDD» — Виталий Чирков, FunCorp

«Это доклад про рефакторинг PHP кода с использованием тактических паттернов DDD. Я покажу на примерах, с какими проблемами мы столкнулись, какие приёмы работают.

Цель — продемонстрировать подход к реанимации legacy-кода на основе DDD-примитивов и поделиться своим опытом его применения».

Badoo Tech

February 15, 2020
Tweet

More Decks by Badoo Tech

Other Decks in Programming

Transcript

  1. Почему я? • 7 лет создаю legacy в FunCorp •

    Использую тактический DDD
 более 5 лет • Контрибутил в Doctrine MongoDB ODM 
 ради DDD !2
  2. На повестке дня • Какие проблемы решаем • Что такое

    DDD и как поможет • Проекция общих принципов 
 на PHP реальность !3
  3. У вас тут старая лапша 
 разрослась, да еще и

    с 
 вплетением инфраструктуры !4
  4. Проблемы • Спагетти-сервисы • Один слой fits it all •

    Божественные сущности • Анемичные сущности !5
  5. !8

  6. DDD • Техника разработки через моделирование предметной области • Общий

    язык (ubiquitous language) — коммуникация для бизнеса и разработки !10
  7. Value Object • Представляет собой значение (идентификатор, цвет, деньги и

    т.д.) • Сравнивается с объектами такого же класса по значению • Валидирует, порождает себя !16
  8. Repository • Имеет семантику коллекции • Возвращает валидные сущности •

    Доменно-специфичные методы • Изолирует домен от БД !23
  9. Specification • Служит для выборки сущностей • Можно выбирать по

    сложным критериям • Разгружает контракт репозитория
 Interface Segregation Principle !26
  10. Domain service • Не содержит состояния • Работает с сущностями

    внутри домена • Логика, которая не ложится в сущности и VO • Содержит доменные знания !30
  11. Application service • Точка входа в домен • Выполняет законченную


    бизнес-транзакцию • Принимает VO или более сложные DTO • Возвращает результат в виде доменных объектов или ошибок !32
  12. Application service • Не содержит состояния • Не содержит доменных

    знаний
 цикломатическая сложность 1 • Делегирует работу доменным сервисам или сущностям !33
  13. Блоки: итог Value Object Entity Repository Specification Service ➕ factory,

    event, command, provider, 
 adapter, processor, assembler, etc. !35
  14. Проверим язык • Все пользовательские сценарии должны быть воспроизводимы на

    языке предметной области • Взаимодействие сущностей должно быть понятно всем участникам !41
  15. План действий 1. Проверим язык модели
 Слова контекстно-зависимы и слабы

    в плане трактовки 2. Изолируем модель и применим DDD блоки
 Транспорт и инфраструктура — отдельные слои !42
  16. Изолируем модель В модели избегаем: • MVC контроллеров с HTTP

    • пользовательского интерфейса • работы с базой данных, очередями и прочей инфраструктурой !44
  17. Инфраструктура • Интерфейсы для репозиториев • Описываем хранение в слое

    инфраструктуры • Оставляем домен чистым • Иногда это непросто: спецификации, идентификаторы !45
  18. Итоги • выделили модель предметной области • провели границы между

    слоями приложения • переписали код на блоки DDD • научили команду общим терминам !46
  19. Источники 1. Domain-Driven Design: Tackling Complexity in the Heart of

    Software, Eric Evans 2. Implementing Domain-Driven Design, Vaughn Vernon 3. DDD in PHP mailing list http://dddinphp.org/ 4. Mathias Verraes http://verraes.net/ 5. Martin Fowler on DDD !47