Tingkat perbedaan antara jawaban di sini menunjukkan mengapa itu akan menjadi konsep yang sulit untuk dipahami tetapi untuk membuatnya sesederhana yang saya bisa gambarkan:
Agar saya tahu bahwa jika saya melempar bola kepada Anda, maka Anda dapat menangkapnya, saya benar-benar tidak perlu tahu berapa usia Anda. Saya tidak perlu tahu apa yang Anda makan untuk sarapan, dan saya benar-benar tidak peduli siapa orang pertama yang Anda sukai. Yang perlu saya ketahui adalah Anda bisa menangkapnya. Jika saya tahu ini, maka saya tidak peduli jika Anda, saya melemparkan bola kepada Anda atau saudara Anda.
Dengan bahasa non-dinamis seperti c # atau Java dll, kami menyelesaikan ini melalui Antarmuka. Jadi katakanlah kita memiliki antarmuka berikut:
public ICatcher
{
public void Catch();
}
Dan sekarang katakanlah kita memiliki kelas berikut:
public CatcherA : ICatcher
{
public void Catch()
{
console.writeline("You Caught it");
}
}
public CatcherB : ICatcher
{
public void Catch()
{
console.writeline("Your brother Caught it");
}
}
Sekarang CatcherA dan CatcherB mengimplementasikan metode Catch, sehingga layanan yang membutuhkan Catcher dapat menggunakan keduanya dan tidak benar-benar peduli. Jadi layanan yang digabungkan secara ketat mungkin secara langsung memulai contoh yang tertangkap
public CatchService
{
private CatcherA catcher = new CatcherA();
public void CatchService()
{
catcher.Catch();
}
}
Jadi CatchService dapat melakukan apa yang telah ditetapkan untuk dilakukan, tetapi menggunakan CatcherA dan akan selalu menggunakan CatcherA. Keras dikodekan, jadi tetap di sana sampai seseorang datang dan refactor itu.
Sekarang mari kita ambil opsi lain, yang disebut injeksi ketergantungan:
public CatchService
{
private ICatcher catcher;
public void CatchService(ICatcher catcher)
{
this.catcher = catcher;
catcher.Catch();
}
}
Jadi teman-teman yang berhubungan dengan CatchService dapat melakukan hal berikut:
CatchService catchService = new CatchService(new CatcherA());
atau
CatchService catchService = new CatchService(new CatcherB());
Ini berarti bahwa layanan Catch tidak digabungkan dengan CatcherA atau CatcherB.
Ada beberapa strategi lain untuk layanan kopling longgar seperti ini seperti penggunaan kerangka kerja IOC dll.