Специфікація — це шаблон проєктування, який представляє бізнес логіку у вигляді ланцюжка об'єктів зв'язних операцій булевої логіки.
Переваги та недоліки
Переваги
логіка фільтрації об'єктів винесена в окремі класи-специфікацій, які можна, без втрат в гнучкості системи, об'єднювати між собою
Недоліки
важкий в реалізації
Опис мовою 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 специфікації можна обгортати у функції, або ж забезпечити специфікації такою функціональністю:
Див. також Шаблони проєктування програмного забезпечення Об'єктно-орієнтоване програмування
Джерела Патерн проєктування Специфікація Специфікація, як заміна репозиторію