TGViewer
Организованное программирование | Кирилл Мокевнин Организованное программирование | Кирилл Мокевнин @orgprog · 14.3K subscribers
Post #406 12.1K
Почему нужно использовать DTO

Data Transfer Object, термин, который для разработчиков на статических языках является чем-то самим разумеющимся, но вот остальные его могут не знать (даже если пользуются). Хотя в эпоху интеграций, фронтенд-бекенд, сервис-сервис, очереди, это крайне важная конструкция.

DTO это очень промежуточный объект между моделью в вашем коде и данными, которые вы отдаете наружу или принимаете от внешней системы.

⁃ Модель => DTO => json/protobuf/sql/...
⁃ json/protobuf/sql/... => DTO => Модель

Нафига? Почему не сразу преобразовывать из, допустим, json в нашу модель или наоборот? Тем более во всех экосистемах есть механизмы, которые позволяют упаковывать любые объекты, задавая правила преобразования через метаданные, аннотации или еще как-то. Пример из Java:


@Entity
public class User {
@Id
private Long id;
@JsonIgnore // приходится скрывать
private String passwordHash;
@JsonProperty("created_at")
private LocalDateTime createdAt;

// getters/setters ...
}

var json = new ObjectMapper().writeValueAsString(dto);


Существует масса причин, почему это плохая идея. Для начала, это банальное нарушение MVC архитектуры. Модель начинает знать как о представлении, о том какие поля надо выдавать наружу, какие нет, как их переименовывать и так далее. Если это кажется натянутым, то вот вам реальные последствия.

Одна и та же сущность для внешнего мира редко представляется одним способом. В зависимости от задачи, это может быть один набор полей или другой. Как это разрулить? Дальше, здесь плохо контролируется процесс, легко может быть такое, что новое поле автоматически попало наружу, хотя вы этого не планировали, но забыли его исключить. А если нужны вычисляемые поля или другое представление (всегда в датах)? В такой ситуации модель будет наполняться доп свойствами и методами, которые готовят доп данные для преобразования, что ведет к сильному загрязнению кода. Что из этого относится к бизнес-части, а что к представлению? Проблема.

DTO позволяют отделить представление от модели в коде, создавая по сути промежуточный слой. Имея его, вы можете независимо развивать свою модель и API для взаимодействия с ним. И да, это один из аспектов MVC, конкретно Model-View.

Готовые DTO гораздо легче чем модели конвертировать в типы на TS если у вас есть такая потребность. Например мы наши DTO (используем Alba), превращаем в типы TS с помощью готового инструмента (Typelizer). С моделями так легко не получится.

За это конечно придется заплатить. В проекте появится папка, с большим количеством файлов. Но это с лихвой компенсирует все описанные выше проблемы. DTO очень простые и для их создания далеко не всегда надо с нуля писать классы. В той же java они генерируются с помощью mapstruct, в других языках свои механизмы.

Но это только базовая история. Если мы еще подключаем инструменты генерации из sql (как в go) или openapi как везде, то те самые DTO создаются вообще автоматически на основе описаний.

Пример для sqlc.Библиотека на базе этого запроса и схемы базы генерирует DTO. Запрос:


INSERT INTO links (original_url, short_name)
VALUES (sqlc.arg(original_url), sqlc.arg(short_name))
RETURNING *;


DTO:


type CreateLinkParams struct {
OriginalUrl string `json:"original_url"`
ShortName string `json:"short_name"`
}


Причем для update будет создана своя структура:


type UpdateLinkParams struct {
OriginalUrl string `json:"original_url"`
ShortName string `json:"short_name"`
ID int64 `json:"id"`
}


Здесь отличается только id, но в реальных кейсах, отличий в создании или обновлении одной сущности обычно значительно больше, поэтому количество DTO тут становится еще больше.

DTO, кстати, должны быть имутабельны, иначе туда потечет логика

p.s. Вы сами пишите DTO или генерируете?

Ссылки: Телеграм | Youtube | VK
Telegram Организованное программирование | Кирилл Мокевнин Делюсь опытом и обучаю. И ИИ? И ИИ. Ютуб https://youtube.com/@mokevnin AI Клуб @hexletclub | Внедрение AI в SDLC https://praxor.ru/ Для предложений в личку канала
  • 👍 69
  • ❤ 21
  • 🔥 9
  • 🤔 8
  • ✍ 2
  • 👎 2
  • 🤝 2
  • ⚡ 1
More from @orgprog
  1. Sep 29, 2026Плановое обслуживание кода Даже если вы настроили у себя процесс разработки, в котором все…
  2. Sep 27, 2026Выпуск опубликован, можно смотреть и слушать. Сегодня в подкасте создатель Вастрик Клуба В…
  3. Sep 26, 2026Костные наушники Под каждым видео коммент, что за наушники ты носишь? Это костные наушники…
  4. Sep 24, 2026Статистика участия в опенсорсе Активно разрабатывая я регулярно наыткаюсь на баги и не дор…
  5. Sep 21, 2026Банда четырех для эпохи агентов Количество паттернов по тому, как эффективно работать с ИИ…
  6. Sep 16, 2026Главное правило принятия архитектурных решений Когда-то давно в одной из книжек я прочитал…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →