Внедрение зависимостей - это просто практика не жесткого кодирования зависимостей в компонент.Например,
class Service {
Collaborator c = new Collaborator()
}
для этого псевдокода жестко задан соавтор.Это трудно изменить.Если вы сделали
class Service {
Collaborator c;
Service(Collaborator c) {
this.c = c;
}
}
, то теперь вы можете «внедрить» нужного участника в компонент Service через конструктор.Нет жестко запрограммированной зависимости.
Это хорошо, так что вы можете легко менять реализации соавтора.Ваш код теперь «слабо связан» - нет жестких зависимостей от конкретных реализаций, только от типов и поведения.
Одним из применений этого является то, что теперь вы можете протестировать Service
, внедрив фиктивного соавтора вваш тест, так что вы можете проверить все функциональные возможности службы таким образом, чтобы не зависеть от соавтора.
На практике вы хотите, чтобы Collaborator
был интерфейсом (или любым другим эквивалентом, поддерживаемым выбранным вами языком), чтобы вы могли определить поведение и оставить реализацию вплоть до фактического введенного вами экземпляра.
Вторая часть вашего вопроса о насмешках над соавтором, который выполняет файловые операции, является правильной.Если вы издеваетесь над коллаборатором файловой системы, вы можете протестировать то, что использует коллаборатор изолированно, не затрагивая файловую систему