Форум Сообщества Аналитиков
Дисциплины => Проектирование => Тема начата: deadsy от 11 Ноября 2009, 13:47:35
-
Книга Мартина Фаулера - Patterns of Enterprise Application Architecture (http://www.amazon.com/exec/obidos/ASIN/0321127420)
Data Mapper - http://martinfowler.com/eaaCatalog/dataMapper.html (http://martinfowler.com/eaaCatalog/dataMapper.html)
Metadata Mapping - http://martinfowler.com/eaaCatalog/metadataMapping.html (http://martinfowler.com/eaaCatalog/metadataMapping.html)
Query Object - http://martinfowler.com/eaaCatalog/queryObject.html (http://martinfowler.com/eaaCatalog/queryObject.html)
Unit Of Work - http://martinfowler.com/eaaCatalog/unitOfWork.html (http://martinfowler.com/eaaCatalog/unitOfWork.html)
Repository - http://martinfowler.com/eaaCatalog/repository.html (http://martinfowler.com/eaaCatalog/repository.html)
Strategy - http://en.wikipedia.org/wiki/Strategy_pattern (http://en.wikipedia.org/wiki/Strategy_pattern)
Есть реализация паттерна Data Mapper, основанном в свою очередь на паттерне Metadata Mapping, также есть Query Object в который можно добавлять множество критериев поиска.
Внутри себя Query Object инкапсулирует добавление выбранных объектов в Unit Of Work.
В книге Мартина Фаулера пишется что если разработчики реализовали Query Object, то можно легко перейти от Query Object к паттерну Repository. Один из плюсов Repository - это использования паттерна Strategy, что дает возможность использовать не только СУБД для получения объектов но и как пример XML файлы.
На мой взгляд в книге не полностью раскрыта тема паттерна Repository и остаются некоторые вопросы.
1. почему на диаграмме Repository видно что метод поиска может получать только один критерий?
2. какие методы кроме поиска должен иметь объект Repository?
3. критично или нет если Data Mapper будет иметь метод который в качестве параметра будет принимать Query Object?
В книге Query Object сам обращался к методу маппера findByWhereClause, при этом сам выполнял часть маппинга превращая запрос по полям объекта в Where выражение.
Я думаю что логично реализовать весь маппинг в классе маппера.
4. Хочется более точно понять как должны работать между собой все эти паттерны (Query Object, Repository, Strategy, Data Mapper, Metadata Mapping, Unit of Work)
-
Отвечу, возможно, запоздало, но всё же
Все приведённые паттерны, описанные Фаулером, неплохо работают вместе во многих современных инструментах ORM, например, Hibernate (http://hibernate.org). Настоятельно рекомендую к ознакомлению хотя бы пару начальных глав руководства пользователя (http://docs.jboss.org/hibernate/stable/core/reference/en/html/), чтобы представлять как эти концепции ложатся на практичный API.
В частности на уровне API:
* Data Mapper, Unit of Work, Repository -> Session
* Query Object -> Criteria/Query
* Metadata Mapping -> определения в *.hbm.xml или в аннотациях