Я читаю блестящую книгу "Domain Driven Design", написанную Эриком Эвансом. В своей книге Эрик описывает два разных понятия: шаблон спецификации и политики.
Вот пример спецификации:
public interface ProjectSpecification {
public boolean isSatisfiedBy(Project p);
}
public class ProjectIsOverdueSpecification implements ProjectSpecification {
public boolean isSatisfiedBy(Project p) { … }
}
//client:
if {
(projectIsOverdueSpecification.isSatisfiedBy(theCurrentProject) { … }
}
Вот пример политики:
public class CargoBooking {
private OverBookingPolicy overBookingPolicy = new OverBookingPolicy();
public int makeBooking(Cargo cargo, Voyage voyage) {
if (!overbookingPolicy.isAllowed(cargo, voyage))
return –1;
int confirmation = orderConfirmationSequence.next();
voyage.addCargo(cargo, confirmation);
return confirmation;
}
}
public OverBookingPolicy {
public boolean isAllowed(Cargo cargo, Voyage voyage) {
return (cargo.size() + voyage.bookedCargoSize()) <= (voyage.capacity() * 1.1);
}
}
Я знаю, что политика на самом деле является стратегией, но в двух приведенных выше примерах нет никакой разницы. Поэтому мой вопрос в этом вопросе: в чем разница между этими двумя шаблонами? Оба шаблона делают бизнес-правила явными, поэтому почему мы различаем эти два шаблона? Для меня оба являются предикатами.