इटरेटर पैटर्न: Difference between revisions
No edit summary |
No edit summary |
||
Line 5: | Line 5: | ||
== अवलोकन == | == अवलोकन == | ||
इटरेटर<ref name="GoF">{{cite book|url=https://archive.org/details/designpatternsel00gamm/page/257|title=Design Patterns: Elements of Reusable Object-Oriented Software|author=Erich Gamma|last2=Richard Helm|last3=Ralph Johnson|last4=John Vlissides|publisher=Addison Wesley|year=1994|isbn=0-201-63361-2|pages=[https://archive.org/details/designpatternsel00gamm/page/257 257ff]|url-access=registration}}</ref>[[डिजाइन पैटर्न्स]] | इटरेटर<ref name="GoF">{{cite book|url=https://archive.org/details/designpatternsel00gamm/page/257|title=Design Patterns: Elements of Reusable Object-Oriented Software|author=Erich Gamma|last2=Richard Helm|last3=Ralph Johnson|last4=John Vlissides|publisher=Addison Wesley|year=1994|isbn=0-201-63361-2|pages=[https://archive.org/details/designpatternsel00gamm/page/257 257ff]|url-access=registration}}</ref>[[डिजाइन पैटर्न्स]] 23 प्रसिद्ध GoF डिज़ाइन पैटर्न में से है जो बताता है कि प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर को डिज़ाइन करने के लिए आवर्ती डिज़ाइन समस्याओं को कैसे समाधान किया जाए, अर्थात ऐसी वस्तुएं जिन्हें प्रारंभ करना, परिवर्तित करना सरल हो। परीक्षण करें, और पुन: उपयोग करें। | ||
=== इटरेटर डिज़ाइन पैटर्न किन समस्याओं को समाधान कर सकता है? === | === इटरेटर डिज़ाइन पैटर्न किन समस्याओं को समाधान कर सकता है? === | ||
<ref>{{cite web|title=इटरेटर डिजाइन पैटर्न - समस्या, समाधान और प्रयोज्यता|url=http://w3sdesign.com/?gr=b04&ugr=proble|website=w3sDesign.com|access-date=2017-08-12}}</ref> | <ref>{{cite web|title=इटरेटर डिजाइन पैटर्न - समस्या, समाधान और प्रयोज्यता|url=http://w3sdesign.com/?gr=b04&ugr=proble|website=w3sDesign.com|access-date=2017-08-12}}</ref> | ||
* किसी समग्र वस्तु के | * किसी समग्र वस्तु के एलिमेंट्स को इसके प्रतिनिधित्व (डेटा संरचनाओं) को उजागर किए बिना एक्सेस और ट्रैवर्स किया जाना चाहिए। | ||
* किसी समग्र ऑब्जेक्ट के इंटरफ़ेस को परिवर्तन किये बिना उसके लिए नए ट्रैवर्सल ऑपरेशंस को परिभाषित किया जाना चाहिए। | * किसी समग्र ऑब्जेक्ट के इंटरफ़ेस को परिवर्तन किये बिना उसके लिए नए ट्रैवर्सल ऑपरेशंस को परिभाषित किया जाना चाहिए। | ||
Line 24: | Line 24: | ||
== परिभाषा == | == परिभाषा == | ||
इटरेटर पैटर्न का सार "किसी समग्र वस्तु के | इटरेटर पैटर्न का सार "किसी समग्र वस्तु के एलिमेंट्स को उसके अंतर्निहित प्रतिनिधित्व को उजागर किए बिना क्रमिक रूप से एक्सेस करने की विधि प्रदान करना है।"<ref>[[Design Patterns (book)|Gang Of Four]]</ref> | ||
== संरचना == | == संरचना == | ||
=== यूएमएल वर्ग और अनुक्रम आरेख === | === यूएमएल वर्ग और अनुक्रम आरेख === | ||
[[File:w3sDesign Iterator Design Pattern UML.jpg|frame|none|इटरेटर डिज़ाइन पैटर्न के लिए प्रारूप यूएमएल वर्ग और अनुक्रम आरेख।<ref>{{cite web|title=इटरेटर डिजाइन पैटर्न - संरचना और सहयोग|url=http://w3sdesign.com/?gr=b04&ugr=struct|website=w3sDesign.com|access-date=2017-08-12}}</ref>]]उपरोक्त [[ एकीकृत मॉडलिंग भाषा |एकीकृत मॉडलिंग भाषा]] [[ वर्ग आरेख |वर्ग आरेख]] में, <code>Client</code> क्लास (1) इटरेटर ऑब्जेक्ट बनाने के लिए एग्रीगेट <code>Aggregate</code> इंटरफ़ेस को संदर्भित करता है (<code>createIterator()</code>) बनाने और एग्रीगेट ऑब्जेक्ट को ट्रैवर्स करने के लिए इटरेटर इंटरफ़ेस को संदर्भित करता है (<code>next(),hasNext()</code>) <code>Iterator1</code> क्लास <code>Aggregate1</code> क्लास तक पहुँच कर <code>Iterator</code> इंटरफ़ेस को कार्यान्वित करता है। | [[File:w3sDesign Iterator Design Pattern UML.jpg|frame|none|इटरेटर डिज़ाइन पैटर्न के लिए प्रारूप यूएमएल वर्ग और अनुक्रम आरेख।<ref>{{cite web|title=इटरेटर डिजाइन पैटर्न - संरचना और सहयोग|url=http://w3sdesign.com/?gr=b04&ugr=struct|website=w3sDesign.com|access-date=2017-08-12}}</ref>]]उपरोक्त [[ एकीकृत मॉडलिंग भाषा |एकीकृत मॉडलिंग भाषा]] [[ वर्ग आरेख |वर्ग आरेख]] में, <code>Client</code> क्लास (1) इटरेटर ऑब्जेक्ट बनाने के लिए एग्रीगेट <code>Aggregate</code> इंटरफ़ेस को संदर्भित करता है (<code>createIterator()</code>) बनाने और एग्रीगेट ऑब्जेक्ट को ट्रैवर्स करने के लिए इटरेटर इंटरफ़ेस को संदर्भित करता है (<code>next(),hasNext()</code>) <code>Iterator1</code> क्लास <code>Aggregate1</code> क्लास तक पहुँच कर <code>Iterator</code> इंटरफ़ेस को कार्यान्वित करता है। | ||
एकीकृत मॉडलिंग भाषा [[अनुक्रम आरेख]] रन-टाइम इंटरैक्शन दिखाता है: <code>Client</code> ऑब्जेक्ट पर <code>createIterator()</code> को कॉल करता है, जो <code>Iterator1</code> ऑब्जेक्ट बनाता है और इसे क्लाइंट को | एकीकृत मॉडलिंग भाषा [[अनुक्रम आरेख]] रन-टाइम इंटरैक्शन दिखाता है: <code>Client</code> ऑब्जेक्ट पर <code>createIterator()</code> को कॉल करता है, जो <code>Iterator1</code> ऑब्जेक्ट बनाता है और इसे क्लाइंट को रिटर्न करता है। क्लाइंट <code>Aggregate1</code> ऑब्जेक्ट के एलिमेंट्स को पार करने के लिए <code>Iterator1</code> का उपयोग करता है। | ||
=== यूएमएल वर्ग आरेख === | === यूएमएल वर्ग आरेख === | ||
Line 42: | Line 41: | ||
कुछ भाषाएँ वाक्यविन्यास का मानकीकरण करती हैं। सी++ और पाइथन इसके उल्लेखनीय उदाहरण हैं। | कुछ भाषाएँ वाक्यविन्यास का मानकीकरण करती हैं। सी++ और पाइथन इसके उल्लेखनीय उदाहरण हैं। | ||
[[सी ++|'''सी++''']] | |||
सी++ उस भाषा में [[सूचक (कंप्यूटर प्रोग्रामिंग)|पॉइंटर्स (कंप्यूटर प्रोग्रामिंग)]] के शब्दार्थ के साथ पुनरावृत्तियों को प्रारम्भ करता है। सी ++ में, क्लास सभी पॉइंटर ऑपरेशंस को ओवरलोड कर सकती है, इसलिए पुनरावर्तक को प्रारम्भ किया जा सकता है जो कमोबेश पॉइंटर के जैस कार्य करता है, जो डीरेफ़रेंस, इंक्रीमेंट और डिक्रीमेंट के साथ पूर्ण होता है। इसका लाभ यह है कि सी++ एल्गोरिदम जैसे <code>std::sort</code> को प्लेन प्राचीन मेमोरी बफ़र्स पर प्रारंभ किया जा सकता है, और सीखने के लिए कोई नया सिंटैक्स नहीं है। चूँकि, समानता के परीक्षण के लिए "अंत" पुनरावर्तक की आवश्यकता होती है, इसके अतिरिक्त कि पुनरावर्तक को यह ज्ञात हो कि वह अंत तक पहुँच गया है। सी ++ भाषा में, हम कहते हैं कि इटरेटर [[अवधारणा (जेनेरिक प्रोग्रामिंग)]] को मॉडल करता है। | सी++ उस भाषा में [[सूचक (कंप्यूटर प्रोग्रामिंग)|पॉइंटर्स (कंप्यूटर प्रोग्रामिंग)]] के शब्दार्थ के साथ पुनरावृत्तियों को प्रारम्भ करता है। सी ++ में, क्लास सभी पॉइंटर ऑपरेशंस को ओवरलोड कर सकती है, इसलिए पुनरावर्तक को प्रारम्भ किया जा सकता है जो कमोबेश पॉइंटर के जैस कार्य करता है, जो डीरेफ़रेंस, इंक्रीमेंट और डिक्रीमेंट के साथ पूर्ण होता है। इसका लाभ यह है कि सी++ एल्गोरिदम जैसे <code>std::sort</code> को प्लेन प्राचीन मेमोरी बफ़र्स पर प्रारंभ किया जा सकता है, और सीखने के लिए कोई नया सिंटैक्स नहीं है। चूँकि, समानता के परीक्षण के लिए "अंत" पुनरावर्तक की आवश्यकता होती है, इसके अतिरिक्त कि पुनरावर्तक को यह ज्ञात हो कि वह अंत तक पहुँच गया है। सी ++ भाषा में, हम कहते हैं कि इटरेटर [[अवधारणा (जेनेरिक प्रोग्रामिंग)]] को मॉडल करता है। | ||
यह सी++ 11 कार्यान्वयन अध्याय "वेक्टर को फिर से सामान्य | यह सी++ 11 कार्यान्वयन अध्याय "वेक्टर को फिर से सामान्य बनाने" पर आधारित है।<ref>{{cite book |author=Bjarne Stroustrup |title=Programming: Principles and Practice using C++ |edition=2 |publisher=Addison Wesley |year=2014 |isbn=978-0-321-99278-9 |pages=729 ff.}}</ref> | ||
#include <iostream> | #include <iostream> | ||
Revision as of 18:24, 27 June 2023
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, इटरेटर पैटर्न डिज़ाइन पैटर्न (कंप्यूटर साइंस) है जिसमें कंटेनर को पार करने और कंटेनर के एलेमेंट्स तक पहुंचने के लिए इटरेटर का उपयोग किया जाता है। पुनरावर्तक पैटर्न कंटेनरों से एल्गोरिदम को भिन्न करता है; कुछ स्थितियों में, एल्गोरिदम आवश्यक रूप से कंटेनर-विशिष्ट होते हैं और इस प्रकार इन्हें भिन्न नहीं किया जा सकता है।
उदाहरण के लिए, काल्पनिक कलन विधि SearchForElement को कंटेनर-विशिष्ट एल्गोरिथम के रूप में प्रारम्भ करने के अतिरिक्त सामान्यतः निर्दिष्ट प्रकार के इटरेटर का उपयोग करके कार्यान्वित किया जा सकता है। यह SearchForElement को किसी भी कंटेनर पर उपयोग करने की अनुमति देता है जो आवश्यक प्रकार के इटरेटर का समर्थन करता है।
अवलोकन
इटरेटर[1]डिजाइन पैटर्न्स 23 प्रसिद्ध GoF डिज़ाइन पैटर्न में से है जो बताता है कि प्रयोज्य ऑब्जेक्ट-ओरिएंटेड सॉफ़्टवेयर को डिज़ाइन करने के लिए आवर्ती डिज़ाइन समस्याओं को कैसे समाधान किया जाए, अर्थात ऐसी वस्तुएं जिन्हें प्रारंभ करना, परिवर्तित करना सरल हो। परीक्षण करें, और पुन: उपयोग करें।
इटरेटर डिज़ाइन पैटर्न किन समस्याओं को समाधान कर सकता है?
- किसी समग्र वस्तु के एलिमेंट्स को इसके प्रतिनिधित्व (डेटा संरचनाओं) को उजागर किए बिना एक्सेस और ट्रैवर्स किया जाना चाहिए।
- किसी समग्र ऑब्जेक्ट के इंटरफ़ेस को परिवर्तन किये बिना उसके लिए नए ट्रैवर्सल ऑपरेशंस को परिभाषित किया जाना चाहिए।
एग्रीगेट इंटरफेस में एक्सेस और ट्रैवर्सल ऑपरेशंस को परिभाषित करना अनम्य है क्योंकि यह एग्रीगेट को विशेष एक्सेस और ट्रैवर्सल ऑपरेशंस के लिए प्रतिबद्ध करता है और एग्रीगेट इंटरफेस को परिवर्तन किये बिना पश्चात में नए ऑपरेशंस को जोड़ना असंभव बनाता है।
इटरेटर डिज़ाइन पैटर्न किस समाधान का वर्णन करता है?
- भिन्न (इटरेटर) ऑब्जेक्ट को परिभाषित करें जो समग्र ऑब्जेक्ट तक पहुँचने और ट्रैवर्सिंग को समाहित करता है।
- ग्राहक इसके प्रतिनिधित्व (डेटा संरचनाओं) को जाने बिना किसी समुच्चय तक पहुंचने और उसे पार करने के लिए पुनरावर्तक का उपयोग करते हैं।
भिन्न-भिन्न विधियों से किसी समुच्चय तक पहुँचने और पार करने के लिए भिन्न-भिन्न पुनरावृत्तियों का उपयोग किया जा सकता है।
नए पुनरावृत्तियों को परिभाषित करके नई पहुंच और ट्रैवर्सल संचालन को स्वतंत्र रूप से परिभाषित किया जा सकता है।
नीचे यूएमएल वर्ग और अनुक्रम आरेख भी देखें।
परिभाषा
इटरेटर पैटर्न का सार "किसी समग्र वस्तु के एलिमेंट्स को उसके अंतर्निहित प्रतिनिधित्व को उजागर किए बिना क्रमिक रूप से एक्सेस करने की विधि प्रदान करना है।"[3]
संरचना
यूएमएल वर्ग और अनुक्रम आरेख
उपरोक्त एकीकृत मॉडलिंग भाषा वर्ग आरेख में, 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[]
यह भी देखें
- समग्र पैटर्न
- कंटेनर (डेटा संरचना)
- डिजाइन पैटर्न (कंप्यूटर विज्ञान)
- इटरेटर
- पर्यवेक्षक पैटर्न
संदर्भ
- ↑ 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.
- ↑ "इटरेटर डिजाइन पैटर्न - समस्या, समाधान और प्रयोज्यता". w3sDesign.com. Retrieved 2017-08-12.
- ↑ Gang Of Four
- ↑ "इटरेटर डिजाइन पैटर्न - संरचना और सहयोग". w3sDesign.com. Retrieved 2017-08-12.
- ↑ Bjarne Stroustrup (2014). Programming: Principles and Practice using C++ (2 ed.). Addison Wesley. pp. 729 ff. ISBN 978-0-321-99278-9.