क्या C # तरीके जो * * स्थिर हो सकते हैं? [बन्द है]


103

क्या C # विधियों को स्थिर किया जा सकता है जो स्थिर होनी चाहिए?

हम आज इस पर चर्चा कर रहे थे और मैं बाड़ की तरह हूँ। कल्पना कीजिए कि आपके पास एक लंबी विधि है जिसे आप कुछ लाइनों को रिफ्लेक्टर करते हैं। नई विधि संभवतः मूल विधि से कुछ स्थानीय चर लेती है और एक मान लौटाती है। इसका मतलब है कि यह स्थिर हो सकता है।

सवाल यह है: क्या यह स्थिर होना चाहिए ? यह डिजाइन या पसंद से स्थिर नहीं है, बस इसकी प्रकृति से यह किसी भी उदाहरण के मूल्यों को संदर्भित नहीं करता है।


1
काफी सटीक की नकल stackoverflow.com/questions/169378/...
JasonTrue

41
"काफी सटीक" एक ऑक्सीमोरोन है
मैट ब्रिग्स

1
उपकरणों के विज़ुअल स्टूडियो टूल, रिसर्पर , हाँ कहते हैं! :-)
रेबेका

@Junto शायद आपके संस्करण में, लेकिन मेरा कहना है कि स्थिर किया जा सकता है ...
Robbie Dee

जवाबों:


59

निर्भर करता है। वास्तव में 2 प्रकार के स्थिर तरीके हैं:

  1. विधियाँ जो स्थिर हैं क्योंकि वे हो सकती हैं
  2. वे विधियाँ जो स्थिर हैं क्योंकि वे होनी ही चाहिए

एक छोटे से मध्यम आकार के कोड आधार में आप वास्तव में दो तरीकों से परस्पर व्यवहार कर सकते हैं।

यदि आपके पास एक ऐसी विधि है जो पहली श्रेणी (कैन-बी-स्टैटिक) में है, और आपको इसे क्लास स्टेट एक्सेस करने के लिए बदलने की आवश्यकता है, तो यह जानने के लिए कि क्या यह संभव है कि स्टैटिक विधि को एक आवृत्ति विधि में बदलना संभव है।

एक बड़े कोड बेस में, हालांकि, कॉल साइटों की सरासर संख्या यह देखने के लिए खोज कर सकती है कि क्या स्टैटिक विधि को गैर-स्थिर एक में बदलना बहुत महंगा है। कई बार लोग कॉल की संख्या देखेंगे, और कहेंगे "ठीक है ... मैं बेहतर नहीं है कि इस पद्धति को बदल दें, बल्कि एक नया बनाएं जो मुझे चाहिए।"

इसका परिणाम यह हो सकता है:

  1. बहुत सारे कोड दोहराव
  2. विधि तर्कों की संख्या में विस्फोट

वो दोनों ही बातें बुरी हैं।

इसलिए, मेरी सलाह यह होगी कि यदि आपके पास 200K LOC पर एक कोड आधार है, तो मैं केवल विधियों को स्थिर बनाऊंगा यदि वे-स्टैटिक तरीके होने चाहिए।

नॉन-स्टैटिक से स्टैटिक में रिफैक्टिंग अपेक्षाकृत आसान है (केवल एक कीवर्ड जोड़ें), इसलिए यदि आप बाद में एक वास्तविक स्टेटिक में कैन-स्टैटिक बनाना चाहते हैं (जब आपको किसी इंस्टेंस के बाहर इसकी कार्यक्षमता की आवश्यकता होती है) तो आप कर सकते हैं। हालाँकि, उलटा रीफैक्टरिंग, कैन-स्टैटिक को एक इंस्टेंस विधि में बदलना MUCH अधिक महंगा है।

बड़े कोड आधारों के साथ विस्तार की आसानी के पक्ष में त्रुटि करना बेहतर है, न कि विचारशील शुद्धता के पक्ष पर।

इसलिए, बड़ी परियोजनाओं के लिए चीजों को तब तक स्थिर न करें जब तक आपको उनकी आवश्यकता न हो। छोटी परियोजनाओं के लिए, बस वही करें जो आपको सबसे अच्छा लगता है।


43

मैं होता नहीं है कि यह एक बनाने के सार्वजनिक की स्थैतिक सदस्य उस वर्ग । कारण यह है कि इसे सार्वजनिक स्थैतिक बनाने से वर्ग के प्रकार के बारे में कुछ कहा जा रहा है: न केवल यह कि "यह प्रकार जानता है कि इस व्यवहार को कैसे करना है", लेकिन यह भी "इस व्यवहार को करने के लिए इस प्रकार की जिम्मेदारी है।" और बाधाओं का व्यवहार अब बड़े प्रकार के साथ कोई वास्तविक संबंध नहीं है।

इसका मतलब यह नहीं है कि मैं इसे बिल्कुल भी स्थिर नहीं बनाऊंगा। अपने आप से यह पूछें: क्या नई विधि तार्किक रूप से कहीं और हो सकती है? यदि आप इसका जवाब "हां" में दे सकते हैं, तो आप शायद इसे स्थिर बनाना चाहते हैं (और इसे आगे भी बढ़ा सकते हैं)। यहां तक ​​कि अगर यह सच नहीं है, तो भी आप इसे स्थिर बना सकते हैं। बस इसे चिह्नित न करें public

सुविधा के रूप में, आप इसे कम से कम चिह्नित कर सकते हैं internal। यह आम तौर पर विधि को स्थानांतरित करने से बचता है यदि आपके पास अधिक उपयुक्त प्रकार तक आसान पहुंच नहीं है, लेकिन फिर भी इसे इस तरह से सुलभ छोड़ देता है जहां जरूरत होती है कि यह आपके वर्ग के उपयोगकर्ताओं के लिए सार्वजनिक इंटरफ़ेस के भाग के रूप में दिखाई न दे। ।


6
माना। मैं आम तौर पर इस तरह के मामले में "निजी स्थिर" विधि बनाता हूं।
हर्पो

6
मैं निजी स्थैतिक को भी नहीं मानूंगा। मुख्य बात यह है कि अपने आप से पूछें: क्या यह विधि तार्किक रूप से इस प्रकार के हिस्से के रूप में फिट होती है, या यह सिर्फ सुविधा के मामले के रूप में यहां है? यदि उत्तरार्द्ध, तो यह कहीं और बेहतर हो सकता है?
जोएल कोएहॉर्न

1
जैसे: "नई विधि तार्किक रूप से कहीं और हो सकती है" - यह संकेत है कि क्या यह स्थानीय स्थिति पर निर्भर नहीं करता है, शायद रिटर्न प्रकार वह कहाँ है?
एंडीएम

20

जरुरी नहीं।

सार्वजनिक विधियों को स्थैतिक से गैर-स्थैतिक में ले जाना एक ब्रेकिंग परिवर्तन है, और इसके लिए आपके सभी कॉलर्स या उपभोक्ताओं को परिवर्तनों की आवश्यकता होगी। यदि कोई विधि एक आवृत्ति विधि की तरह लगती है, लेकिन किसी भी उदाहरण के सदस्यों का उपयोग नहीं करने के लिए होती है, तो मैं यह सुझाव दूंगा कि इसे भविष्य के प्रमाण के रूप में एक आवृत्ति विधि बनाया जाए।


मुझे लगता है कि वह ज्यादातर निजी तरीकों की बात कर रहे हैं
जॉर्ज माउर

@ रे - सही, यह केवल गैर-निजी सदस्यों पर लागू होता है। मैंने इसे दर्शाने के लिए अपना उत्तर अपडेट किया।
माइकल

मेरे विचार बिल्कुल - सिर्फ इसलिए कि आप कुछ स्थिर कर सकते हैं इसका मतलब यह नहीं है कि आपके पास है या नहीं .....
marc_s

तो आप उन निजी तरीकों के लिए क्या करेंगे जो स्थिर किए जा सकते हैं?
रे

@ रे - संभवत: तब तक छोड़ देंगे जब तक मेरे पास स्थैतिक स्थानांतरित करने के लिए पर्याप्त पर्याप्त कारण नहीं है।
माइकल

13

हाँ। "यह स्थिर हो सकता है" इसका कारण यह है कि यह उस वस्तु की स्थिति पर काम नहीं करता है जिस पर इसे कहा जाता है। इसलिए यह एक उदाहरण विधि नहीं है, बल्कि एक वर्ग विधि है। यदि यह उदाहरण के लिए डेटा तक पहुंच के बिना ऐसा करने के लिए क्या कर सकता है, तो यह स्थिर होना चाहिए।


11

हाँ, यह चाहिए। युग्मन के विभिन्न मैट्रिक्स हैं जो यह मापते हैं कि आपकी कक्षा अन्य चीज़ों पर कैसे निर्भर करती है, जैसे अन्य वर्ग, विधियाँ, आदि। विधियों को स्थिर बनाना, युग्मन की डिग्री को बनाए रखने का एक तरीका है, क्योंकि आप सुनिश्चित कर सकते हैं कि कोई स्थैतिक विधि किसी भी संदर्भ में नहीं है। सदस्य हैं।


7
जरुरी नहीं। एक स्थिर विधि आवृत्ति जानकारी तक नहीं पहुंच पाएगी, जैसा कि आपने कहा, कोई सदस्य नहीं है, लेकिन यह अन्य वर्गों के साथ-साथ एक अन्य सामान्य विधि के साथ बातचीत करने में सक्षम है। स्थिर होने का मतलब यह नहीं है कि युग्मन कम हो, जरूरी है। हालाँकि, मैं आपकी बात समझ गया।
विक्टर रोड्रिग्स

इसके बजाय स्थिर वास्तविकता युग्मन को बढ़ाती है , क्योंकि आप वास्तव में उस स्थिर विधि तक सीमित हैं, उदाहरण के लिए इसे प्रभावित करने का कोई तरीका नहीं है और इस प्रकार व्यवहार को बदलने का कोई तरीका नहीं है।
हिमब्रोबेरे

8

मुझे लगता है कि अगर आप इसे स्टैटिक के रूप में चिह्नित करते हैं तो यह थोड़ा अधिक पठनीय हो जाएगा ... तब किसी ऐसे व्यक्ति को पता चलेगा कि यह पूरे फ़ंक्शन को पढ़ने के बिना किसी भी उदाहरण चर का संदर्भ नहीं देता है ...


6

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

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

निश्चित रूप से नकारात्मक पक्ष यह है कि यदि आप कभी भी यह पाते हैं कि आपके पहले के स्थिर तरीके को किसी कारण से राज्य तक पहुंचना होगा, तो आपको इसे बदलना होगा। अब मैं समझता हूं कि यह सार्वजनिक एपीआई के लिए एक समस्या हो सकती है इसलिए यदि यह किसी सार्वजनिक वर्ग में एक सार्वजनिक तरीका है, तो शायद आपको इस बारे में थोड़ा सा सोचना चाहिए। फिर भी, मैंने कभी भी वास्तविक दुनिया में एक सीटूटेशन का सामना नहीं किया है जहां यह वास्तव में एक समस्या थी, लेकिन शायद मैं सिर्फ भाग्यशाली हूं।

तो हाँ, हर तरह से इसके लिए जाओ।


1
एक स्थिर विधि में अभी भी राज्य तक पहुंच हो सकती है। यह केवल उस वस्तु से राज्य प्राप्त करता है जिसे इसे पारित किया गया है। इसके विपरीत, उदाहरण के क्षेत्रों में जरूरी नहीं कि परस्पर स्थिति हो।
जोर्जेन फॉग

6

स्टेटिक तरीके गैर-स्थिर लोगों की तुलना में तेज़ होते हैं इसलिए हाँ, उन्हें स्थिर होना चाहिए यदि वे कर सकते हैं और उन्हें गैर-स्थिर छोड़ने का कोई विशेष कारण नहीं है


3
यह तकनीकी रूप से सच है, लेकिन वास्तविक भौतिक अर्थों में नहीं। स्थिर / गैर के बीच का अंतर बहुत, बहुत कम ही प्रदर्शन का कारक होगा।
फोरकेडकर

22
-1: पाठ्यपुस्तक समयपूर्व अनुकूलन। सामान्य मामले के लिए स्थिर बनाम गैर-स्थिर का निर्णय लेते समय गति निश्चित रूप से पहला मापदंड नहीं होना चाहिए।
यकीन नहीं

2
नॉट श्योर से सहमत, यह आपका अंतिम कारण होना चाहिए कि कभी स्थिर बनाम नहीं पर विचार करें।
शमूएल

5
मेरी बात यह है कि गति सबसे खराब कारणों में से एक है, जो यह तय करने के लिए हो सकता है कि 99% मामलों में कोई फ़ंक्शन स्थिर बनाम गैर-स्थिर है या नहीं। जब ओओ डिजाइन की बात आती है तो कई और महत्वपूर्ण विचार सामने आते हैं, जिन पर अन्य पोस्ट विस्तृत हैं।
यकीन नहीं है कि

2
@agnieszka: आम तौर पर स्थिर तरीकों के बजाय उदाहरण विधियों का उपयोग करने का विशेष कारण राज्य है। यदि आप विधियों को स्थैतिक छोड़ देते हैं, तो एक जटिल अनुप्रयोग में आप बगों को पेश करेंगे, जो आपके बालों को फाड़ देगा। वैश्विक स्थिति, नस्ल की स्थिति, थ्रेड-सेफ्टी आदि को संशोधित करने के बारे में सोचें
सैंडर डेविडहाजी

5

मुझे आश्चर्य है कि कुछ लोग वास्तव में यहां एनकैप्सुलेशन का उल्लेख कर रहे हैं। एक इंस्टेंस मेथड अपने आप सभी प्राइवेट (इंस्टेंस) फील्ड्स, प्रॉपर्टीज और मेथड्स तक पहुंच जाएगा। बेस कक्षाओं से विरासत में प्राप्त सभी संरक्षित लोगों के अलावा।

जब आप कोड लिखते हैं तो आपको इसे लिखना चाहिए ताकि आप जितना संभव हो उतना कम उजागर करें और यह भी कि आपके पास जितना संभव हो उतना कम पहुंच हो।

तो हाँ, यह आपके कोड को तेज़ बनाने के लिए महत्वपूर्ण हो सकता है जो तब होगा जब आप अपने तरीकों को स्थिर बना रहे हैं, लेकिन आमतौर पर अधिक महत्वपूर्ण है तो यह है कि अपने कोड को यथासंभव बग बनाने में असमर्थ बना दें। इसे प्राप्त करने का एक तरीका यह है कि आपका कोड "निजी सामान" जितना संभव हो सके उतना कम हो।

यह पहली नज़र में अप्रासंगिक लग सकता है क्योंकि ओपी स्पष्ट रूप से रिफैक्टरिंग के बारे में बात कर रहा है जो इस परिदृश्य में गलत नहीं हो सकता है और किसी भी नए कीड़े पैदा कर सकता है, हालांकि इस रिफैक्ट किए गए कोड को भविष्य में बनाए रखा जाना चाहिए और संशोधित किया जाना चाहिए जो आपके कोड को एक बड़ा हमला करता है। सतह "नए बग के संबंध में अगर इसमें निजी उदाहरण के सदस्यों की पहुंच है। इसलिए सामान्य तौर पर मुझे लगता है कि यहाँ निष्कर्ष यह है कि "हाँ ज्यादातर आपके तरीके स्थिर होने चाहिए" जब तक कि उनके स्थैतिक न होने के कोई अन्य कारण न हों। और यह सिर्फ इसलिए कि यह "एनकैप्सुलेशन और डेटा छिपाने का बेहतर उपयोग है और 'सुरक्षित' कोड बनाता है" ...


4

केवल कुछ स्थिर करना क्योंकि आप एक अच्छा विचार नहीं हैं। स्थैतिक विधियों को उनके डिजाइन के कारण स्थिर होना चाहिए, न कि अस्थिरता के कारण।

जैसे माइकल ने कहा, इसे बाद में बदलने से इसका उपयोग करने वाले कोड टूट जाएंगे।

उस ने कहा, ऐसा लगता है कि आप उस वर्ग के लिए एक निजी उपयोगिता फ़ंक्शन बना रहे हैं जो वास्तव में, डिजाइन द्वारा स्थिर है।


4

यदि आप कुछ लाइनों को रिफलेक्टर करने में सक्षम थे और परिणामी विधि स्थिर हो सकती है, तो यह संभवतः एक संकेत है कि आपके द्वारा उस विधि से निकाली गई रेखाएँ वर्ग में बिल्कुल भी नहीं हैं, और आपको उन्हें स्थानांतरित करने पर विचार करना चाहिए उनकी अपनी कक्षा।


2

व्यक्तिगत रूप से मेरे पास इसे स्थिर बनाने के अलावा कोई विकल्प नहीं होगा। इस मामले में Resharper एक चेतावनी जारी करता है और हमारे प्रधान मंत्री का एक नियम है "Resharper से कोई चेतावनी नहीं"।


1
आप अपनी पुनर्परिभाषित सेटिंग्स बदल सकते हैं: पी
बर्नहार्ड हॉफमैन

1
अगर यह इतना आसान होता तो हमें रेस्पर से कोई नुकसान नहीं होता ... कभी :)
प्रैंकस्टर

1

यह निर्भर करता है लेकिन आम तौर पर मैं उन तरीकों को स्थिर नहीं बनाता। कोड हमेशा बदल रहा है और शायद किसी दिन मैं उस फ़ंक्शन को आभासी बनाना चाहता हूं और इसे उपवर्ग में ओवरराइड कर सकता हूं। या शायद किसी दिन इसे उदाहरण चर का संदर्भ देना होगा। हर कॉल साइट को बदलना होगा तो उन बदलावों को करना मुश्किल होगा।


हाँ, लेकिन अगर किसी दिन आपको यह करने की आवश्यकता है, तो आप हमेशा इसे स्थिर नहीं बना सकते हैं। या क्या मैं कुछ न कुछ भूल रहा हूं?
रे

1
@ रे - मैं अपने उत्तर में इसे कवर करता हूं। स्थैतिक से गैर-स्थिर एक ब्रेकिंग परिवर्तन है, इसलिए सभी उपभोक्ताओं को संशोधित करने की आवश्यकता है। एक छोटे से कार्यक्रम के लिए कोई बड़ी बात नहीं है, लेकिन अगर यह दूसरों द्वारा खपत के लिए एक पुस्तकालय है तो इस पर ध्यान देना होगा।
माइकल

सभी कॉल साइटों को स्थैतिक विधि कॉल से सदस्य फ़ंक्शन कॉल में बदलना होगा।
ब्रायन सुनिश्चित

क्षमा करें, आपने मेरी टिप्पणी के बाद इसे जोड़ा। मेरे दिमाग में मैं निजी तरीकों के बारे में सोच रहा था, लेकिन यह सार्वजनिक तरीकों के लिए एक वैध बिंदु है।
रे

... या किसी दिन आप इसे बाहर फेंक सकते हैं। इन तर्कों के लिए मेरे लिए एक विधि नॉनस्टैटिक बनाने के लिए पर्याप्त अच्छा नहीं है।
२०:५० पर agnieszka

1

मेरा सुझाव है कि इसके बारे में सोचने का सबसे अच्छा तरीका यह है: यदि आपको एक वर्ग विधि की आवश्यकता है, जिसे तब बुलाया जाना चाहिए जब कक्षा का कोई भी उदाहरण तत्काल नहीं है, या किसी प्रकार की वैश्विक स्थिति को बनाए रखता है, तो स्थैतिक एक अच्छा विचार है। लेकिन सामान्य तौर पर, मेरा सुझाव है कि आपको सदस्यों को गैर-स्थिर बनाना पसंद करना चाहिए।


1

आपको अपने तरीकों और कक्षाओं के बारे में सोचना चाहिए:

  • आप उनका उपयोग कैसे करेंगे?
  • क्या आपको अपने कोड के विभिन्न स्तरों से उनके लिए बहुत सारे acces की आवश्यकता है?
  • क्या यह एक विधि / वर्ग है जिसका उपयोग मैं लगभग हर विचारशील परियोजना में कर सकता हूँ।

यदि अंतिम दो 'हां' हैं, तो आपका तरीका / वर्ग शायद स्थिर होना चाहिए।

सबसे अधिक इस्तेमाल किया जाने वाला उदाहरण शायद Mathवर्ग है। प्रत्येक प्रमुख OO भाषा में यह होता है और सभी विधियाँ स्थिर होती हैं। क्योंकि आपको कहीं भी, कभी भी, उदाहरण के बिना उनका उपयोग करने में सक्षम होना चाहिए।

एक और अच्छा उदाहरण Reverse()सी # में विधि है।
यह Arrayकक्षा में एक स्थिर विधि है । यह आपके सरणी के क्रम को उलट देता है।

कोड:

public static void Reverse(Array array)

यह कुछ भी वापस नहीं करता है, आपका सरणी उल्टा है, क्योंकि सभी सरणियाँ ऐरे वर्ग के उदाहरण हैं।


मठ एक बुरा उदाहरण है। मुझे लगता है कि यह बेहतर: newnumber = number.round (2) से newnumber = गणित.गोल (संख्या)
graffic

3
मैथ क्लास स्टैटिक क्लास का उपयोग करने का सही उदाहरण है। यही वह विषय है जिसके बारे में नहीं कि आप गोल संख्याओं को कैसे पसंद करते हैं ...
KdgDev

1

जब तक आप नई विधि को निजी स्थैतिक बनाते हैं तब तक यह परिवर्तन नहीं होता है। वास्तव में, FxCop में इस गाइड को इसके नियमों में से एक के रूप में शामिल किया गया है ( http://msdn.microsoft.com/en-us/library/ms245046(VS.80).aspx ), निम्न जानकारी के साथ:

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

यह कहा जा रहा है, डेविड कीन की पहली टिप्पणी अधिक संक्षेप में यह कहकर चिंताओं को संक्षेप में प्रस्तुत करती है कि यह वास्तव में प्रदर्शन लाभ के बारे में सही होने के बारे में अधिक है:

हालाँकि इस नियम को एक प्रदर्शन के मुद्दे के रूप में वर्गीकृत किया गया है, एक विधि को स्थिर बनाने का प्रदर्शन सुधार केवल 1% के आसपास है। बल्कि, यह अधिक शुद्धता वाला मुद्दा है जो अन्य उदाहरण के सदस्यों का उपयोग करने में अपनी विफलता से सदस्य में एक अपूर्ण या बग का संकेत दे सकता है। एक विधि स्थैतिक ( शेयरिंग इन विजुअल बेसिक) को चिह्नित करने से यह स्पष्ट हो जाता है कि इसका उद्देश्य उदाहरण की स्थिति को नहीं छूना है।


1

मैं निश्चित रूप से कुछ भी कर सकता हूं जिसे मैं एक अलग कारण से स्थिर कर सकता हूं:

स्टेटिक फ़ंक्शन, जब JIT'd, को "यह" पैरामीटर के बिना कहा जाता है। इसका मतलब है, उदाहरण के लिए, कि 3 पैरामीटर गैर-स्थिर फ़ंक्शन (सदस्य विधि) स्टैक पर 4 params के साथ धकेल दिया जाता है।

स्थिर फ़ंक्शन के रूप में संकलित समान फ़ंक्शन को 3 मापदंडों के साथ बुलाया जाएगा। यह जेआईटी के लिए रजिस्टर को मुक्त कर सकता है और स्टैक स्पेस को संरक्षित कर सकता है ...


1

मैं "केवल निजी विधियों को स्थिर बनाने" शिविर में हूँ। सार्वजनिक विधि बनाने से आप चाहते हैं कि युग्मन परिचय कर सकते हैं और परीक्षण क्षमता कम हो सकती है: आप एक सार्वजनिक स्थैतिक विधि को ठूंठ नहीं कर सकते।

यदि आप एक ऐसी विधि का परीक्षण करना चाहते हैं जो एक सार्वजनिक स्थैतिक विधि का उपयोग करती है, तो आप स्थैतिक विधि का भी परीक्षण करते हैं, जो कि आप नहीं चाहते हैं।


1

स्वाभाविक रूप से स्थिर तरीके जो किसी कारण से गैर-स्थैतिक बनते हैं, बस कष्टप्रद होते हैं। अर्थात:

मैं अपने बैंक को फोन करता हूं और अपना बैलेंस मांगता हूं।
वे मेरा खाता संख्या पूछते हैं।
काफी उचित। उदाहरण विधि।

मैं अपने बैंक को फोन करता हूं और उनका डाक पता मांगता हूं।
वे मेरा खाता संख्या पूछते हैं।
WTF? असफल- स्थिर विधि होनी चाहिए थी।


1
क्या होगा अगर विभिन्न ग्राहकों को विभिन्न शाखाओं द्वारा सेवा दी जाती है? बैंक के मुख्य कार्यालय में मेलिंग पत्राचार, इसे उचित शाखा को मिल सकता है, अंततः, लेकिन इसका मतलब यह नहीं है कि ग्राहक उस विशेष शाखा के पते का उपयोग करके बेहतर सेवा नहीं करेगा जो उसे सेवा देता है।
सुपरकैट

0

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


-1

उन मामलों में, मैं विधि को स्थिर या बर्तनों की लाइब्रेरी में ले जाता हूं, इसलिए मैं "क्लास" की अवधारणा के साथ "ऑब्जेक्ट" की अवधारणा को नहीं मिलाता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.