ओओपी में निर्भरता उलटने का मतलब है कि आप एक इंटरफ़ेस के खिलाफ कोड करते हैं जो किसी ऑब्जेक्ट में कार्यान्वयन द्वारा प्रदान किया जाता है।
उच्च भाषा के कार्यों का समर्थन करने वाली भाषाएं अक्सर एक वस्तु के बजाय एक फ़ंक्शन के रूप में व्यवहार को पारित करके सरल निर्भरता उलटा समस्याओं को हल कर सकती हैं जो ओओ-अर्थ में एक इंटरफ़ेस को लागू करती है।
ऐसी भाषाओं में, फ़ंक्शन का हस्ताक्षर इंटरफ़ेस बन सकता है और वांछित व्यवहार प्रदान करने के लिए एक पारंपरिक ऑब्जेक्ट के बजाय एक फ़ंक्शन पारित किया जाता है। मध्य पैटर्न में छेद इसके लिए एक अच्छा उदाहरण है।
यह है कि आप कम कोड और अधिक स्पष्टता के साथ एक ही परिणाम प्राप्त करते हैं, क्योंकि आपको कॉल करने वाले को वांछित व्यवहार प्रदान करने के लिए एक (OOP) इंटरफ़ेस के अनुरूप एक पूरी कक्षा को लागू करने की आवश्यकता नहीं है। इसके बजाय, आप केवल एक साधारण फ़ंक्शन परिभाषा पास कर सकते हैं। संक्षेप में: कोड अक्सर बनाए रखने के लिए आसान होता है, अधिक स्पष्ट और अधिक लचीला होता है जब कोई उच्च आदेश कार्यों का उपयोग करता है।
C # में एक उदाहरण
परंपरागत दृष्टिकोण:
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);
उच्च आदेश कार्यों के साथ:
public IEnumerable<Customer> FilterCustomers(Func<Customer, bool> filter, IEnumerable<Customers> customers)
{
foreach(var customer in customers)
{
if(filter(customer))
{
yield return customer;
}
}
}
अब कार्यान्वयन और आह्वान कम बोझिल हो जाते हैं। हमें अब एक IFilter कार्यान्वयन की आपूर्ति करने की आवश्यकता नहीं है। हमें अब फ़िल्टर के लिए कक्षाएं लागू करने की आवश्यकता नहीं है।
var filteredDataByName = FilterCustomers(x => x.Name.Equals("CustomerName"), customers);
var filteredDataByBirthday = FilterCustomers(x => x.Birthday == SomeDateTime, customers);
बेशक, यह पहले से ही C # में LinQ द्वारा किया जा सकता है। मैंने उदाहरण के लिए इस उदाहरण का उपयोग किया है कि यह उन वस्तुओं के बजाय उच्चतर ऑर्डर फ़ंक्शंस का उपयोग करना आसान और अधिक लचीला है जो एक इंटरफ़ेस लागू करते हैं।