17е занятие курса “Otus PHP Professional“ посвящено теме архитектуры кода. Рассмотрим, что такое чистая архитектура, разберем понятия: UML, SOLID, SoC, DRY, KISS, YAGNI, DI. Вы научитесь использовать принципы построения взаимодействия сущностей в коде; проходить важную теоретическую часть собеседований.

Цели занятия

  • после занятия вы сможете: использовать принципы построения взаимодействия сущностей в коде.

Краткое содержание

  • архитектура кода;

  • UML, SOLID, SoC, DRY, KISS, YAGNI, DI и DI-контейнеры.

Результаты

  • проходить важную теоретическую часть собеседований.

Преподаватель

  • Дмитрий Кириллов

Дата и время

  • 4 апреля, понедельник в 20:00

  • Длительность занятия: 90 минут

Оглавление

/**/

Чистая архитектура

Для чего нужна?

Основные термины

Устойчивость к изменениям — важный фактор разработки. Как часто правятся классы?

Структура чистой архитекуры

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

(warning) У нас в DTO будут упакованы имя и телефон клиента (из json-request — в объекты)


Принципы SOLID

1. DIP ~ Принцип Инверсии зависимостей / Dependency Inversion


2. OCP ~ Принцип Открытости-Закрытости / Open-closed

Пример: для задачи выше нужна доработка:

Доработки:

Реализация: расширяем функциональность, через добавление новых классов:

  • InsuranceLead.php

  • LoanLead.php

  • LoanReposiroty.php : фейковая БД заявок

OCP ~ Устойчивые классы

Решение 1: Абстрактный класс

Пример абстрагирования:

==>

Решение 2: через интерфейс

Это и есть принцип Open-closed:

(warning) Т.е. код не ишем, объявляем его абстрактным и реализуем в потомках.


Пусть появилась доп. задача от бизнеса : поиск лидов в консоли

Как изменится архитектура?

Проблемы:

Принцип разделения интерфейсов:

SRP: Принцип единственной ответственности

Рецепты:

Пример в CreateLeadUseCase.php

Диаграмма: разделение классов:


4. LSP ~ Принцип подстановки Лисков / Liskov Substitution Principle

Пример: делаем правки

==>

Принцип LSP:

ИТОГО: Чем хороши принципы SOLID ?


Доп. материалы

Другие примеры чистого кода:


Домашнее задание

Анализ кода

Цель:

Применить на практике изученные принципы; Научиться работать над аналитическими задачами в отношении кода.

Описание/Пошаговая инструкция выполнения домашнего задания:

Выберите один из своих проектов. Проведите анализ на предмет соответствия изученным принципам. Предложите свои варианты исправления.

Критерии оценки:

  1. Все утверждения подкреплены кодом «до» и «после» (8 баллов)

  2. Желательно составить uml-схемы «до» и «после» (2 балла)

(звезда) Рекомендуем сдать до: 10.04.2022


Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.