मैं हाल ही में वर्ग है जो मैं पर नियंत्रण (यानी पर सहायक उपयोगिताओं लागू करने के लिए विस्तार तरीकों का उपयोग कर के विचार के साथ किया गया है पर विस्तार तरीकों का उपयोग करने के लिए है, एक ही कार्यक्रम में हैं और मैं यह कर सकते हैं संशोधित)। इसके पीछे तर्क यह है कि कई बार, इन सहायक उपयोगिताओं का उपयोग बहुत विशिष्ट परिदृश्यों में किया जाता है और कक्षाओं के आंतरिक मूल्यों तक पहुंच की आवश्यकता नहीं होती है।यह स्वीकार्य एक वर्ग है जो आप संशोधित कर सकते हैं
उदाहरण के लिए, मान लीजिए कि मैं एक StackExchange वर्ग डालते हैं। इसमें PostQuestion
और Search
और AnswerQuestion
जैसी विधियां होंगी।
अब, क्या हुआ अगर मैं मैन्युअल रूप से मेरी प्रतिष्ठा की गणना करने के लिए सुनिश्चित करें कि StackOverflow मुझे धोखा दे नहीं है चाहता था। मैं की तर्ज पर कुछ को लागू होता है: मैं StackExchange वर्ग के लिए एक विधि जोड़ सकते हैं
int rep=0;
foreach(var post in StackExchangeInstance.MyPosts)
{
rep+=post.RepEarned;
}
है, लेकिन यह किसी भी आंतरिक की आवश्यकता नहीं है, और यह केवल इस कार्यक्रम के एक या दो अन्य भागों से प्रयोग किया जाता है ।
अब कल्पना करें कि इसके बजाय आपके पास इन विशिष्ट सहायक तरीकों में से 10 या 20 थे। निश्चित रूप से एक निश्चित परिदृश्य में उपयोगी, लेकिन निश्चित रूप से सामान्य मामले के लिए नहीं। मेरे विचार की तरह
namespace Mynamespace.Extensions.RepCalculations
{
public static RepCalcExtensions
{
public static int CalcRep(this Stackexchange inst){...}
}
}
नोट नाम स्थान
public static RepCalcHelpers
{
public static int CalcRep(StackExchange inst){ ... }
}
की तरह कुछ बदल रहा है कुछ करने के लिए। मैं आदर्श रूप से एक निश्चित परिदृश्य के भीतर समूह विस्तार विधियों के लिए इसका उपयोग करता हूं। उदाहरण के लिए, "RepCalculations", "सांख्यिकी", आदि के लिए
मैं अगर पैटर्न के इस प्रकार सब के बारे में सुना है के लिए खोज की कोशिश की है, और कुछ भी लेकिन कक्षाओं के लिए इस्तेमाल किया जा रहा विस्तार के तरीकों का कोई सबूत नहीं मिला है आप संशोधित नहीं कर सकते।
इस "पैटर्न" के साथ क्या कमियां हैं? क्या मैं इसके बजाय विरासत या संरचना, या सिर्फ एक अच्छा ओल 'स्थिर सहायक वर्ग के लिए चिपकना चाहिए?
विस्तार विधि का उपयोग तब किया जाना चाहिए जब आप मूल वर्ग को संशोधित नहीं कर सकते। यदि आप कक्षा को कार्यान्वित करने वाले हैं, तो मैं अतिरिक्त मूल्य देखने में विफल रहता हूं। यदि आप विधियों को एक अलग कोड फ़ाइल में रखना चाहते हैं, तो आप 'आंशिक' कीवर्ड का उपयोग कर सकते हैं। –
बस स्पष्ट करने के लिए, आप ऐसा करेंगे ताकि आप किनारे-केस एक्सटेंशन विधियों वाले विशिष्ट 'उपयोग' कथनों सहित कुछ फ़ंक्शंस छुपा सकें ?? बहुत ही रोचक! –
आप [यह] (http://stackoverflow.com/a/551600/649524) लिंक देख सकते हैं जो विस्तार विधियों के पेशेवर/विपक्ष को निर्दिष्ट करता है – Tilak