2012-04-08 22 views
7

मुझे आम तौर पर स्थिर तरीकों का कितनी बार उपयोग करना चाहिए? मैं की तरह है, तो:स्थैतिक विधि बनाम ऑब्जेक्ट विधि का उपयोग

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

या

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 

मैं एक वर्ग के स्थिर विधि बुला और पहले उदाहरण की तरह वर्ग की एक वस्तु में उत्तीर्ण होने की एक प्रवृत्ति आ रही है?

इन दो उदाहरणों से संबंधित सबसे अच्छा अभ्यास क्या है? क्या कोई प्रदर्शन, डिज़ाइन और सामान्य प्रथाओं पर ध्यान देना चाहिए जिन पर मुझे ध्यान देना चाहिए? मुझे आम तौर पर किस का उपयोग करना चाहिए और आप प्रत्येक दिन कोडिंग परिदृश्यों में किस तरह से चयन करेंगे। पहला उदाहरण पढ़ने के लिए और अधिक सरल लगता है (आप सभी पैरामीटर पास करते हैं और कुछ करते हैं), दूसरे में आपको दो बार पढ़ना होगा कि आप किसी ऑब्जेक्ट पर काम कर रहे हैं?

यह वास्तव में एक बड़ा सौदा नहीं है, बस सोच रहा है।

उत्तर

11

आम तौर पर, स्थिर विधियों का उपयोग केवल तभी किया जाना चाहिए जब आप जो भी करना चाहते हैं वह कक्षा के किसी एक उदाहरण से स्वतंत्र है। यदि आपको किसी विशेष घटना की स्थिति को सीधे एक्सेस या प्रभावित करने की आवश्यकता है, तो गैर-स्थैतिक विधि आमतौर पर जाने का तरीका होता है।

+1

सहमत हुए। बेशक हमेशा अपवाद होते हैं, लेकिन सामान्य रूप से, यदि आप कक्षा ए के एक स्थिर तरीके से कक्षा ए के उदाहरण को पारित करते हैं, तो आप शायद इसे गलत कर रहे हैं। –

+0

उन मामलों में क्या है जहां आप कक्षा ए के दो उदाहरणों को एक ऐसे तरीके से पारित कर रहे हैं जहां न तो उदाहरण 'मालिक' है या ऑपरेशन में प्राथमिकता लेता है? –

+1

आपका मतलब एक कम्यूटिव बाइनरी ऑपरेशन की तरह है? मैंने इसे दोनों तरीकों से देखा है, लेकिन शायद अभी भी एक गैर स्थैतिक विधि का उपयोग करेगा। – Taymon

0

यदि आपको ऑब्जेक्ट की आवश्यकता है, तो मुझे लगता है कि आपको "_class34.DoSomething (पैरामीटर 1, पैरामीटर 2, पैरामीटर 3, पैरामीटर) जैसे कॉल करना चाहिए।"

जब आप इसे पढ़ते हैं तो यह है: ऑब्जेक्ट पर _Class34, कुछ पैरामीटर के साथ कुछ करें।

2

कोई "अधिक बार" उत्तर नहीं है।
यह सब उपयोग के प्रकार पर निर्भर करता है।

नीचे की रेखा है: यदि निर्दिष्ट वर्ग का कोई ऑब्जेक्ट प्रभावित/उपयोग किया जाता है, तो आपको हमेशा गैर स्थैतिक तरीकों का उपयोग करना चाहिए। हालांकि, यदि प्रभावित/उपयोग किए जाने वाले वर्ग का कोई भी उदाहरण नहीं है, तो आपको हमेशा स्थिर तरीकों का उपयोग करना चाहिए।

आपके उदाहरण में आप Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4) कर रहे हैं जो एक अच्छा दृष्टिकोण नहीं है, क्योंकि यह सभी संभावनाओं को दूर करता है ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग आपको (जैसे पॉलिमॉर्फिज्म इत्यादि) देता है।

एक परिदृश्य के लिए एक अच्छा उदाहरण जहां एक स्थिर कार्य की आवश्यकता होगी, स्ट्रिंग.पर्स जैसे कारखाने के तरीके हैं - जो स्ट्रिंग के किसी विशिष्ट उदाहरण के बिना शुरू होते हैं, फिर भी स्ट्रिंग क्लास से जुड़े होते हैं।

+0

एक और आम उदाहरण किसी ऑब्जेक्ट को फ़ाइल से लोड कर रहा है - जिसे अक्सर फ़ाइल से लोड ऑब्जेक्ट को लौटने वाले स्थिर के रूप में प्रत्यारोपित किया जाता है। – Ricibob

2

यह रनटाइम पहले से ही करता है, प्रत्येक इंस्टेंस विधि में एक छिपी हुई पहली तर्क है जो को पास करती है। एक विस्तार विधि के वाक्यविन्यास में उजागर।

स्पष्ट रूप से रनटाइम का काम करना विशेष रूप से उपयोगी नहीं है, सिंटैक्स को और अधिक वर्बोज़ मिलता है। और दर्दनाक जिस तरह से आपको आने वाला नाम दिया गया है। _class34 :) के बजाय केवल इस पर विचार करें

0

वस्तु उन्मुख प्रोग्रामिंग के पीछे पूरे विचार है आप somefunction(somestruct) लिखने के रूप में आप अतीत में क्या करना होगा की जरूरत नहीं है कि है, लेकिन आप somestruct.somefunction() बजाय लिख सकते हैं, जो इसे अधिक स्पष्ट करता है कि somefunction से somestruct संबंधित है।

बेशक आप इसे किसी भी तरह से कर सकते हैं, लेकिन याद रखें कि आपका दूसरा उदाहरण तरीका है, जिस कारण सदस्य कार्यों का आविष्कार किया गया था।

0

स्टेटिक सदस्य यूनिट परीक्षण को जटिल कर सकते हैं ताकि आपको सावधान रहना पड़े कि आप उनका उपयोग कैसे करते हैं।

ज्यादातर मामलों में, मैं स्थैतिक सदस्यों वाले वर्गों के लिए गैर स्थिर रैपर जोड़ने को समाप्त करता हूं अन्यथा मैं उन्हें नकल करने में सक्षम नहीं होता।

Static Methods are Death to Testability आपको इसका बेहतर विचार दे सकता है।

0

लेकिन डिफ़ॉल्ट रूप से मैं उदाहरण विधियों का उपयोग करता हूं। मैं केवल तभी उपयोग करता हूं जब यह उदाहरण विधियों की तुलना में अधिक समझ में आता है या जब कोई अन्य तरीका नहीं होता है। Statics का उपयोग इकाई परीक्षण जटिल हो सकता है। स्टेटिक विधियां जो स्थैतिक फ़ील्ड का भी उपयोग करती हैं वे मेमोरी लीक का एक संभावित स्रोत हैं (हां, यहां तक ​​कि .NET में भी)।

इसलिए उदाहरण के लिए मैं स्टैटिक्स का उपयोग जब मैं और अधिक स्पष्ट क्या, निर्माण के दौरान होता है जब मैं एक फ़ाइल से यह deserializing द्वारा वस्तु बनाने की तरह बनाने के लिए एक विशेष निर्माण विधि करना चाहते हैं:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

कौन सा अधिक है पठनीय से:

MyClass myObject = new MyClass("serialized.xml"); 

इसके अलावा, मैं स्टैटिक्स तरीकों (और सदस्य) का उपयोग जब मैं सभी उदाहरणों के बीच कुछ वर्ग चौड़ा राज्य जानकारी साझा करना चाहते।

बेशक स्थिर सदस्य एक जरूरी है जब आपकी पूरी कक्षा स्थिर हो।

संबंधित मुद्दे