हां, अधिभार आसानी से अधिक उपयोग किया जा सकता है।
मुझे पता चला है कि एक ओवरलोड लोड किया गया है या नहीं, यह दर्शकों को विचार करना है - संकलक नहीं, लेकिन रखरखाव प्रोग्रामर जो सप्ताह/महीनों/वर्षों में साथ आ रहे हैं और समझना है कोड क्या हासिल करने की कोशिश कर रहा है।
GetProducts() जैसे एक साधारण विधि का नाम स्पष्ट और समझा जा सकता है, लेकिन यह बहुत असीमित छोड़ देता है।
कई मामलों में, यदि GetProducts() को पारित पैरामीटर अच्छी तरह से नामित किया गया है, तो रखरखाव लड़का ओवरलोड करने के लिए काम करने में सक्षम होगा - लेकिन यह उपयोग के बिंदु पर अच्छे नामकरण अनुशासन पर निर्भर है, जिसे आप कर सकते हैं लागू नहीं है। जो आप लागू कर सकते हैं वह वह तरीका है जिसका नाम वे बुला रहे हैं।
दिशानिर्देश जो मैं पालन करता हूं वह केवल अधिभार योग्य तरीकों से है यदि वे एक-दूसरे से काम करते हैं। इस तरह, मुझे कोई फर्क नहीं पड़ता कि मेरे वर्ग के उपभोक्ता किस संस्करण का आह्वान करते हैं, क्योंकि वे बराबर हैं।
समझाने के लिए, मैं खुशी से एक DeleteFile() विधि के लिए भार के उपयोग करेंगे:
public IList<Product> GetProductById(int productId) {...}
public IList<Product> GetProductByCategory(Category category) {...}
public IList<Product> GetProductByName(string Name) {...}
पूर्ण होने:
void DeleteFile(string filePath);
void DeleteFile(FileInfo file);
void DeleteFile(DirectoryInfo directory, string fileName);
हालांकि, अपने उदाहरण के लिए, मैं अलग नामों का उपयोग करें नाम रखरखाव लड़के के लिए कोड को और अधिक स्पष्ट बनाता है (जो मुझे भी हो सकता है)। यह होने हस्ताक्षर टक्कर के साथ मुद्दों से बचा जाता:
// No collisions, even though both methods take int parameters
public IList<Employee> GetEmployeesBySupervisor(int supervisorId);
public IList<Employee> GetEmployeesByDepartment(int departmentId);
वहाँ भी एक उद्देश्य के लिए अधिक भार पेश करने का अवसर है:
// Examples for GetEmployees
public IList<Employee> GetEmployeesBySupervisor(int supervisorId);
public IList<Employee> GetEmployeesBySupervisor(Supervisor supervisor);
public IList<Employee> GetEmployeesBySupervisor(Person supervisor);
public IList<Employee> GetEmployeesByDepartment(int departmentId);
public IList<Employee> GetEmployeesByDepartment(Department department);
// Examples for GetProduct
public IList<Product> GetProductById(int productId) {...}
public IList<Product> GetProductById(params int[] productId) {...}
public IList<Product> GetProductByCategory(Category category) {...}
public IList<Product> GetProductByCategory(IEnumerable<Category> category) {...}
public IList<Product> GetProductByCategory(params Category[] category) {...}
कोड एक बहुत अधिक की तुलना में यह लिखा है पढ़ने के लिए है - भले ही आप कभी नहीं आ स्रोत नियंत्रण में प्रारंभिक जांच के बाद कोड पर वापस, आप अभी भी कोड के उस पंक्ति को पढ़ने के लिए दो दर्जन बार पढ़ रहे हैं, जबकि आप निम्न कोड लिखते हैं।
आखिरकार, जब तक आप फेंकने वाले कोड नहीं लिख रहे हैं, तो आपको अन्य लोगों से अन्य कोडों को कॉल करने की अनुमति देने की आवश्यकता है। ऐसा लगता है कि अधिकांश व्यवसायिक प्रणालियां अपने उपयोग के अनुसार तारीख में अच्छी तरह से उत्पादन में रहती हैं। ऐसा हो सकता है कि 2016 में आपकी कक्षा का उपभोग करने वाला कोड वीबीएनईटी, सी # 6.0, एफ # या कुछ नया रूप से लिखा गया है जिसका अभी तक आविष्कार नहीं हुआ है। यह हो सकता है कि भाषा ओवरलोड का समर्थन नहीं करती है।
कई उदाहरणों के साथ बहुत अच्छी पोस्ट। धन्यवाद! – Armstrongest
+1 हां, वास्तव में उपयोगी पोस्ट, चीयर्स! – andy
+1 उत्कृष्ट सलाह, पूरी तरह से सहमत हैं। वास्तविक आवश्यकता के बिना विधि अधिभार बुरा है। मैं इसे जोड़ता हूं (जावा में कम से कम) यह सेटर्स – leonbloy