17е занятие курса “Otus PHP Professional“ посвящено теме архитектуры кода. Рассмотрим, что такое чистая архитектура, разберем понятия: UML, SOLID, SoC, DRY, KISS, YAGNI, DI. Вы научитесь использовать принципы построения взаимодействия сущностей в коде; проходить важную теоретическую часть собеседований.
Цели занятия
-
после занятия вы сможете: использовать принципы построения взаимодействия сущностей в коде.
Краткое содержание
-
архитектура кода;
-
UML, SOLID, SoC, DRY, KISS, YAGNI, DI и DI-контейнеры.
Результаты
-
проходить важную теоретическую часть собеседований.
Преподаватель
-
Дмитрий Кириллов
Дата и время
-
4 апреля, понедельник в 20:00
-
Длительность занятия: 90 минут
Оглавление
/**/
- Цели занятия
- Краткое содержание
- Результаты
- Преподаватель
- Дата и время
- Чистая архитектура
- Пример кода
- Принципы SOLID
- Доп. материалы
- Домашнее задание
Чистая архитектура
Для чего нужна?
Основные термины
Устойчивость к изменениям — важный фактор разработки. Как часто правятся классы?
Структура чистой архитекуры
1. Уровень инфраструктуры
2. Уровень приложения
3. Уровень домена
Примеры распределения задач по уровням:
т.е. смотрим на частоту изменений, и в зависимости от этого распределяем по уровням:
-
Контроллер: ур. Инфраструктуры
-
Модель/сущность — ур. Домена
-
Репозиторий (для работы с БД): ур. Инфраструктуры
-
Команды для CLI: ур. Инфраструктуры
-
Сервисы: ур. Приложений
Пример кода
Задача
Создадим тестовый проект с 3мя папками-уровнями: (на фреймворке Symfony):
Пишем модель “Лида“ : Lead.php
Критика/проблема этой реализации:
(….)
Решение:
Пишем объект под сущность Имя: Name.php
Аналогично для Телефона — класс Phone.php
:
(…)
Поменяем в исходном классе типы на объектные:
Вспомогательный класс — для превращения входящих данных из json в объект:
CreateLeadRequest.php
Тестирование: отсылка запросов : Services.yml
CreateLeadResponse.php
Создадим сервис для занесения данных в БД:
Infrastructure/Gateway/BankGateway.php:
Проблема: надо абстрагироваться
Решение: LeadService.php:
Диаграмма классов
Исходная:
После выделения интерфейса: (по принципу инверсии зависимостей):
Тестирование
Проверять будем через Postman:
DTO: Domain Transfer Object
У нас в DTO будут упакованы имя и телефон клиента (из json-request — в объекты)
Принципы SOLID
1. DIP ~ Принцип Инверсии зависимостей / Dependency Inversion
2. OCP ~ Принцип Открытости-Закрытости / Open-closed
Пример: для задачи выше нужна доработка:
Доработки:
Реализация: расширяем функциональность, через добавление новых классов:
-
InsuranceLead.php
-
LoanLead.php
-
LoanReposiroty.php
: фейковая БД заявок
OCP ~ Устойчивые классы
Решение 1: Абстрактный класс
Пример абстрагирования:
==>
Решение 2: через интерфейс
Это и есть принцип Open-closed:
Т.е. код не ишем, объявляем его абстрактным и реализуем в потомках.
Пусть появилась доп. задача от бизнеса : поиск лидов в консоли
Как изменится архитектура?
Проблемы:
Принцип разделения интерфейсов:
SRP: Принцип единственной ответственности
Рецепты:
Пример в CreateLeadUseCase.php
Диаграмма: разделение классов:
4. LSP ~ Принцип подстановки Лисков / Liskov Substitution Principle
Пример: делаем правки
==>
Принцип LSP:
ИТОГО: Чем хороши принципы SOLID ?
Доп. материалы
-
книга “DDD in PHP“: на русском — https://github.com/TalismanFR/dddinphp
-
доп. см. курс Otus по этой теме — Архитектура и шаблоны проектирования
-
книга Роберт Мартин — Гибкая разработка программ на Java C++
-
книга Роберт Мартин — Чистая архитектура программного обеспечения
-
Запись вебинара: https://play.boomstream.com/1IctdW6V
-
Репозиторий с исходниками, упомянутыми выше в примерах: https://github.com/DmitryKirillov/otus-php-architecture
Другие примеры чистого кода:
-
Другие примеры кода: / GitHub — CodelyTV/php-ddd-example:
Hexagonal Architecture + DDD + CQRS in PHP using Symfony 5 https://github.com/CodelyTV/php-ddd-example
-
Еще пример: GitHub — codeliner/php-ddd-cargo-sample: PHP 7 Version of the cargo sample used in Eric Evans DDD book https://github.com/codeliner/php-ddd-cargo-sample
-
Еще пример: GitHub — thombergs/buckpal: An example approach for implementing a Clean/Hexagonal Architecture https://github.com/thombergs/buckpal
-
GitHub — Sairyss/domain-driven-hexagon: Guide on Domain-Driven Design, software architecture, design patterns, best practices etc. with code examples https://github.com/Sairyss/domain-driven-hexagon
-
GitHub — ivanpaulovich/hexagonal-architecture-acerola: An Hexagonal Architecture service template with DDD, CQRS, TDD and SOLID using .NET Core 2.0. All small features are testable and could be mocked. Adapters could be mocked or exchanged. https://github.com/ivanpaulovich/hexagonal-architecture-acerola
Домашнее задание
Анализ кода
Цель:
Применить на практике изученные принципы; Научиться работать над аналитическими задачами в отношении кода.
Описание/Пошаговая инструкция выполнения домашнего задания:
Выберите один из своих проектов. Проведите анализ на предмет соответствия изученным принципам. Предложите свои варианты исправления.
Критерии оценки:
-
Все утверждения подкреплены кодом «до» и «после» (8 баллов)
-
Желательно составить uml-схемы «до» и «после» (2 балла)
Рекомендуем сдать до: 10.04.2022
Нет комментариев