Шаблон проектирования «Спецификация» в виде UML диаграммы
«Спецификация» в программировании — это шаблон проектирования, посредством которого представление правил бизнес-логики может быть преобразовано в виде цепочки объектов, связанных операциями булевой логики.
Этот шаблон выделяет такие спецификации (правила) в бизнес-логике, которые подходят для «сцепления» с другими. Объект бизнес-логики наследует свою функциональность от абстрактного агрегирующего класса CompositeSpecification, который содержит всего один метод IsSatisfiedBy, возвращающий булево значение. После инстанцирования объект объединяется в цепочку с другими объектами. В результате, не теряя гибкости в настройке бизнес-логики, мы можем с лёгкостью добавлять новые правила.
В следующем примере мы проверяем счета и отсылаем их в агентство по сбору платежей, если: они просрочены, ещё не были отправлены в агентство и покупателю было выслано предупреждение. Этот пример показывает, как правила «сцепляются» друг с другом.
Пример опирается на три спецификации: OverdueSpecification, которая верна, если счёт был выставлен более чем 30 дней назад, NoticeSentSpecification, которая верна, если покупателю было отослано 3 предупреждения, и InCollectionSpecification, проверяющая, что счёт ещё не отсылался в агентство по сбору платежей. Реализация этих классов не так важна.
Используя эти три спецификации, мы создаём новое правило SendToCollection, которое верно, если выполняются все три условия, описанные в предыдущем абзаце.
OverDueSpecificationOverDue=newOverDueSpecification();NoticeSentSpecificationNoticeSent=newNoticeSentSpecification();InCollectionSpecificationInCollection=newInCollectionSpecification();// пример "сцепления" правилISpecification<Invoice>SendToCollection=OverDue.And(NoticeSent).And(InCollection.Not());InvoiceCollection=Service.GetInvoices();foreach(InvoicecurrentInvoiceinInvoiceCollection){if(SendToCollection.IsSatisfiedBy(currentInvoice)){currentInvoice.SendToCollection();}}