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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

सी++

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

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


 * 1) include
 * 2) include 

class Vector {

public:

using iterator = double*;

iterator begin { return elem; }

iterator end { return elem + sz; } Vector(std::initializer_list 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[]

यह भी देखें

 * समग्र पैटर्न
 * कंटेनर (डेटा संरचना)
 * डिजाइन पैटर्न (कंप्यूटर विज्ञान)
 * इटरेटर
 * पर्यवेक्षक पैटर्न

बाहरी संबंध

 * Object iteration in PHP
 * Iterator Pattern in C#
 * Iterator pattern in UML and in LePUS3 (a formal modelling language)
 * SourceMaking tutorial
 * Design Patterns implementation examples tutorial
 * Iterator Pattern