विधि (कंप्यूटर प्रोग्रामिंग)

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) में एक विधि एक प्रक्रिया (कंप्यूटर विज्ञान) है जो एक संदेश देना और एक ऑब्जेक्ट (कंप्यूटर विज्ञान) से जुड़ी है। एक वस्तु में राज्य डेटा और व्यवहार शामिल होते हैं; ये एक इंटरफ़ेस (कंप्यूटिंग)|इंटरफ़ेस की रचना करते हैं, जो यह निर्दिष्ट करता है कि वस्तु का इसके विभिन्न उपभोक्ताओं द्वारा उपयोग कैसे किया जा सकता है। एक विधि उपभोक्ता द्वारा पैरामीट्रिज्ड ऑब्जेक्ट का व्यवहार है।

डेटा को वस्तु की संपत्ति (प्रोग्रामिंग) के रूप में दर्शाया जाता है, और व्यवहार को विधियों के रूप में दर्शाया जाता है। उदाहरण के लिए, ए  ऑब्जेक्ट में विधियाँ हो सकती हैं जैसे   और , जबकि इसकी स्थिति (चाहे यह किसी भी समय पर खुली या बंद हो) एक संपत्ति होगी।

कक्षा-आधारित प्रोग्रामिंग में, विधियों को एक वर्ग (कंप्यूटर विज्ञान) के भीतर परिभाषित किया जाता है, और ऑब्जेक्ट किसी दिए गए वर्ग के उदाहरण (कंप्यूटर विज्ञान) होते हैं। विधि द्वारा प्रदान की जाने वाली सबसे महत्वपूर्ण क्षमताओं में से एक विधि ओवरराइडिंग है - समान नाम (उदा., ) का उपयोग कई अलग-अलग प्रकार की कक्षाओं के लिए किया जा सकता है। यह भेजने वाली वस्तुओं को व्यवहारों को लागू करने और उन व्यवहारों के कार्यान्वयन को प्राप्त करने वाली वस्तु को सौंपने की अनुमति देता है। जावा (प्रोग्रामिंग भाषा) प्रोग्रामिंग में एक विधि क्लास ऑब्जेक्ट के व्यवहार को सेट करती है। उदाहरण के लिए, एक वस्तु एक भेज सकती है   किसी अन्य वस्तु को संदेश और उपयुक्त सूत्र लागू किया जाता है कि क्या प्राप्त वस्तु एक है ,  ,  , वगैरह।

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

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

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

एक्सेसर, म्यूटेटर और मैनेजर मेथड्स
किसी वस्तु के डेटा मान को पढ़ने के लिए एक्सेसर विधियों का उपयोग किया जाता है। किसी वस्तु के डेटा को संशोधित करने के लिए Mutator विधियों का उपयोग किया जाता है। प्रबंधक विधियों का उपयोग किसी वर्ग की वस्तुओं को प्रारंभ करने और नष्ट करने के लिए किया जाता है, उदा। निर्माणकर्ता और विध्वंसक।

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

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

<वाक्यविन्यास प्रकाश लैंग = जावा> सार्वजनिक वर्ग मुख्य { स्ट्रिंग _नाम; इंट _रोल;

मुख्य (स्ट्रिंग नाम, इंट रोल) {// कंस्ट्रक्टर विधि यह._नाम = नाम; यह._रोल = रोल; } } 

विध्वंसक
एक विध्वंसक (कंप्यूटर विज्ञान) एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल के अंत में स्वचालित रूप से कहा जाता है, एक प्रक्रिया जिसे वस्तु जीवनकाल कहा जाता है। अधिकांश भाषाओं में विनाश विध्वंसक विधि तर्कों की अनुमति नहीं देता है और न ही मूल्यों को लौटाता है। विनाश को लागू किया जा सकता है ताकि वस्तु विनाश पर सफाई कार्य और अन्य कार्य किए जा सकें।

finalizer्स
कचरा संग्रह (कंप्यूटर विज्ञान) में | कचरा-संग्रहित भाषाएँ, जैसे कि जावा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा) | सी #, और पायथन (प्रोग्रामिंग भाषा), विध्वंसक को फाइनलाइज़र के रूप में जाना जाता है। उनके पास विनाशकों के लिए एक समान उद्देश्य और कार्य है, लेकिन कचरा-संग्रह और मैन्युअल स्मृति प्रबंधन वाली भाषाओं का उपयोग करने वाली भाषाओं के बीच अंतर के कारण, जिस क्रम में उन्हें बुलाया जाता है वह अलग है।

सार तरीके
एक अमूर्त विधि केवल एक विधि हस्ताक्षर और कोई विधि निकाय नहीं है। यह अक्सर निर्दिष्ट करने के लिए प्रयोग किया जाता है कि एक उपवर्ग को विधि का कार्यान्वयन प्रदान करना चाहिए। कुछ प्रोग्रामिंग भाषाओं में इंटरफ़ेस (कंप्यूटिंग) निर्दिष्ट करने के लिए सार विधियों का उपयोग किया जाता है।

उदाहरण
निम्नलिखित जावा (प्रोग्रामिंग भाषा) कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:

<वाक्यविन्यास प्रकाश लैंग = जावा> सार वर्ग आकार { अमूर्त इंट क्षेत्र (इंट एच, इंट डब्ल्यू); // सार विधि हस्ताक्षर }  निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:

<वाक्यविन्यास प्रकाश लैंग = जावा> सार्वजनिक वर्ग आयत आकार बढ़ाता है { @Override इंट एरिया (इंट एच, इंट डब्ल्यू) { वापसी एच * डब्ल्यू; } } 

पुनर्संरचना
यदि एक उपवर्ग एक सार विधि के लिए एक कार्यान्वयन प्रदान करता है, तो दूसरा उपवर्ग इसे फिर से सार बना सकता है। इसे पुनर्संरचना कहते हैं।

व्यवहार में, यह शायद ही कभी प्रयोग किया जाता है।

उदाहरण
सी # में, वर्चुअल विधि को सार विधि से ओवरराइड किया जा सकता है। (यह जावा पर भी लागू होता है, जहां सभी गैर-निजी तरीके आभासी हैं।) <वाक्यविन्यास प्रकाश लैंग = csharp> कक्षा आईए {   सार्वजनिक आभासी शून्य एम  {} } सार वर्ग आईबी: IA { सार्वजनिक ओवरराइड अमूर्त शून्य एम ; // अनुमत } 

इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।) <वाक्यविन्यास प्रकाश लैंग = csharp> इंटरफ़ेस आईए {   शून्य एम  {} } इंटरफ़ेस आईबी: आइए {   सार शून्य IA.M ; } कक्षा सी: आईबी {} // त्रुटि: कक्षा 'सी' 'आईएएम' लागू नहीं करती है। 

कक्षा के तरीके
क्लास मेथड्स वे मेथड्स हैं जिन्हें इंस्टेंस के बजाय क्लास (कंप्यूटर प्रोग्रामिंग) पर कॉल किया जाता है। वे आम तौर पर ऑब्जेक्ट मेटा मॉडल के हिस्से के रूप में उपयोग किए जाते हैं। यानी, प्रत्येक वर्ग के लिए, मेटा-मॉडल में क्लास ऑब्जेक्ट का एक उदाहरण परिभाषित किया गया है। मेटा-ऑब्जेक्ट प्रोटोकॉल | मेटा-मॉडल प्रोटोकॉल कक्षाओं को बनाने और हटाने की अनुमति देते हैं। इस अर्थ में, वे ऊपर वर्णित कंस्ट्रक्टर्स और डिस्ट्रक्टर्स के समान कार्यक्षमता प्रदान करते हैं। लेकिन कुछ भाषाओं में जैसे कॉमन लिस्प ऑब्जेक्ट सिस्टम | कॉमन लिस्प ऑब्जेक्ट सिस्टम (CLOS) मेटा-मॉडल डेवलपर को रन टाइम पर वस्तु मॉडल को गतिशील रूप से बदलने की अनुमति देता है: उदाहरण के लिए, नई कक्षाएं बनाने के लिए, क्लास पदानुक्रम को फिर से परिभाषित करें, गुणों को संशोधित करें, वगैरह।

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

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

जावा में, आमतौर पर इस्तेमाल की जाने वाली स्थैतिक विधि है: Math.max (डबल ए, डबल बी) इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है। यदि वर्ग का कोई उदाहरण अभी तक मौजूद नहीं है, तब भी एक स्थिर विधि को लागू किया जा सकता है। स्टेटिक विधियों को स्थैतिक कहा जाता है क्योंकि उन्हें उस वर्ग के आधार पर संकलन समय पर हल किया जाता है जिस पर उन्हें कॉल किया जाता है और गतिशील रूप से उदाहरण विधियों के मामले में नहीं होता है, जो कि ऑब्जेक्ट के रनटाइम प्रकार के आधार पर बहुरूपी रूप से हल किया जाता है।

कॉपी-असाइनमेंट ऑपरेटर
कॉपी-असाइनमेंट ऑपरेटर्स कंपाइलर द्वारा की जाने वाली क्रियाओं को परिभाषित करते हैं जब एक क्लास ऑब्जेक्ट को उसी प्रकार के क्लास ऑब्जेक्ट को असाइन किया जाता है।

ऑपरेटर के तरीके
ऑपरेटर के तरीके ऑपरेटर ओवरलोडिंग करते हैं और प्रतीक और संबंधित विधि मापदंडों के साथ किए जाने वाले संचालन को परिभाषित करते हैं। सी ++ उदाहरण: <वाक्यविन्यास लैंग = सीपीपी>
 * 1) शामिल <स्ट्रिंग>

वर्ग डेटा { जनता: बूल ऑपरेटर <(स्थिरांक डेटा और डेटा) कास्ट {रिटर्न रोल_ <डेटा.रोल_; } बूल ऑपरेटर == (स्थिरांक डेटा और डेटा) स्थिरांक { रिटर्न नाम_ == डेटा.नाम_ && रोल_ == डेटा.रोल_; }

निजी: एसटीडी :: स्ट्रिंग नाम_; इंट रोल_; }; 

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

आभासी कार्य
वर्चुअल फ़ंक्शंस वे साधन हैं जिनके द्वारा C ++ वर्ग बहुरूपी व्यवहार प्राप्त कर सकता है। गैर-आभासी सदस्य कार्य, या नियमित तरीके, वे हैं जो बहुरूपता (कंप्यूटर विज्ञान) में भाग नहीं लेते हैं।

सी ++ उदाहरण: <वाक्यविन्यास लैंग = सीपीपी>
 * 1) शामिल
 * 2) शामिल <मेमोरी>

क्लास सुपर { जनता: आभासी ~ सुपर = डिफ़ॉल्ट;

आभासी शून्य IAm {std::cout << मैं सुपर क्लास हूँ!\n; } };

क्लास सब: पब्लिक सुपर { जनता: शून्य IAm ओवरराइड {std::cout << मैं उपवर्ग हूँ!\n; } };

मुख्य प्रवेश बिंदु { std::unique_ptr inst1 = std::make_unique; std::unique_ptr inst2 = std::make_unique;

inst1->IAm; // कॉल | सुपर :: आईएएम |। inst2->IAm; // कॉल | Sub::IAm|. } 

यह भी देखें

 * संपत्ति (प्रोग्रामिंग)
 * दूरस्थ विधि मंगलाचरण
 * उपनेमका, जिसे उपप्रोग्राम, दिनचर्या, प्रक्रिया या कार्य भी कहा जाता है

संदर्भ


Funktion (programmering)