DDD Использование шаблона спецификации для проверки - PullRequest
22 голосов
/ 11 марта 2012

Я думаю об использовании шаблона спецификации для проверки. Сложно то, как сказать пользователю, почему некоторые спецификации не были выполнены. Что если Specification.IsSatisfiedBy() вернет не только значение bool, но и причину сбоя. Это будет выглядеть примерно так:

interface ISpecification<T>
{
  CheckResult IsSatisfiedBy(T candidate);
}

, где CheckResult:

class CheckResult
{
  public bool IsSatisfied { get; }
  public string FailureReason { get; }
}

В работе Фаулера и Эванса существует концепция Частично удовлетворенной спецификации , цель которой состоит в том, чтобы объяснить, что именно не было выполнено. Однако в этом документе он реализован как дополнительный метод remainderUnsatisfiedBy , который возвращает спецификацию, которая не была выполнена Candidate .

Таким образом, вопрос заключается в следующем: при использовании Спецификации для целей проверки, как предоставить пользователю обратную связь о том, что данная Спецификация не была удовлетворена? Является ли решение, которое я представил выше, хорошим?

Ответы [ 2 ]

18 голосов
/ 13 марта 2012

Несмотря на то, что вы можете использовать свои классы спецификаций для проверки, я бы посоветовал вам хранить их как отдельные понятия в вашем домене.Вы можете обнаружить, что вам нужно повторно использовать одни и те же базовые спецификации, но вам нужно возвращать разные «причины отказа» в зависимости от цели и контекста.См. эту статью для получения более подробной информации.

Автор поста, на который ссылаются выше, также любезно поделился кодом с github и опубликовал код как NCommon.В частности, рассмотрите следующие области:

Технические характеристики : https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Specifications

Проверки : https://github.com/riteshrao/ncommon/tree/v1.2/NCommon/src/Rules (особенно классы для ValidationResult и ValidationError )

5 голосов
/ 28 марта 2012

У меня была такая же проблема. Я создаю Валидационный декоратор для Спецификации (код JAVA).

  interface Validator<T>{
    Respond validate(T t)
  }


  class abstract ValidationSpecificationDecorator<T> implements Validator<T> {
  Specification<T> spec;

  ValidationSpecificationDecorator(Specification<T> spec){
    this.spec =  spec;
  }

  public Respond  validate(T t) {
    Respond respond = new Respond();
    if(!spec.IsSatisfiedBy(t){
       respond.add(error(t));
    }
    return respond;
  )

  public abstract Error error(T t);

  }
...