Gostaria de opiniões sobre minha implementação do padrão Specification, definido no livro de Eric Evans.
Vou usar um exemplo de uma especificacao que define requisitos para criacao de carros:
public class CarroSpecification {
private List requisitos;
public CarroSpecification(List requisitos) {
this.requisitos = requisitos;
}
boolean isSatisfeitaPor(Carro carro) {
return carro.getCaracteristicas().containsAll(requisitos);
}
}
Posteriormente eu refatorei para que além de definir os requisitos a especification criasse um objeto baseado nos requisitos fornecidos e usei o padrão builder. Neste ele lança uma excecao caso os requisitos não sejam suficientes ara a criação de um carro. Ficou algo assim:
public class CarroSpecification {
private Map requisitos = null;
...
public CarroSpecification() {
...
}
public CarroSpecification motorizacao(Float valor) {
this.requisitos.put(MOTORIZACAO, valor);
return this;
}
public CarroSpecification cor(Color cor) {
this.requisitos.put(COR, cor);
return this;
}
public CarroSpecification comAr() {
this.requisitos.put(AR, new Boolean(true));
return this;
}
public Carro build() throws IllegalStateException {
// cria um carro, se possível
}
public boolean isSatisfeitoPor(ModeloCarro modelo) {
...
}
}
O que vocês acham? A minha solucao viola o que DDD define como specifications ou é apenas uma specification “um pouco diferente” que perde a caracteristica value object e alem de especificar também cria.
Eu achei essa solucao mais facil para o cliente usar mas gostaria de saber a opiniao dos DDDers de plantao.