Специфікація — це шаблон проєктування, який представляє бізнес логіку у вигляді ланцюжка об'єктів зв'язних операцій булевої логіки.

Переваги та недоліки

Переваги

логіка фільтрації об'єктів винесена в окремі класи-специфікацій, які можна, без втрат в гнучкості системи, об'єднювати між собою

Недоліки

важкий в реалізації

Опис мовою C#

Додамо деякі класи, які будуть симулювати реальні об'єкти.

Запишемо стандартну реалізацію, яку згодом покращимо для конкретної мови програмування.

Додамо абстрактний клас, який дозволить нам об'єднювати специфікації в ланцюжки за допомогою операторів булевої логіки. У C# цей клас можна замінити на перевантаження операцій чи методами розширень до .

Реалізацій конкретних декораторів

public class AndSpecification<TEntity> : CompositeSpecification<TEntity> { private readonly ISpecification<TEntity> spec1; private readonly ISpecification<TEntity> spec2;

public AndSpecification(ISpecification<TEntity> spec1, ISpecification<TEntity> spec2)

this.spec1 = spec1; this.spec2 = spec2;

public override bool IsSatisfiedBy(TEntity candidate)

return spec1.IsSatisfiedBy(candidate) && spec2.IsSatisfiedBy(candidate);

public class OrSpecification<TEntity> : CompositeSpecification<TEntity> { private readonly ISpecification<TEntity> spec1; private readonly ISpecification<TEntity> spec2;

public OrSpecification(ISpecification<TEntity> spec1, ISpecification<TEntity> spec2)

this.spec1 = spec1; this.spec2 = spec2;

public override bool IsSatisfiedBy(TEntity candidate)

return spec1.IsSatisfiedBy(candidate) || spec2.IsSatisfiedBy(candidate);

public class NotSpecification<TEntity> : CompositeSpecification<TEntity> { private readonly ISpecification<TEntity> wrapped;

public NotSpecification(ISpecification<TEntity> spec)

wrapped = spec;

public override bool IsSatisfiedBy(TEntity candidate)

return !wrapped.IsSatisfiedBy(candidate);

Припустимо, що виникли наступні задачі: знайти користувачів, за їх статусом знайти користувачів по імені, за введеним значенням

Тоді конкретні специфікації матимуть наступний вигляд

Використання матиме наступний вигляд:

Покращена версія

При використанні із LINQ специфікації можна обгортати у функції, або ж забезпечити специфікації такою функціональністю:

Див. також Шаблони проєктування програмного забезпечення Об'єктно-орієнтоване програмування

Джерела Патерн проєктування Специфікація Специфікація, як заміна репозиторію