इटरेटर पैटर्न: Difference between revisions
From Vigyanwiki
No edit summary |
No edit summary |
||
| (4 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
[[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, '''[[इटरेटर]] पैटर्न''' डिज़ाइन पैटर्न (कंप्यूटर साइंस) है जिसमें | [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में, '''[[इटरेटर]] पैटर्न''' डिज़ाइन पैटर्न (कंप्यूटर साइंस) है जिसमें कंटेनर को पार करने और कंटेनर के एलेमेंट्स तक पहुंचने के लिए इटरेटर का उपयोग किया जाता है। पुनरावर्तक पैटर्न कंटेनरों से एल्गोरिदम को भिन्न करता है; कुछ स्थितियों में, एल्गोरिदम आवश्यक रूप से कंटेनर-विशिष्ट होते हैं और इस प्रकार इन्हें भिन्न नहीं किया जा सकता है। | ||
उदाहरण के लिए, काल्पनिक [[ कलन विधि ]] | उदाहरण के लिए, काल्पनिक [[ कलन विधि |कलन विधि]] SearchForElement को कंटेनर-विशिष्ट एल्गोरिथम के रूप में प्रारम्भ करने के अतिरिक्त सामान्यतः निर्दिष्ट प्रकार के इटरेटर का उपयोग करके कार्यान्वित किया जा सकता है। यह SearchForElement को किसी भी कंटेनर पर उपयोग करने की अनुमति देता है जो आवश्यक प्रकार के इटरेटर का समर्थन करता है। | ||
{{TOC limit|3}} | {{TOC limit|3}} | ||
== | == अवलोकन == | ||
इटरेटर | इटरेटर<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 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>{{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> | ||
* समग्र वस्तु के | * किसी समग्र वस्तु के एलिमेंट्स को इसके प्रतिनिधित्व (डेटा संरचनाओं) को उजागर किए बिना एक्सेस और ट्रैवर्स किया जाना चाहिए। | ||
* नए ट्रैवर्सल ऑपरेशंस को | * किसी समग्र ऑब्जेक्ट के इंटरफ़ेस को परिवर्तन किये बिना उसके लिए नए ट्रैवर्सल ऑपरेशंस को परिभाषित किया जाना चाहिए। | ||
एग्रीगेट | एग्रीगेट इंटरफेस में एक्सेस और ट्रैवर्सल ऑपरेशंस को परिभाषित करना अनम्य है क्योंकि यह एग्रीगेट को विशेष एक्सेस और ट्रैवर्सल ऑपरेशंस के लिए प्रतिबद्ध करता है और एग्रीगेट इंटरफेस को परिवर्तन किये बिना पश्चात में नए ऑपरेशंस को जोड़ना असंभव बनाता है। | ||
=== इटरेटर डिज़ाइन पैटर्न किस समाधान का वर्णन करता है? === | === इटरेटर डिज़ाइन पैटर्न किस समाधान का वर्णन करता है? === | ||
* | * भिन्न (इटरेटर) ऑब्जेक्ट को परिभाषित करें जो समग्र ऑब्जेक्ट तक पहुँचने और ट्रैवर्सिंग को समाहित करता है। | ||
* ग्राहक इसके प्रतिनिधित्व (डेटा संरचनाओं) को | * ग्राहक इसके प्रतिनिधित्व (डेटा संरचनाओं) को जाने बिना किसी समुच्चय तक पहुंचने और उसे पार करने के लिए पुनरावर्तक का उपयोग करते हैं। | ||
भिन्न-भिन्न विधियों से किसी समुच्चय तक पहुँचने और पार करने के लिए भिन्न-भिन्न पुनरावृत्तियों का उपयोग किया जा सकता है।<br>नए पुनरावृत्तियों को परिभाषित करके नई पहुंच और ट्रैवर्सल संचालन को स्वतंत्र रूप से परिभाषित किया जा सकता है। | |||
<br>नए | |||
नीचे यूएमएल | नीचे यूएमएल वर्ग और अनुक्रम आरेख भी देखें। | ||
== परिभाषा == | == परिभाषा == | ||
इटरेटर पैटर्न का सार "किसी समग्र वस्तु के एलिमेंट्स को उसके अंतर्निहित प्रतिनिधित्व को उजागर किए बिना क्रमिक रूप से एक्सेस करने की विधि प्रदान करना है।"<ref>[[Design Patterns (book)|Gang Of Four]]</ref> | |||
== संरचना == | == संरचना == | ||
=== यूएमएल वर्ग और अनुक्रम आरेख === | === यूएमएल वर्ग और अनुक्रम आरेख === | ||
[[File:w3sDesign Iterator Design Pattern UML.jpg|frame|none| | [[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>Aggregate1</code> ऑब्जेक्ट के एलिमेंट्स को पार करने के लिए <code>Iterator1</code> का उपयोग करता है। | ||
रन-टाइम इंटरैक्शन दिखाता है: <code>Client</code> | |||
=== यूएमएल वर्ग आरेख === | === यूएमएल वर्ग आरेख === | ||
| Line 46: | Line 37: | ||
== उदाहरण == | == उदाहरण == | ||
{{main| | {{main|इटरेटर}} | ||
कुछ भाषाएँ | |||
कुछ भाषाएँ वाक्यविन्यास का मानकीकरण करती हैं। सी++ और पाइथन इसके उल्लेखनीय उदाहरण हैं। | |||
[[सी ++|'''सी++''']] | |||
सी++ उस भाषा में [[सूचक (कंप्यूटर प्रोग्रामिंग)|पॉइंटर्स (कंप्यूटर प्रोग्रामिंग)]] के शब्दार्थ के साथ पुनरावृत्तियों को प्रारम्भ करता है। सी ++ में, क्लास सभी पॉइंटर ऑपरेशंस को ओवरलोड कर सकती है, इसलिए पुनरावर्तक को प्रारम्भ किया जा सकता है जो कमोबेश पॉइंटर के जैस कार्य करता है, जो डीरेफ़रेंस, इंक्रीमेंट और डिक्रीमेंट के साथ पूर्ण होता है। इसका लाभ यह है कि सी++ एल्गोरिदम जैसे <code>std::sort</code> को प्लेन प्राचीन मेमोरी बफ़र्स पर प्रारंभ किया जा सकता है, और सीखने के लिए कोई नया सिंटैक्स नहीं है। चूँकि, समानता के परीक्षण के लिए "अंत" पुनरावर्तक की आवश्यकता होती है, इसके अतिरिक्त कि पुनरावर्तक को यह ज्ञात हो कि वह अंत तक पहुँच गया है। सी ++ भाषा में, हम कहते हैं कि इटरेटर [[अवधारणा (जेनेरिक प्रोग्रामिंग)]] को मॉडल करता है। | |||
== | यह सी++ 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 <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}; | |||