DTO — простой (плоский) объект? У него могут быть методы?
DTO (Data Transfer Object) действительно по своей сути является простым и плоским объектом, предназначенным для передачи данных между слоями приложения. Его основная цель — перенос данных, а не реализация поведения или бизнес-логики. Однако в практике программирования DTO может включать методы, если они соответствуют следующим условиям:
1. Методы для преобразования
Часто в DTO добавляют вспомогательные методы для преобразования в другую структуру, например, в Entity. Это не нарушает принцип «простоты», так как такие методы относятся исключительно к удобству использования объекта для передачи данных.
Пример:
- Такие методы не добавляют поведения к DTO, а только служат для удобства преобразования.
2. Методы для валидации
В редких случаях можно добавить методы, которые помогают проверить корректность данных, содержащихся в DTO. Однако лучше проводить валидацию вне DTO, чтобы сохранять его как можно более «плоским».
Пример:
- Если валидация относится исключительно к данным внутри DTO, то её можно считать частью ответственности самого объекта.
- Но если валидация требует сложной логики (например, проверки уникальности email в базе), лучше вынести её в отдельный слой (например, сервис).
3. Методы для сериализации/десериализации
Иногда можно добавить методы для удобства сериализации или десериализации данных в формат JSON, XML и т.д., хотя стандартные библиотеки Go обычно справляются с этим автоматически.
Пример:
4. Методы, которых лучше избегать
DTO не должен содержать:
- Методы, которые изменяют внутреннее состояние объекта (мутация данных).
- Методы, связанные с бизнес-логикой или процессами приложения (например, вычисления, сохранение в базу данных и т.д.).
- Сложные методы, которые нарушают принцип разделения ответственности.
5. Почему вообще добавляют методы в DTO?
Хотя классическое определение DTO подразумевает их простоту, методы могут быть добавлены:
- Для удобства: чтобы избежать дублирования кода при преобразовании данных.
- Для самодостаточности: чтобы объект мог «знать», как преобразовать себя в другую форму или проверить свою корректность.
6. Как поддерживать «чистоту» DTO?
Если вы хотите придерживаться строгой интерпретации DTO как простого объекта, сделайте следующее:
- Вынесите все методы преобразования и валидации в отдельные пакеты или слои (например, в мапперы, валидаторы).
- Оставьте DTO только с полями и стандартными тегами (например,
json
для сериализации).
Пример использования маппера:
Recommended Posts
Golang map и Swiss Table
16.03.2025