इटरेटर पैटर्न

From alpha
Jump to navigation Jump to search

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

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

अवलोकन

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

इटरेटर डिज़ाइन पैटर्न किन समस्याओं को समाधान कर सकता है?

[2]

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

एग्रीगेट इंटरफेस में एक्सेस और ट्रैवर्सल ऑपरेशंस को परिभाषित करना अनम्य है क्योंकि यह एग्रीगेट को विशेष एक्सेस और ट्रैवर्सल ऑपरेशंस के लिए प्रतिबद्ध करता है और एग्रीगेट इंटरफेस को परिवर्तन किये बिना पश्चात में नए ऑपरेशंस को जोड़ना असंभव बनाता है।

इटरेटर डिज़ाइन पैटर्न किस समाधान का वर्णन करता है?

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

भिन्न-भिन्न विधियों से किसी समुच्चय तक पहुँचने और पार करने के लिए भिन्न-भिन्न पुनरावृत्तियों का उपयोग किया जा सकता है।
नए पुनरावृत्तियों को परिभाषित करके नई पहुंच और ट्रैवर्सल संचालन को स्वतंत्र रूप से परिभाषित किया जा सकता है।

नीचे यूएमएल वर्ग और अनुक्रम आरेख भी देखें।

परिभाषा

इटरेटर पैटर्न का सार "किसी समग्र वस्तु के एलिमेंट्स को उसके अंतर्निहित प्रतिनिधित्व को उजागर किए बिना क्रमिक रूप से एक्सेस करने की विधि प्रदान करना है।"[3]

संरचना

यूएमएल वर्ग और अनुक्रम आरेख

इटरेटर डिज़ाइन पैटर्न के लिए प्रारूप यूएमएल वर्ग और अनुक्रम आरेख।[4]

उपरोक्त एकीकृत मॉडलिंग भाषा वर्ग आरेख में, Client क्लास (1) इटरेटर ऑब्जेक्ट बनाने के लिए एग्रीगेट Aggregate इंटरफ़ेस को संदर्भित करता है (createIterator()) बनाने और एग्रीगेट ऑब्जेक्ट को ट्रैवर्स करने के लिए इटरेटर इंटरफ़ेस को संदर्भित करता है (next(),hasNext()) Iterator1 क्लास Aggregate1 क्लास तक पहुँच कर Iterator इंटरफ़ेस को कार्यान्वित करता है।

एकीकृत मॉडलिंग भाषा अनुक्रम आरेख रन-टाइम इंटरैक्शन दिखाता है: Client ऑब्जेक्ट पर createIterator() को कॉल करता है, जो Iterator1 ऑब्जेक्ट बनाता है और इसे क्लाइंट को रिटर्न करता है। क्लाइंट Aggregate1 ऑब्जेक्ट के एलिमेंट्स को पार करने के लिए Iterator1 का उपयोग करता है।

यूएमएल वर्ग आरेख

इटरेटर पैटर्न

उदाहरण

कुछ भाषाएँ वाक्यविन्यास का मानकीकरण करती हैं। सी++ और पाइथन इसके उल्लेखनीय उदाहरण हैं।

सी++

सी++ उस भाषा में पॉइंटर्स (कंप्यूटर प्रोग्रामिंग) के शब्दार्थ के साथ पुनरावृत्तियों को प्रारम्भ करता है। सी ++ में, क्लास सभी पॉइंटर ऑपरेशंस को ओवरलोड कर सकती है, इसलिए पुनरावर्तक को प्रारम्भ किया जा सकता है जो कमोबेश पॉइंटर के जैस कार्य करता है, जो डीरेफ़रेंस, इंक्रीमेंट और डिक्रीमेंट के साथ पूर्ण होता है। इसका लाभ यह है कि सी++ एल्गोरिदम जैसे std::sort को प्लेन प्राचीन मेमोरी बफ़र्स पर प्रारंभ किया जा सकता है, और सीखने के लिए कोई नया सिंटैक्स नहीं है। चूँकि, समानता के परीक्षण के लिए "अंत" पुनरावर्तक की आवश्यकता होती है, इसके अतिरिक्त कि पुनरावर्तक को यह ज्ञात हो कि वह अंत तक पहुँच गया है। सी ++ भाषा में, हम कहते हैं कि इटरेटर अवधारणा (जेनेरिक प्रोग्रामिंग) को मॉडल करता है।

यह सी++ 11 कार्यान्वयन अध्याय "वेक्टर को फिर से सामान्य बनाने" पर आधारित है।[5]

 #include <iostream>
#include <stdexcept>
#include <initializer_list>
class Vector {
public:
using iterator = double*;
iterator begin() { return elem; }
  iterator end() { return elem + sz; }
  Vector(std::initializer_list<double> lst) :elem(nullptr), sz(0) {
    sz = lst.size();
    elem = new double[sz];
    double* p = elem;
    for (auto i = lst.begin(); i != lst.end(); ++i, ++p) {
      *p = *i;
}
}  
  ~Vector() { delete[] elem; }
  int size() const { return sz; }
  double& operator[](int n) {
    if (n < 0 || n >= sz) throw std::out_of_range("Vector::operator[]");
    return elem[n];
  }
  Vector(const Vector&) = delete; // rule of three
  Vector& operator=(const Vector&) = delete;
private:
  double* elem;
  int sz;
};
int main() {
  Vector v = {1.1*1.1, 2.2*2.2};
  for (const auto& x : v) {
    std::cout << x << '\n';
}
  for (auto i = v.begin(); i != v.end(); ++i) {
    std::cout << *i << '\n';
}
  for (auto i = 0; i <= v.size(); ++i) {
    std::cout << v[i] << '\n';
}
}

प्रोग्राम आउटपुट है

1.21
4.84
1.21
4.84
1.21
4.84
terminate called after throwing an instance of 'std::out_of_range'
  what():  Vector::operator[]

यह भी देखें

संदर्भ

  1. Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley. pp. 257ff. ISBN 0-201-63361-2.
  2. "इटरेटर डिजाइन पैटर्न - समस्या, समाधान और प्रयोज्यता". w3sDesign.com. Retrieved 2017-08-12.
  3. Gang Of Four
  4. "इटरेटर डिजाइन पैटर्न - संरचना और सहयोग". w3sDesign.com. Retrieved 2017-08-12.
  5. Bjarne Stroustrup (2014). Programming: Principles and Practice using C++ (2 ed.). Addison Wesley. pp. 729 ff. ISBN 978-0-321-99278-9.


बाहरी संबंध