Я бы абстрагировал намерение, чтобы на самом деле не имело значения как реализовано или как организован исходный код. На базовом уровне у вас есть набор контролеров, генерирующих набор объяснений ошибок.
Псевдо-код будет в основном:
let reasons be a new, empty collection of failure reasons
let checkers be the list of relevant checkers
for each checker in checkers
if checker passes, continue
if checker fails, add explanation to reasons
if number of reasons is zero,
voucher is valid, success
if number of reasons > zero,
the voucher is invalid, format each element in reasons for display to the user
С этой логикой не имеет значения, как организованы контролеры, если они могут быть получены этой частью кода в списке. Вы можете иметь один метод с множеством проверок, возможно, добавив множество причин. У вас может быть много классов, по одному экземпляру каждого в списке шашек. Важно отметить, что фактические контролеры отделены от этой логики, и в любое время можно использовать разные контролеры (подумайте об изменении бизнес-правил или разных правил в разных регионах).
В зависимости от вашего языка, это, как минимум, потребует абстрагирования типа, используемого для шашек.
Начните с этого. Если вы обнаружите идентичные запросы к базе данных, начните рассматривать кэш для запуска набора контролеров.
Насколько организованы шашки на уровне источника ... это не имеет значения. Только абстракция делает. Детали достаточно гибкие, когда вы предоставляете уровень абстракции, который вы можете скрыть.
Плюсы:
- Бит, который выполняет проверку, не заботится о реальных, конкретных проверках (которые, вероятно, изменятся в зависимости от бизнес-правил).
- Шашки могут быть организованы так, как вы хотите: определены вместе в одном исходном файле или распределены по какой-то другой схеме. Это также дает свободу выделять одну проверку для тестирования.
- Коллекция и красивое форматирование должны быть реализованы только один раз, независимо от типа или количества проверок.
Минусы:
- Требуется время, чтобы достойно поработать над дизайном абстракций. Это, вероятно, окупится позже.
- Существует слой косвенности, который может усложнить понимание и отследить фактические проверки, которые проводятся. Гибкость в ущерб понятности. Это вещи, которые вы должны будете рассмотреть в своем сценарии. На мой взгляд, правила для ваучеров кажутся чем-то, что может со временем измениться, и абстракции здесь не сложны для понимания, поэтому я бы сказал, что оно того стоит.
Я потратил время на написание примера на Java, но на самом деле он мало что добавил. Если вы попытаетесь мыслить с точки зрения абстракции, реальный механизм менее важен.