Как мне реализовать сложную бизнес-логику? - PullRequest
2 голосов
/ 23 августа 2011

У меня есть сценарий, когда я обрабатываю очередь MailItems. Как только я обработал каждый MailItem, мне нужно обновить состояние MailItem. Логика обновления статуса довольно сложная. Я думаю, что мне не следует инкапсулировать саму логику внутри класса MailItem, а вместо этого инкапсулировать ее в отдельный класс для упрощения обслуживания в будущем.

Поэтому мой вопрос, каков наилучший способ сделать это?

Я рассмотрел шаблон спецификации. Мое исследование этого шаблона состоит в том, что он зависит от интерфейса ISpecification, определенного следующим образом:

public interface ISpecification<T>
{
   bool IsSatisfiedBy(T candidate);
}

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

Итак, моя подпись метода на MailItem должна выглядеть примерно так:

public void ChangeStatus(bool mailSentSuccessfully)

Стандартный интерфейс ISpecification не предназначен для передачи внешнего значения. Должен ли я просто «согнуть» стандартную реализацию или это нарушит «правила» определения шаблона? Если это не ответ, на какие другие варианты, основанные на шаблонах, я могу посмотреть?

1 Ответ

1 голос
/ 23 августа 2011

Вы можете использовать шаблон спецификации как таковой, просто используя тип для вашего кандидата, который включает в себя другой объект, то есть, проверку сборки для пары путем расширения ISpecification<Pair<MainType,ExternalType>>.

Если вы не работаете на языке, который уже предоставляет тип Pair или Tuple, вам, конечно, придется его создать, чтобы использовать эту тактику.

Если это не сработает для вас, то, конечно, можно создать свой собственный вариант шаблона. Это действительно не правила дизайна, а ориентиры.

...