Всем привет!
Недавно был дискус с коллегами по поводу того, что может содержать DTO и на сколько он должен быть чистым? Я и еще один коллега придерживаемся мнения, что DTO хоть и не должен содержать логики, но вполне может иметь метод для трансформации данных, например getFromArray. А наш тимлид, человек несомненно более опытный, говорит, что DTO должен быть максимально чистым. Почему я в этом сомневаюсь, потому что мне кажется что излишняя чистота DTO влечет слишком много гемора, что тоже не очень удобно и полезно с точки зрения поддержки кода.
Предположим, у нас приходит некий json мы его декодируем в объект или массив, потом хотим на основе него построить DTO. При этом пусть его структура будет вложенной, допустим пользователь, его профиль и массив некоторой информации дополнительной data.
{
“guid” : “ someValue”,
“name”: “ someValue”,
“phoneNumber”: “ someValue”,
…
“userProfile”: {
“someField”: “someValue"
},
“data”: {
“someField”: “someValue"
}
}
Хочется просто закинуть данный декодированный объект или массив в метод, dto или в его конструктор, и чтобы он сам построил всю вложенность dto. Без вызова всяких там сетов вручную. При этом вдруг мне еще надо для формирования вложенного dto скажем userProfile использовать еще и данные из уровня выше, допустим захочу телефонный номер закинуть, или мне надо закинуть его именно с плюсом спереди, или сделать любые другие преобразования с данными при построении DTO. Да, можно использовать маппер, но в чем смысл создавать еще и отдельный класс маппера? Что может пойти не так, что DTO от такой логики будет уже не DTO и какие могут быть проблемы?
Я в защиту смог только привете такой пример - до определенного момента в php вообще не было type hints и если мы делали DTO, то как правило был базовый класс, который содержал методы валидация входных данных на основе док блоков. Получается это были какие-то кривые DTO раньше?
Просто мне кажется, что все эти вот правила это на уровне рекомендаций, какие-то обоснованные, какие-то не очень. Нет, понятно что не стоит пихать в DTO бизнес логику, типа там отправку запросов, сохранение в базу данных и прочее. Но мне кажется DTO лучше быть самодостаточным в плане формирования данных, которые он будет хранить. Выглядит лучше чем мапперы с вызовами сеттеров, созданием всей этой цепочки вложенности. Или типа это уже из разряда объект формирует сам себя? А в случае с старым подходом без типов, это еще и валидация, а значит еще нарушение принципа единственной отвественности?
Кто что думает по этому поводу и как формирует DTO?