Глава 15. Типовые решения распределенной обработки данных 421
и в ответе, схожи, используйте один объект переноса данных. Если же данные слишком
различны, используйте два объекта.
Некоторые разработчики предпочитают делать объекты переноса данных неизменяе-
мыми. В этом случае приложение получает от клиента один экземпляр объекта переноса
данных, а возвращает другой, даже если они принадлежат одному и тому же классу. Дру-
гие же допускают изменение объекта переноса данных, отправленного клиентом в ходе
запроса. Что касается меня, то я еще не выработал окончательного мнения, однако в це-
лом отдаю предпочтение изменяемому объекту переноса данных. Это позволяет посте-
пенно наполнять его данными, даже если в качестве ответа на запрос будет создан новый
объект. Некоторые аргументы в пользу неизменяемого объекта переноса данных связаны
с пониманием этого типового решения как объекта-значения, что и привело к совпаде-
нию названий с моим объектом-значением (Value Object, 500).
Наиболее распространенной формой реализации объекта переноса данных является
множество записей (Record Set, 523) — набор табличных записей, который возвращается
в результате выполнения SQL-запроса. На самом деле множество записей можно
рассматривать как объект переноса данных для базы данных SQL. Подобная схема час-
то используется при проектировании архитектурных решений. Модель домена может
сгенерировать множество записей и отослать их клиенту. Клиент же будет восприни-
мать полученное множество записей так, как если бы оно было возвращено непосред-
ственно в результате выполнения SQL-запроса. Это очень удобно, если у клиента есть
средства для связывания множеств записей с элементами управления. Множество запи-
сей может быть полностью сгенерировано логикой домена, однако в большинстве слу-
чаев оно возвращается как результат выполнения SQL-запроса и обрабатывается логи-
кой домена, после чего передается слою представления. Данный принцип работы был
позаимствован для типового решения модуль таблицы (Table Module, 148).
Еще одной формой реализации объекта переноса данных может быть универсальная
структура данных по типу коллекции. Иногда в этом качестве применяют массивы дан-
ных, однако мне такой подход не по душе, поскольку индексы массивов только запуты-
вают код. На мой взгляд, более удачной разновидностью коллекции является словарь,
потому что в качестве ключей можно использовать значащие строки. Впрочем, у словаря
есть и свои недостатки, связанные с потерей явного интерфейса и строгой типизации.
Таким образом, словарь стоит использовать в нерегламентированных случаях, когда под
рукой нет генератора объектов, поскольку манипулировать словарем легче, чем писать
объект с явным интерфейсом вручную. Тем не менее при наличии генератора рекомен-
дую придерживаться явного интерфейса, особенно если его предполагается использовать
в качестве "протокола" общения между различными компонентами.
Сериализация объекта переноса данных
Помимо предоставления простых get- и set-методов, объект переноса данных может
осуществлять сериализацию собственного содержимого в формат, пригодный для пере-
дачи по сети. Выбор формата зависит от того, что находится на противоположном конце
соединения, что допускается передавать по самому соединению и насколько просто вы-
полнить сериализацию передаваемой структуры данных. Многие платформы содержат
встроенные средства для сериализации простых объектов. Например, Java обладает
встроенными средствами сериализации в двоичный формат, a .NET — в двоичный фор-
мат и формат XML. Как правило, наличие встроенных средств значительно упрощает