Различия между объектом запроса и шаблонами спецификаций

В чем разница между шаблоном Query Object, предложенным Мартином Фаулером, и шаблоном Specification, предложенным Эриком Эвансом?

2 ответа

Объект запроса

Шаблон Объекта Запроса Фаулера ( Шаблоны Архитектуры Приложения Предприятия, стр. 316) является специализацией шаблона Интерпретатора, который позволяет представлять запросы к базе данных на языке домена. Пример в основном из Фаулера:

QueryObject query = new QueryObject(Person.class);
query.addCriteria(Criteria.greaterThan("numberOfDependents", 0))
List<Person> persons = query.execute(unitOfWork);

Примерами этого шаблона являются API-интерфейс API Java Persistence API и интерфейс запросов RailR ActiveRecord.

Спецификация

Шаблон спецификации Эванса ( Domain-Driven Design, стр. 224) реализует бизнес-правило как объект, представляющий предикат для другого объекта, объекта или объекта значения. Пример Эванса InvoiceDelinquency объект с логическим методом test(Invoice) который возвращает истину, если Invoice является преступником Спецификация может использоваться для нескольких целей: проверки объекта, запроса к коллекции или определения способа создания нового объекта.

Различия

Спецификация по сути такая же, как класс Criteria, который является частью шаблона Query Object. В описании объекта запроса не предполагалось, что критерии имеют какую-либо другую цель, кроме определения запросов, но если вы использовали оба шаблона в одной и той же программе, вы наверняка захотите использовать свои спецификации в качестве критериев объектов запроса.

Реализации шаблона спецификации имеют тенденцию быть более узкими. Они отвечают на конкретный вопрос, связанный с вашим доменом. Например, эта спецификация полностью посвящена тому, хорош ли какой-нибудь фильм для детей:

var spec = new MovieForKidsSpecification();

if (!spec.IsSatisfiedBy(movie))
    return Error(“The movie is not eligible for children”);

Query Object - более широкий шаблон, и его можно использовать не только для ответов на вопросы, которые задает модель вашего домена. Вы можете посмотреть на Query Object как на набор спецификаций. Вот пример реализации шаблона спецификации: реализация шаблона спецификации

Другие вопросы по тегам