การพึ่งพาการผกผันใน OOP หมายความว่าคุณใช้รหัสกับอินเทอร์เฟซซึ่งมีให้โดยการนำไปใช้ในวัตถุ
ภาษาที่รองรับฟังก์ชั่นภาษาที่สูงกว่ามักจะสามารถแก้ไขปัญหาการพึ่งพิงแบบผกผันได้ง่าย ๆ โดยการส่งผ่านพฤติกรรมเป็นฟังก์ชันแทนที่จะเป็นวัตถุที่ใช้อินเทอร์เฟซใน OO-sense
ในภาษาดังกล่าวลายเซ็นของฟังก์ชั่นสามารถกลายเป็นอินเตอร์เฟซและฟังก์ชั่นจะถูกส่งผ่านแทนวัตถุดั้งเดิมเพื่อให้พฤติกรรมที่ต้องการ หลุมในรูปแบบกลางเป็นตัวอย่างที่ดีสำหรับเรื่องนี้
มันช่วยให้คุณบรรลุผลลัพธ์เดียวกันโดยมีโค้ดน้อยลงและมีความหมายมากขึ้นเนื่องจากคุณไม่จำเป็นต้องใช้คลาสทั้งหมดที่สอดคล้องกับอินเทอร์เฟซ (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);
แน่นอนสิ่งนี้สามารถทำได้โดย LinQ ใน C # ฉันเพิ่งใช้ตัวอย่างนี้เพื่อแสดงให้เห็นว่ามันง่ายและยืดหยุ่นมากขึ้นในการใช้ฟังก์ชันลำดับที่สูงขึ้นแทนที่จะเป็นวัตถุที่ใช้อินเทอร์เฟซ