Возможно вам уже приходилось слышать такие волшебные слова как Инверсия управления, внедрение зависимости, DIP принцип в SOLID, или хотя бы простейший паттерн Стратегия, про который на моем любимом канале ExtremeCode есть отдельное видео. Все эти понятия объединяет один главный принцип - уменьшение связности классов путем использования интерфейсов.
Я тоже далеко не сразу осознал преимущества этого подхода. Но сейчас я для себя выделил три главных принципа, которые мотивируют меня использовать внедрение зависимостей везде, где это возможно:
1. Легкость изменения
Чаще всего код приходится менять и переписывать. При этом старые реализации иногда терять тоже не хочется. Определив интерфейс и делая в других классах зависимость именно от интерфейса это сделать очень легко. Просто создаешь новый класс, реализующий тот же самый интерфейс и забываешь про предыдущий. Достаточно просто поменять в одном месте внедрение новой реализации вместо предыдущей.
2. Возможность параллельной разработки
Большинство проектов сейчас реализуются в командах. И достаточно часто приходится ждать пока другой разработчик завершит свой кусок кода, чтобы ты мог начать его использовать у себя. Или наоборот, кому-то приходится ждать тебя. Но объявление интерфейса занимает куда меньше времени, чем сама реализация, но этого уже достаточно, чтобы не тормозить других.
3. Возможность тестирования
Как же легко и приятно делать mock-тесты, когда используешь интерфейсы. Просто при конфигурации подменяешь реализации на тестовые и проверяешь основной ход и логику твоего кода на корректность. Экономит кучу времени и сил.
Для тех, кто заинтересовался этой темой, но еще не знаком с ней могу рекомендовать ознакомиться с Simple Injector. Это удобный и простой DI-контейнер, который я сам использую ежедневно.
А ты используешь внедрение зависимостей на практике ну или хотя бы знаком с этим принципом?