OOP’daki Bağımlılık İnversiyonu, daha sonra bir nesnedeki bir uygulama tarafından sağlanan bir arayüze karşı kod yazdığınız anlamına gelir.
Yüksek dil işlevlerini destekleyen diller, davranışları OO anlamında bir arayüz uygulayan bir nesne yerine bir işlev olarak geçirerek basit bağımlılık inversiyon problemlerini çözebilirler.
Bu gibi dillerde, fonksiyonun imzası arayüz haline gelebilir ve istenen davranışı sağlamak için geleneksel bir nesne yerine bir fonksiyonun içine geçilir. Orta düzendeki delik bunun için iyi bir örnektir.
Arayan için istenen davranışı sağlamak için bir (OOP) arabirimine uyan bir sınıfı uygulamanız gerekmediğinden, aynı sonucu daha az kod ve daha etkileyici şekilde elde etmenizi sağlar. Bunun yerine, basit bir fonksiyon tanımını iletebilirsiniz. Kısacası: Kod, daha yüksek dereceli işlevler kullandığında bakımı daha kolay, daha etkileyici ve daha esnektir.
C # örneğinde
Geleneksel yaklaşım:
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);
Daha yüksek dereceli işlevlerle:
public IEnumerable<Customer> FilterCustomers(Func<Customer, bool> filter, IEnumerable<Customers> customers)
{
foreach(var customer in customers)
{
if(filter(customer))
{
yield return customer;
}
}
}
Şimdi uygulama ve çağrı daha az hantal hale geldi. Artık bir IFilter uygulaması tedarik etmemize gerek yok. Artık filtreler için sınıflar uygulamamız gerekmiyor.
var filteredDataByName = FilterCustomers(x => x.Name.Equals("CustomerName"), customers);
var filteredDataByBirthday = FilterCustomers(x => x.Birthday == SomeDateTime, customers);
Tabii ki, bu zaten C # ile LinQ tarafından yapılabilir. Bu örneği, bir arayüz uygulayan nesneler yerine daha yüksek dereceli işlevleri kullanmanın daha kolay ve daha esnek olduğunu göstermek için kullandım.