Никто не ожидает, что метод isAdult направит куда-то REST. Библиотеки тоже. Например, в случае применения MapStruct надо будет разбираться, как же сделать так, чтобы всё нормально мапилось и чтобы про метод isAdult не подумали, что там есть какое-то поле под названием adult. Инжектить какие-то сервисы в DTO с помощью MapStruct, наверное, можно. Но не понятно — как.
Поэтому давайте запретим DDD!
Подождите, не уходите, мы всё объясним. В сознании среднестатистического разработчика концепция DDD намертво привязана к ООП. Если ему надо внедрить DDD, он начинает всё делать ООП-шным. Когда нам рассказывают про ООП в институте или на курсах, нам говорят: «Есть класс Животные, от Животных наследуются Котики. Ты можешь сделать объект Котик. У всех Котиков есть свойства. А ещё у них есть методы, с помощью которых ты можешь свойства Котика менять. Котиков много, каждый уникален».
А потом человек приходит в разработку, и есть CatService, который один, синглтон. И есть много DTO, которые инкапсулируют все данные. Он думает: объекты — это явно Котики. CatService — это вообще ерунда. Я буду бизнес-логику внедрять в котика. А на самом деле приёмы ООП хорошо ложатся на сервисы, а на Котиков они в современной парадигме ложатся хуже. Но каждый хочет их затащить в Котиков. В принципе это можно сделать. Если у вас хорошо сыгранная команда, если вы хорошо знаете, как делать ваш сорт DDD, то спокойно можете этим заниматься. Но обычно получается так, что в команде есть пара энтузиастов, а все остальные — за всё хорошее, против всего плохого.
Энтузиасты начинают внедрять бизнес-логику в DTO, и это, как правило, не заканчивается хорошо. Вместо крутого, белого-пушистого кода получается сумятица. Поэтому сейчас DDD — штука сомнительная.
Давайте хотя бы соблюдать принципы, чтобы у нас осталась возможность мокать процедуры, иначе будет совсем плохо. Эта возможность нужна нам не просто так. Она нужна для юнит-тестов. Я сделаю сильное утверждение: ничто в современной разработке не имеет смысла, кроме как в свете юнит-тестирования. Это наша версия фразы учёного-эволюциониста Ф. Добжанского: «Ничто в биологии не имеет смысла, кроме как в свете эволюции». Кстати, под юнит-тестами я имею ввиду и то, что помечено аннотациями SpringBootTest, DataJpaTest и даже то, что работает с Testcontainers.
Если хотите, можете юнит-тестирование заменить юнит-интеграционно-автоматизированным тестированием. К сожалению, цитата становится не такой крутой. Казалось бы, все знают, что это круто, все это делают. Но, если присмотреться, то нет. Были времена, когда у нас был огромный монолит, который стартовал 12 минут. А потом нужно было найти поиск, ввести Voldemort'а, узнать, что он живёт в Петербурге, и только тогда понять, что ты правильно написал код. Либо 15 минут копаешься в этом интерфейсе, который написан ещё на JSP, либо пишешь один тестовый метод, и он отрабатывает достаточно быстро. Ясное дело, нужно писать юнит-тесты.