Разделите свое приложение, извлекая многоразовые бизнес-требования
Мы ведем процесс набора на стажировку в ИТ-отдел для стартапа. Мы получили несколько заявок, но не все подходят под идеального кандидата, которого мы хотим нанять. Он / она должен быть молодым студентом или недавним выпускником и иметь опыт работы не менее года. Мы работаем над государственным проектом, и требование клиента - чтобы у кандидатов не было криминального прошлого. Эти правила будут отличаться по времени и в зависимости от должности и проекта. Более того, мы хотим иметь возможность изменять их независимо от других частей нашей системы. Это звучит как работа для шаблона спецификации.
Мы извлечем все бизнес-требования и сверим их со списком кандидатов. Каждая из наших спецификаций будет иметь простой общий интерфейс.
Мы будем использовать упрощенную модель для профиля кандидата с данными, передаваемыми непосредственно через конструктор.
Каждое из наших требований к кандидатам может быть заключено в отдельную независимую Спецификацию. Следовательно, у нас будут AgeSpecification
, WorkExperienceSpecification
, StudentSpecification
, RecentGraduateSpecification
и ConvictedSpecification
.
У нас есть все правила. Теперь нам нужно найти способ использовать их вместе. Спецификация, которая объединяет несколько других, обычно называется составной спецификацией. Мы можем использовать логические операторы, чтобы объединить их в более сложный, соответствующий нашим потребностям.
Мы создали правила и механизмы, чтобы использовать их вместе. Все, что осталось, - это создать Спецификацию, которая отвечает всем требованиям для набора на нашу стажировку. Сейчас у нас есть три кандидата, которых мы должны рассмотреть и пригласить на собеседование только избранных.
Теперь мы знаем, что только два кандидата соответствуют всем нашим критериям. Первого, к сожалению, нельзя пригласить на собеседование.
Шаблон проектирования спецификации может быть очень полезным и помочь сделать наш код более чистым, менее связанным и более пригодным для повторного использования. Тем не менее, чрезмерное использование этого шаблона может привести к ненужной сложности.
Исходный код
Полный исходный код и некоторые другие шаблоны доступны здесь:
Использованная литература:
- Эрик Эванс (2004 г.), «Доменно-ориентированный дизайн»
Если вы хотите изучить еще несколько шаблонов проектирования, вы можете найти их в следующих статьях: