6

Martin Fowler 提出的 Query Object 模式和 Eric Evans 提出的 Specification 模式有什么区别?

4

2 回答 2

5

查询对象

Fowler 的查询对象模式企业应用程序架构模式第 316 页)是解释器模式的一种特殊化,它允许数据库查询以领域语言呈现。一个主要来自福勒的例子:

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

Java Persistence API Criteria API和 Rails 的ActiveRecord查询接口就是这种模式的例子。

规格

Evans 的规范模式( Domain-Driven Design p. 224) 将业务规则实现为一个对象,该对象表示另一个对象、实体或值对象的谓词。Evans 的示例是一个InvoiceDelinquency带有布尔方法的对象,如果它是拖欠的,则test(Invoice)返回 true 。Invoice规范可用于多种用途:验证对象、查询集合或指定如何创建新对象。

区别

规范本质上与作为查询对象模式一部分的 Criteria 类相同。查询对象描述并不打算让 Criteria 有任何其他目的,而不是指定查询,但是如果您在同一个程序中使用这两种模式,您肯定希望使用您的 Specifications 作为查询对象的 Criteria。

于 2016-05-17T15:07:57.093 回答
1

规范模式的实现往往更窄。他们回答与您的域相关的特定问题。例如,此规范完全致力于某些电影是否适合儿童:

var spec = new MovieForKidsSpecification();

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

查询对象是一种更广泛的模式,不仅可以用于回答您的域模型提出的问题。您可以将查询对象视为规范的超集。这是我博客中实现规范模式的示例:规范模式实现

于 2016-07-21T21:53:29.010 回答