Степень различия между ответами здесь показывает, почему было бы трудно понять концепцию, но изложить ее так просто, как я могу ее описать:
Чтобы я знал, что если я брошу тебе мяч, ты сможешь его поймать, мне действительно не нужно знать, сколько тебе лет. Мне не нужно знать, что вы ели на завтрак, и мне действительно все равно, кто был вашей первой страстью. Все, что мне нужно знать, это то, что вы можете поймать. Если я знаю это, то мне все равно, если это ты, я бросаю мяч тебе или твоему брату.
С помощью нединамических языков, таких как c #, Java и т. Д., Мы достигаем этого через интерфейсы. Допустим, у нас есть следующий интерфейс:
public ICatcher
{
public void Catch();
}
А теперь допустим, что у нас есть следующие классы:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Теперь и CatcherA, и CatcherB реализуют метод Catch, поэтому служба, для которой требуется Catcher, может использовать любой из них и на самом деле не знать, какой это. Таким образом, тесно связанная служба может непосредственно привести к
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Таким образом, CatchService может делать именно то, что он намеревался сделать, но он использует CatcherA и всегда будет использовать CatcherA. Он жестко закодирован, поэтому он остается там, пока кто-то не придет и не проведет рефакторинг.
Теперь давайте возьмем другую опцию, которая называется внедрением зависимости:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Таким образом, calss, который создает CatchService, может делать следующее:
CatchService catchService = new CatchService(new CatcherA());
или
CatchService catchService = new CatchService(new CatcherB());
Это означает, что служба Catch не тесно связана ни с CatcherA, ни с CatcherB.
Есть несколько других стратегий для слабого связывания сервисов, таких как использование инфраструктуры IoC и т. Д.