Здравствуйте, Хабровчане!
Я новичок, пишу на с++. Недавно решил поглубже разобраться в Архитектуре ПО, купил книжечку "Чистая Архитектура" Роберта Мартина. В целом материал понятен, но есть одна вещь, которую я либо пропустил, либо не понял. Суть проблемы:
Допустим, я создаю на с++ приложение Application.exe и библиотеку Service.dll. Ну или их Linux аналоги с соответствующими расширениями - это неважно. Важно то, что у нас есть два компонента, причем, следуя материалу из книги, компонент Application не должен ничего знать о компоненте Service - что буквально значит, что в проекте Application не должно быть #include файлов из проекта Service, а в обратном порядке включать файлы мы уже можем.
Делается это путем создания в Application интерфейса IService, и реализации его в ServiceImpl.
Однако, если мы захотим создать экземпляр ServiceImpl со стороны Application, нам все равно придется ссылаться на ServiceImpl.h, что нарушает направление зависимости.
Для решения этой задачи применяется шаблон "фабрика" - объект, который порождает наш ServiceImpl, и отдает нам в виде ссылки на IService. Реализуется он так же, путем создания интерфейса и его реализации.
В итоге мы должны иметь такую картину:
И казалось бы - все хорошо, бери фабрику, и создавай объект ServiceImpl, при этом не завися от его внутреностей, и пользуйся на здоровье. Однако...
Тут и наступает момент, который я не понимаю: для того, чтобы создать Объект ServiceImpl мы используем фабрику, которую нужно тоже создать. А чтобы создать ее, нам нужно прописать буквально:
#include <IServiceFactory.h> // это окей
#include <ServiceFactoryImpl.h> // а это нет
...
IServiceFactory* factory = new ServiceFactoryImpl{};
Я вынужден ссылаться на ServiceFactiryImpl для создания фабрики. Но ведь это уже внутренние детали компонента Service! И это снова ломает направление зависимости.
Скажите, пожалуйста, что я делаю не так, и как этим пользоваться правильно?