TGViewer
Советы разработчикам (python и не только) Советы разработчикам (python и не только) @advice17 · 8.35K subscribers
Post #65 17.1K
Data Transfer Object

Когда мы общаемся с удаленным кодом (посылаем запросы, сообщения), пересылаемые данные в коде зачастую удобнее передавать совместно и представлять не в виде отдельных параметров методов, а в виде некоторой структуры. Она называется DTO - Data Transfer Object (объект передачи данных).

DTO - любой объект/структура данных без своей логики, пригодная для сериализации для передачи по сети. При этом не обговаривается как именно она будет сериализована - она может содержать специальные методы, или этим может заниматься отдельный код (на основе интроспекции, макросов или как угодно).

DTO - это, в первую очередь, назначение объекта. Это данные, которые надо передать. Могут иметься в виду входящие, так и исходящие данные.

1. Для существования DTO не требуется наличие каких-либо доменных моделей, это любые данные. Они могут собираться из других DTO, нескольких бизнес-сущностей или вообще генерироваться на ходу
2. Сериализация возможна в совершенно разные форматы (например: xml, json, protobuf). При это не обязательно использование одного DTO под несколько форматов
3. DTO может использоваться в разных адаптерах приложения: для данных, возвращаемых или принимаемых обработчиком сервера, из клиентов внешних апишек, как результат работы DAO и т.п. В целом, структуры, передаваемые между слоями приложения без удаленных вызовов, могут тоже называться DTO.
4. Если DTO содержит логику сериализации, мы обязаны ограничивать его использование на внешнем слое приложения. То есть, при возврате данных из интерактора мы должны логику их сериализации вынести наружу.
5. DTO не содержит логики, но содержит информацию об структуре данных и общеизвестных типах. Парсер DTO может содержать какие-то универсальные предохранители от загрузки слишком больших данных. Но, например, кастомизация длины строки или допустимого диапазона чисел на каждое поле - однозначно будет ошибкой.
6. DTO на сервере и клиенте могут иметь совершенно разную реализацию и она может меняться независимо, однако структура данных должна быть согласована. Изменение формата представления данных, состава полей и типов на отправителе потенциально могут сломать логику получателя данных и поэтому должны делаться аккуратно.

В качестве примеров объектов, которые можно использовать в качестве DTO можно назвать датаклассы (в python или kotlin). При этом, например, Pydantic-модели, из-за наличия логики сериализации в них самих, должны оставаться на уровне адаптеров (view-функций, обработчиков запросы) и не должны переиспользоваться между адаптерами совершенно разного назначения.

Дополнительные материалы:
https://martinfowler.com/eaaCatalog/dataTransferObject.html
https://docs.python.org/3/library/dataclasses.html
https://www.oracle.com/technical-resources/articles/java/javareflection.html
https://go.dev/blog/laws-of-reflection
  • 🔥 73
  • 👍 18
  • ❤ 11
  • ❤‍🔥 5
  • 🤓 4
  • 😢 1
  • 🐳 1
  • 🤣 1
More from @advice17
  1. May 31, 2026Юзкейсы, сценарии и интеракторы Когда мы пишем наш код (программу, сервис, библиотеку), мы…
  2. Feb 17, 2026Меня позвали поговорить о разном: о проектах, опыте, программировании в целом. https://www…
  3. Jan 11, 2026SQLAlchemy и ORM SQLAlchemy в python предоставляет два набора API: 1. Возможность конструи…
  4. Nov 4, 2025Asyncio и колбэки В прошлом посте мы рассмотрели как asyncio взаимодействует с генераторам…
  5. Sep 27, 2025Стейт при работе с базами данных Подходы работы с БД можно разделить на две группы: • Орие…
  6. Aug 7, 2025Asyncio и цикл событий Чтобы понять, как рабоатет asyncio, давайте рассмотрим, как в Pytho…
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 →