342 Часть II. Типовые решения
аспект слоя хранения. Помимо этого, наличие хранилища помогает достичь полной изо-
ляции и четкой односторонней зависимости между слоем домена и слоем отображения
данных.
Принцип действия
Хранилище — достаточно сложное типовое решение, в реализации которого использу-
ется несколько других типовых решений, описанных в книге. В действительности оно
напоминает небольшой фрагмент объектно-ориентированной базы данных и этим сход-
но с объектом запроса (Query Object, 335), который чаще приобретают в составе коммер-
ческих средств объектно-реляционного отображения, чем разрабатывают сами. Тем не
менее, если команда разработчиков приложила усилия и сконструировала объект за-
проса, к нему не так уж сложно добавить функции хранилища. Последнее в сочетании с
объектом запроса существенно увеличивает возможности слоя объектно-реляционного
отображения.
Несмотря на сложные механизмы, реализованные внутри хранилища, его интерфейс
очень прост. Клиент создает объект критериев, указывая характеристики объектов, кото-
рые должны быть возвращены в результате выполнения запроса. Например, чтобы найти
сотрудников с указанным именем, необходимо задать объект критериев, описывая каж-
дый Критерий примерно следующим образом: criteria, equals (Person. LAST_NAME,
"Fowler") и criteria, like (Person. FIRST_NAME, "M"). Затем нужно вызвать метод
repository.matching (criteria), чтобы возвратить список сотрудников с фамилией
Fowler, имя которых начинается на букву "М". Для большего удобства в абстрактном
классе хранилища можно определить и другие методы; например, для поиска единствен-
ного соответствия было бы неплохо воспользоваться методом наподобие sole-
Match (criteria) , который бы возвращал объект, а не коллекцию объектов. В число
других распространенных методов входит метод поиска по идентификатору byObject
id (id), который совсем несложно реализовать, используя метод soleMatch.
Клиентский код, работающий с хранилищем, воспринимает его как простую коллек-
цию объектов домена, расположенную в оперативной памяти. Тот факт, что объекты до-
мена на самом деле не находятся в хранилище, полностью скрыт от клиентских программ.
Разумеется, клиентский код должен быть осведомлен о том, что "видимая" коллекция
объектов (например, товаров, распространяемых по каталогу) может отображаться на
таблицу с сотнями тысяч записей, и применение метода all о к хранилищу ProductRe-
pository — не самая удачная идея.
Методы хранилища заменяют собой специализированные методы поиска преобразо-
вателя данных, выполняя извлечение объектов на основе спецификаций [14]. Сравните
это с непосредственным использованием объекта запроса, при котором клиент создает
объект критериев (простая разновидность типового решения спецификация (Specifi-
cation)), добавляет этот критерий непосредственно к объекту запроса и выполняет запрос.
При работе с хранилищем клиентский код формирует критерии и передает их хранилищу
с просьбой возвратить объекты, которые подойдут под заданное описание. Таким обра-
зом, с точки зрения клиента, выполнение запроса заменяется удовлетворением, т.е. извле-
чением объектов, удовлетворяющих спецификации запроса. Возможно, кому-то это раз-
личие покажется чисто формальным, однако оно хорошо иллюстрирует описательную