Сильно усложнять - да. Но это же не значит что надо вообще отказываться от методов.Именно поэтому не принято в дтошках сильно всё усложнять.
Сильно усложнять - да. Но это же не значит что надо вообще отказываться от методов.Именно поэтому не принято в дтошках сильно всё усложнять.
Можно и не отказываться, но лучше, чтобы их можно было бы реализовать внешне. Как, например, методы-расширения в C# или Kotlin. Прежде всего дтошка - это хранилище данных. там не место полиморфизмам и инкапсуляциямСильно усложнять - да. Но это же не значит что надо вообще отказываться от методов.
Надо отказываться от методов. В DTO странно сунуть какую-то логику, даже гет-сет будут костылём. Как Адель говорит, это транспорт и не только между объектами-методами, при сериализации-десериализации мы должны получать аналогичные структуры, даже в разных ЯП.Сильно усложнять - да. Но это же не значит что надо вообще отказываться от методов.
Тут нужно спрашивать, кто считает наоборот, кроме тебя.вопрос в том, сколько еще людей так считает, кроме вас четверых?
С языка снял. Вспоминаем OSIС чего бы структуре знать, во что ее сериализовывать?
Я бы не назвал это в общем случае полноценной сериализацией. Сериализация подразумевает возможность десериализации, а тут это совершенно необязательно, достаточно, чтобы был понятен контекст (да и нежелательно, если там внутри, например, string на пару мегабайт).Единственное во что должен сериализоваться DTO это в string, что бы при фейле assertEquals выдавал нечто более понятное нежели код типа с произвольным хэшем.
Я писал про Value Object. DTO - это относительно неустоявшееся понятие, но ты их уравнял в первом тезисе, так что все-таки это фантазия.При чем тут процедурщина? DTO - это просто структура. Adelf правильно заметил, что примерно как аргументы метода.
Ты же пишешь $foo->method($parameter), а не $parameter->execute($foo, 'method')?
ага, и тут же начинается: только для ...С чего бы структуре знать, во что ее сериализовывать? Сериализация относится к конкретному протоколу обмена данными, а не к самой структуре. DTO с toJson() - это тот же ActiveRecord, вид сбоку: как обязанностью модели не является персистить себя в базу, так и обязанностью DTO не является сериализовывать себя в какой-нибудь json.
Видимо, ты немного попутал VO и DTO. Ладно, забудем про кидание ДТОшками по сети. Давай попробуем на простом примере. У нас есть некоторая команда, и допустим от пользователя требуется ввести либо email, либо телефон. обязательно что-то одно должно быть. Соответственно, если следовать твоей логике, у нас будет ДТО(Email|null $email, Phone|null $phone, куча других полей) и это ДТО будет следить, чтобы хотя бы одно из них было не null. Это ведь "гарантирует целостность"?DTO - это не просто аргумент, он может гарантировать целостность своей структуры, это живой объект, а не любые данные
Тут речь идет о DTO, который трансферится между Java-приложениями, со стандартным Java serialize. В те времена, когда писался PoEAA, это выглядело уместным. Пофигу что там в сериализованной строке, просто передали туда-сюда и все, Java сама разберется. Относительно PHP можно сказать, что это должен быть объект, которому мы можем безопасно сделать serialize() и unserialize().Предлагаю калибровать значение термина DTO из первоисточника. https://martinfowler.com/eaaCatalog/dataTransferObject.html
Вспоминаем OSI
библию еще не толкуешь?Тут речь идет о DTO, который трансферится между Java-приложениями, со стандартным Java serialize. В те времена, когда писался PoEAA, это выглядело уместным.
Относительно PHP можно сказать, что это должен быть объект, которому ...
Вот в этом источнике и кроется суть проблемы,> кто считает наоборот, кроме меня - открываем доки или примеры по всем фреймвокам и ищем ваш DTO как структуру без методов.
Предлагаю калибровать значение термина DTO из первоисточника. https://martinfowler.com/eaaCatalog/dataTransferObject.html
Отсюда и путаница. Да и с логической точки зрения, зачем в транспорт таскать все сериализаторы, получается что DTO должна знать куда её будут совать, что бредово с архитектурной точки зрения.Many people in the Sun community use the term "Value Object" for this pattern. I use it to mean something else. See the discussion on page 487.
Так DTO и есть часть транспорта. Есть данные, которые вы хотите отправить, есть их сериализация, есть отправка. Какое тут уникальное место для DTO? Да никакого, по сути это часть сериализации. И да, DTO может знать, как себя сериализовать в xml, как json, а как в проприетарный бинарный протокол. Ибо, внезапно, оказывается, что могут быть нюансы как сериализовать то или иное поле в xml, а как в json, и если не рассматривать DTO как сериализатор, то сверху начинают накатывать конфиги, аннотации и прочее, что бы именно этот сериализатор именно это DTO сериализовал именно, так, а другое DTO иначе.Да и с логической точки зрения, зачем в транспорт таскать все сериализаторы, получается что DTO должна знать куда её будут совать, что бредово с архитектурной точки зрения.
И опять же, ничто не мешает DTO знать эти нюансы, ибо DTO - часть транспорта. Попытка отделить структуру предназначенную для передачи по конкретному транспорту от этого транспорта выглядит не очень обоснованно. Ты уверен, что сможешь с помощью контекста решить оптимально передачу одного и того же DTO разными протоколами? Я вот не уверен, а значит предполагаю появление в контексте какой-то кастомной конфигурации для конкретного DTO... зачем? Что мы этим добились то?Сейчас же в мире докеров и k8s мы обмениваемся данными между микросервисами, написанными на разных языках с совершенно разными типами данных. Где-то json-ами, где-то msgpack-ами, где-то протобуфами. Появился контекст этой самой сериализации, который относится не к самой структуре данных, а к транспортному протоколу.
А HTTP-запрос тоже DTO должен отправлять? Или в AMQP-очередь себя добавлять?часть транспорта
А модель может знать, как записать себя в MySQL, PostgreSQL или MongoDB.DTO может знать, как себя сериализовать в xml, как json, а как в проприетарный бинарный протокол
Конечно. А еще могут быть нюансы, как какое поле сохранить в MySQL или PostgreSQL. Нерешамая проблема без Active Record!что могут быть нюансы
Да. Конфиг маппинга.начинают накатывать конфиги