Разделите свое приложение, извлекая многоразовые бизнес-требования

Мы ведем процесс набора на стажировку в ИТ-отдел для стартапа. Мы получили несколько заявок, но не все подходят под идеального кандидата, которого мы хотим нанять. Он / она должен быть молодым студентом или недавним выпускником и иметь опыт работы не менее года. Мы работаем над государственным проектом, и требование клиента - чтобы у кандидатов не было криминального прошлого. Эти правила будут отличаться по времени и в зависимости от должности и проекта. Более того, мы хотим иметь возможность изменять их независимо от других частей нашей системы. Это звучит как работа для шаблона спецификации.

Мы извлечем все бизнес-требования и сверим их со списком кандидатов. Каждая из наших спецификаций будет иметь простой общий интерфейс.

Мы будем использовать упрощенную модель для профиля кандидата с данными, передаваемыми непосредственно через конструктор.

Каждое из наших требований к кандидатам может быть заключено в отдельную независимую Спецификацию. Следовательно, у нас будут AgeSpecification, WorkExperienceSpecification, StudentSpecification, RecentGraduateSpecification и ConvictedSpecification.

У нас есть все правила. Теперь нам нужно найти способ использовать их вместе. Спецификация, которая объединяет несколько других, обычно называется составной спецификацией. Мы можем использовать логические операторы, чтобы объединить их в более сложный, соответствующий нашим потребностям.

Мы создали правила и механизмы, чтобы использовать их вместе. Все, что осталось, - это создать Спецификацию, которая отвечает всем требованиям для набора на нашу стажировку. Сейчас у нас есть три кандидата, которых мы должны рассмотреть и пригласить на собеседование только избранных.

Теперь мы знаем, что только два кандидата соответствуют всем нашим критериям. Первого, к сожалению, нельзя пригласить на собеседование.

Шаблон проектирования спецификации может быть очень полезным и помочь сделать наш код более чистым, менее связанным и более пригодным для повторного использования. Тем не менее, чрезмерное использование этого шаблона может привести к ненужной сложности.

Исходный код

Полный исходный код и некоторые другие шаблоны доступны здесь:



Использованная литература:

  • Эрик Эванс (2004 г.), «Доменно-ориентированный дизайн»

Если вы хотите изучить еще несколько шаблонов проектирования, вы можете найти их в следующих статьях: