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

From Vigyanwiki
No edit summary
No edit summary
Line 19: Line 19:
एक कंस्ट्रक्टर एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल की शुरुआत में ऑब्जेक्ट बनाने और आरंभ करने के लिए कहा जाता है, एक प्रक्रिया जिसे [[वस्तु निर्माण]] (या तात्कालिकता) कहा जाता है। प्रारंभ में संसाधनों का अधिग्रहण सम्मलित हो सकता है। कंस्ट्रक्टर्स में पैरामीटर हो सकते है लेकिन सामान्यतः अधिकांश भाषाओं में वैल्यू नहीं लौटाते है। जावा में निम्न उदाहरण देखें:
एक कंस्ट्रक्टर एक ऐसी विधि है जिसे किसी वस्तु के जीवनकाल की शुरुआत में ऑब्जेक्ट बनाने और आरंभ करने के लिए कहा जाता है, एक प्रक्रिया जिसे [[वस्तु निर्माण]] (या तात्कालिकता) कहा जाता है। प्रारंभ में संसाधनों का अधिग्रहण सम्मलित हो सकता है। कंस्ट्रक्टर्स में पैरामीटर हो सकते है लेकिन सामान्यतः अधिकांश भाषाओं में वैल्यू नहीं लौटाते है। जावा में निम्न उदाहरण देखें:
  public class Main {
  public class Main {
    String _name;
  String _name;
    int _roll;
  int _roll;
   
   
    Main(String name, int roll) { // constructor method
  Main(String name, int roll) { // constructor method
        this._name = name;
    this._name = name;
        this._roll = roll;
    this._roll = roll;
    }
  }
  }
  }


Line 39: Line 39:
निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:
निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:
  abstract class Shape {
  abstract class Shape {
    abstract int area(int h, int w); // abstract method signature
  abstract int area(int h, int w); // abstract method signature
  }
  }
निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:
निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:
  public class Rectangle extends Shape {
  public class Rectangle extends Shape {
    @Override
  @Override
    int area(int h, int w) {
  int area(int h, int w) {
        return h * w;
    return h * w;
    }
  }
  }
  }
=== पुनर्संरचना ===
=== पुनर्संरचना ===
Line 57: Line 57:
  class IA
  class IA
  {
  {
    public virtual void M() { }
  public virtual void M() { }
  }
  }
  abstract class IB : IA
  abstract class IBs: IA
  {
  {
    public override abstract void M(); // allowed
  public override abstract void M(); // allowed
  }
  }
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)
इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)
  interface IA
  interface IA
  {
  {
    void M() { }
  void M() { }
  }
  }
  interface IB : IA
  interface IBe: IA
  {
  {
    abstract void IA.M();
  abstract void IA.M();
  }
  }
  class C : IB { } // error: class 'C' does not implement 'IA.M'.
  class C : IB { } // error: class 'C' does not implement 'IA.M'.
Line 97: Line 97:
  class Data {
  class Data {
   public:
   public:
  bool operator<(const Data& data) const { return roll_ < data.roll_; }
  bool operator<(const Data& data) const { return roll_ < data.roll_; }
  bool operator==(const Data& data) const {
  bool operator==(const Data& data) const {
    return name_ == data.name_ && roll_ == data.roll_;
  return name_ == data.name_ && roll_ == data.roll_;
  }
  }
   
   
   private:
   private:
  std::string name_;
  std::string name_;
  int roll_;
  int roll_;
  };
  };


Line 119: Line 119:
  class Super {
  class Super {
   public:
   public:
  virtual ~Super() = default;
  virtual ~Super() = default;
   
   
  virtual void IAm() { std::cout << "I'm the super class!\n"; }
  virtual void IAm() { std::cout << "I'm the super class!\n"; }
  };
  };
   
   
  class Sub : public Super {
  class Sub : public Super {
   public:
   public:
  void IAm() override { std::cout << "I'm the subclass!\n"; }
  void IAm() override { std::cout << "I'm the subclass!\n"; }
  };
  };
   
   
  int main() {
  int main() {
  std::unique_ptr<Super> inst1 = std::make_unique<Super>();
  std::unique_ptr<Super> inst1 = std::make_unique<Super>();
  std::unique_ptr<Super> inst2 = std::make_unique<nowiki><Sub>();</nowiki>
  std::unique_ptr<Super> inst2 = std::make_unique<nowiki><Sub>();</nowiki>
   
   
  inst1->IAm(); // Calls |Super::IAm|.
  inst1->IAm(); // Calls |Super::IAm|.
  inst2->IAm(); // Calls |Sub::IAm|.
  inst2->IAm(); // Calls |Sub::IAm|.
  }
  }



Revision as of 15:34, 14 March 2023

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

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

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

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

ओवरराइडिंग और ओवरलोडिंग

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

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

एक्सेसर, म्यूटेटर और मैनेजर तरीके

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

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

कंस्ट्रक्टर

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

public class Main {
  String _name;
  int _roll;

  Main(String name, int roll) { // constructor method
    this._name = name;
    this._roll = roll;
  }
}

विध्वंसक

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

फ़ाइनलाइज़र

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

सार तरीके

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

उदाहरण

निम्नलिखित जावा कोड एक सार वर्ग दिखाता है जिसे विस्तारित करने की आवश्यकता है:

abstract class Shape {
  abstract int area(int h, int w); // abstract method signature
}

निम्नलिखित उपवर्ग मुख्य वर्ग का विस्तार करता है:

public class Rectangle extends Shape {
  @Override
  int area(int h, int w) {
    return h * w;
  }
}

पुनर्संरचना

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

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

उदाहरण

सी शार्प में, वर्चुअल विधि को सार विधि से ओवरराइड किया जा सकता है। (यह जावा पर भी लागू होता है, जहां सभी गैर-निजी तरीके आभासी होते है।)

class IA
{
  public virtual void M() { }
}
abstract class IBs: IA
{
  public override abstract void M(); // allowed
}

इंटरफेस की डिफ़ॉल्ट विधियों को भी पुन: सारित किया जा सकता है, उन्हें लागू करने के लिए उप-वर्गों की आवश्यकता होती है। (यह जावा पर भी लागू होता है।)

interface IA
{
  void M() { }
}
interface IBe: IA
{
  abstract void IA.M();
}
class C : IB { } // error: class 'C' does not implement 'IA.M'.

कक्षा के तरीके

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

विशेष तरीके

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

स्थैतिक तरीके

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

जावा में, सामान्यतः उपयोग की जाने वाली स्थैतिक विधि है:

Math.max(double a, double b)

इस स्थैतिक विधि का कोई स्वामित्व नहीं है और यह किसी उदाहरण पर नहीं चलता है। यह अपने तर्कों से सारी जानकारी प्राप्त करता है।[2]

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

कॉपी-असाइनमेंट ऑपरेटरों

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

ऑपरेटर के तरीके

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

#include <string>

class Data {
 public:
 bool operator<(const Data& data) const { return roll_ < data.roll_; }
 bool operator==(const Data& data) const {
  return name_ == data.name_ && roll_ == data.roll_;
 }

 private:
 std::string name_;
 int roll_;
};

सदस्य सी++ में कार्य करता है

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

आभासी कार्य

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

सी++ उदाहरण:

#include <iostream>
#include <memory>

class Super {
 public:
 virtual ~Super() = default;

 virtual void IAm() { std::cout << "I'm the super class!\n"; }
};

class Sub : public Super {
 public:
 void IAm() override { std::cout << "I'm the subclass!\n"; }
};

int main() {
 std::unique_ptr<Super> inst1 = std::make_unique<Super>();
 std::unique_ptr<Super> inst2 = std::make_unique<Sub>();

 inst1->IAm(); // Calls |Super::IAm|.
 inst2->IAm(); // Calls |Sub::IAm|.
}

यह भी देखें

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

टिप्पणियाँ

  1. "What is an Object?". oracle.com. Oracle Corporation. Retrieved 13 December 2013.
  2. 2.0 2.1 Martin, Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship. Prentice Hall. p. 296. ISBN 978-0-13-235088-4.
  3. Meyer, Bertrand (1988). Object-Oriented Software Construction. Cambridge: Prentice Hall International Series in Computer Science. pp. 52–54. ISBN 0-13-629049-3.
  4. "Abstract Methods and Classes". oracle.com. Oracle Java Documentation. Retrieved 11 December 2014.


संदर्भ