Инструменты проектирования для младшего разработчика, вышедшего за рамки CRUD
Вы реализовали CRUD-функционал, но наступает момент, когда страшно заниматься поддержкой кода. Привычка начинать с проектирования таблиц приводит к тому, что система становится запутанной. Эта статья содержит конкретную методологию разделения кода на доменные единицы и стандартизации окружения для сужения области правок.
Повышение сплоченности кода: разделение доступа к данным и бизнес-логики
Если в контроллере перемешана бизнес-логика, то при каждом изменении структуры базы данных приходится переписывать весь код. Внедрите слоистую архитектуру, чтобы изолировать их друг от друга. Это позволит сократить время на обслуживание кодовой базы примерно на 40%.
Этапы разделения доступа к данным и логики:
- Перенесите код валидации из контроллера в DTO запроса и используйте аннотации для проверки корректности.
- Соберите логику, разбросанную по транзакционным скриптам, в методы внутри доменных сущностей.
- Объявите интерфейсы, определяющие поведение персистентности, вместо использования конкретных драйверов БД, чтобы отделить их от доменного слоя.
Даже если схема конкретной таблицы изменится, основные правила останутся неизменными.
Создание среды для тестирования с помощью внедрения зависимостей
Если вы создаете объекты напрямую внутри класса с помощью оператора new, модульное тестирование становится невозможным. Реализуйте инверсию управления (IoC) и проводите независимое тестирование с помощью фиктивных объектов (Mock) без участия внешнего сервера.
Практический порядок действий для повышения эффективности тестирования:
- Объявляйте соавторов, которые будет использовать объект, через интерфейсы, а не через конкретные классы.
- Настройте внешний контейнер так, чтобы он внедрял подходящую реализацию в момент выполнения.
- Используйте такие инструменты, как @automock/jest, для автоматизации настройки тестовых дублеров.
Использование этой структуры позволяет увеличить скорость выполнения тестов более чем на 20%.
Изоляция сущностей от DTO
Если структура пользовательского интерфейса и таблицы БД связаны один к одному, то при изменении одного экрана придется модифицировать схему БД. Строго разделяйте DTO, используемые для сетевых сообщений, и доменные сущности.
Способ изоляции с использованием мапперов:
- Создайте чистые классы-мапперы, специализирующиеся только на преобразовании данных.
- Переносите данные только внутри маппера, чтобы предотвратить прямую зависимость между DTO и сущностями.
- Настаивайте на том, чтобы сервисный слой использовал только сущности.
При замене хранилища данных логику изменять не потребуется.
Настройка среды разработки с помощью Docker Compose
Если у каждого разработчика свое локальное окружение, совместная работа останавливается. Опишите инфраструктуру как код с помощью Docker Compose для синхронизации сред.
Процедура создания стандартного окружения:
- Укажите версии и переменные окружения для БД и кэш-сервера в файле docker-compose.yml.
- Разместите SQL-скрипт начальной схемы в директории /docker-entrypoint-initdb.d с помощью монтирования томов.
- Используйте линкер пакетов, например pnpm Workspaces, чтобы избежать путаницы в зависимостях.
После завершения этой настройки вы сможете развернуть стандартную инфраструктуру менее чем за 3 секунды, не беспокоясь о настройках локальной машины.
Доменное моделирование перед проектированием таблиц
Если начинать с ERD, вы получите лишь фрагментированную логику, ориентированную на данные. Компания Shopify перевела более 800 своих инженеров от легаси-систем с упором на физическую схему к моделированию на основе бизнес-объектов.
Этапы начала доменного моделирования:
- На основе вариантов использования (use cases) и повсеместного языка (ubiquitous language) перечислите основные существительные и глаголы домена.
- Определите сущности, требующие смены состояний, и объекты-значения с неизменяемыми атрибутами.
- Выберите корни агрегатов (aggregate roots) для проверки бизнес-целостности в рамках транзакции.
Такой подход позволяет локализовать область правок внутри определенного модуля, даже если требования изменятся. Проектирование сложных систем — это самое практичное решение, чтобы избавиться от ощущения растерянности.