Различия между объектом запроса и шаблонами спецификаций
В чем разница между шаблоном 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 как на набор спецификаций. Вот пример реализации шаблона спецификации: реализация шаблона спецификации