Я пытался следовать принципам внедрения зависимостей, но после прочтения этой статьи я знаю, что делаю что-то не так.
Вот моя ситуация: мое приложение получает разные типы физической почты. Вся входящая почта проходит через мой MailFunnel
объект.
Во время работы MailFunnel
получает различные типы сообщений извне: Box, Postcard и Magazine.
Каждый тип почты должен обрабатываться по-разному. Например, если приходит ящик, мне может понадобиться записать вес перед его доставкой. Следовательно, у меня есть BoxHandler
, PostcardHandler
и MagazineHandler
объекты.
Каждый раз, когда в мое MailFunnel
приходит новое сообщение, я создаю новый соответствующий MailHandler
объект.
Например:
class MailFunnel
{
void NewMailArrived( Mail mail )
{
switch (mail.type)
{
case BOX:
BoxHandler * bob = new BoxHandler(shreddingPolicy, maxWeightPolicy);
bob->get_to_work();
break;
case POSTCARD:
PostcardHandler * frank = new PostcardHandler(coolPicturePolicy);
frank->get_to_work();
break;
case MAGAZINE:
MagazineHandler * nancy = new MagazineHandler(censorPolicy);
nancy->get_to_work();
break;
}
}
private:
MaxWeightPolcy & maxWeightPolicy;
ShreddingPolicy & shreddingPolicy;
CoolPicturePolicy & coolPicturePolicy;
CensorPolicy & censorPolicy;
}
С одной стороны, это здорово, потому что это означает, что если я получу пять разных почтовых отправлений, у меня сразу же будет пять разных MailHandlers
, работающих одновременно, чтобы заниматься бизнесом. Тем не менее, это также означает, что я смешиваю создание объектов с логикой приложения - большое отрицательное отношение, когда дело доходит до внедрения зависимостей.
Кроме того, в моем MailFunnel
объекте есть все эти ссылки на политики, которые MailFunnel
действительно не нужны. Единственная причина, по которой у MailFunnel
есть эти объекты, - передать их конструкторам MailHandler
. Опять же, это еще одна вещь, которую я хочу избежать .
Все рекомендации приветствуются. Спасибо!