
120
Поля объектов переноса данных, как правило, содержат значения стандартных типов (строки,
даты и т.д.), а также другие объекты переноса данных. Любые связи между такими объектами
должны укладываться в рамки простого графа, типа иерархии, в противоположность сложным
структурам модели предметной области. Поэтому для переноса данных обычно используют
упрощенную форму объектов домена
.
Наиболее распространенной формой реализации объекта переноса данных является
множество записей – набор табличных записей, который возвращается в результате выполнения SQL-
запроса, сгенерированного доменом.
С целью «разворачивания» объектов переноса данных на обоих концах соединения
используется специальный объект, получивший название «сборщик», который создает объект
переноса данных на основе данных домена и наоборот – обновляет модель
домена данными из
объекта переноса данных. При создании объекта переноса данных сборщиком используется тот
или иной алгоритм сериализации, позволяющий получать данные в двоичном, текстовом (причем, в
большинстве случаев, в виде XML-документа) или в зашифрованном формате.
Помимо проработки вопросов, связанных с обеспечением интерфейса удаленного доступа,
необходимо предусмотреть интерфейс для любого источника
или получателя данных в системе.
Такие интерфейсы чаще всего называются шлюзом (gateway) и помимо доступа, например, к
реляционной базе данных (такой частный случай рассмотрен в разделе 4.8.2) могут предоставлять
доступ к XML-документам, транзакциям CICS
8
, W3C
9
, JDOM
10
и т.д.
В большинстве случаев шлюз представляет собой класс в который помещается весь
специализированный код API того или иного источника или потребителя данных. Интерфейс шлюза
соответствует интерфейсу обычного объекта доступа к данным и может содержать набор
традиционных методов. При этом для получения доступа к удаленному источнику, объекты
приложения будут обращаться
к шлюзу, который в свою очередь будет преобразовывать вызовы
простых методов в вызовы специализированного API. Очевидно, что для перехода к другому
источнику данных в этом случае достаточно будет изменить только класс шлюза, а остальная часть
системы абсолютно не пострадает.
Следует подчеркнуть, что согласно идеологии применения целого ряда GoF-паттернов
(Indirection, Protect Variation,
Adapter) существует объективная необходимость применения
служебных классов типа «шлюз» для организации взаимодействия между различными подсистемами
с целью инкапсуляции их внутренней структуры, посредством обеспечения доступа к
высокоуровневым методам, вынесенным в интерфейсную часть. Такой подход позволяет обеспечить
фундаментальный принцип модульной декомпозиции «низкая внешняя связанность – высокое
внутреннее сцепление», а также повысить эффективность тестирования отдельных
компонентов за
счет сокращения количества тестовых наборов.
Пример организации двухуровневой архитектуры корпоративного приложения типа «клиент-
сервер» показан на рис. 13. Помимо узкоспециализированных шлюзов, предназначенных для
взаимодействия с БД, слой источника данных содержит шлюз, обеспечивающий доступ к внешним
источником или потребителям данных. Кроме того, в слое домена выделены подсистемы,
выполняющие независимые друг
от друга задачи, и взаимодействующие друг с другом посредством
межкомпонентного интерфейса. При поступлении удаленного вызова от клиента интерфейс
удаленного доступа с помощью сборщика создает объект переноса данных, который используется
для обмена информацией между клиентом и сервером.
8
CICS (Command Execution Diagnostic Facility) – среда обработки транзакций фирмы IBM
9
W3C - World Wide Web Consortium
10
JDOM - Java-реализация популярного интерфейса доступа к документам (Document Object Model - DOM)