Dependency Inversion dalam OOP berarti Anda mengkodekan terhadap antarmuka yang kemudian disediakan oleh implementasi dalam suatu objek.
Bahasa yang mendukung fungsi bahasa yang lebih tinggi sering dapat memecahkan masalah inversi ketergantungan sederhana dengan meneruskan perilaku sebagai fungsi alih-alih objek yang mengimplementasikan antarmuka dalam OO-sense.
Dalam bahasa seperti itu, tanda tangan fungsi dapat menjadi antarmuka dan fungsi dilewatkan sebagai ganti objek tradisional untuk memberikan perilaku yang diinginkan. Lubang di pola tengah adalah contoh yang baik untuk ini.
Ini memungkinkan Anda mencapai hasil yang sama dengan kode lebih sedikit dan lebih ekspresif, karena Anda tidak perlu mengimplementasikan seluruh kelas yang sesuai dengan antarmuka (OOP) untuk memberikan perilaku yang diinginkan untuk penelepon. Sebagai gantinya, Anda hanya bisa melewatkan definisi fungsi sederhana. Singkatnya: Kode seringkali lebih mudah dipelihara, lebih ekspresif, dan lebih fleksibel ketika seseorang menggunakan fungsi urutan yang lebih tinggi.
Contoh dalam C #
Pendekatan tradisional:
public IEnumerable<Customer> FilterCustomers(IFilter<Customer> filter, IEnumerable<Customers> customers)
{
foreach(var customer in customers)
{
if(filter.Matches(customer))
{
yield return customer;
}
}
}
//now you've got to implement all these filters
class CustomerNameFilter : IFilter<Customer> /*...*/
class CustomerBirthdayFilter : IFilter<Customer> /*...*/
//the invocation looks like this
var filteredDataByName = FilterCustomers(new CustomerNameFilter("SomeName"), customers);
var filteredDataBybirthDay = FilterCustomers(new CustomerBirthdayFilter(SomeDate), customers);
Dengan fungsi urutan yang lebih tinggi:
public IEnumerable<Customer> FilterCustomers(Func<Customer, bool> filter, IEnumerable<Customers> customers)
{
foreach(var customer in customers)
{
if(filter(customer))
{
yield return customer;
}
}
}
Sekarang implementasi dan doa menjadi kurang rumit. Kami tidak perlu menyediakan implementasi IFilter lagi. Kami tidak perlu menerapkan kelas untuk filter lagi.
var filteredDataByName = FilterCustomers(x => x.Name.Equals("CustomerName"), customers);
var filteredDataByBirthday = FilterCustomers(x => x.Birthday == SomeDateTime, customers);
Tentu saja, ini sudah bisa dilakukan oleh LinQ di C #. Saya hanya menggunakan contoh ini untuk menggambarkan bahwa lebih mudah dan lebih fleksibel untuk menggunakan fungsi urutan yang lebih tinggi daripada objek yang mengimplementasikan antarmuka.