डबल-चांस फ़ंक्शन
सॉफ्टवेयर इंजीनियरिंग में, डबल-चांस फ़ंक्शन एक सॉफ़्टवेयर सॉफ्टवेयर पैटर्न है जिसमें क्रॉस-प्लेटफॉर्म और स्केलेबल विकास में एक मजबूत अनुप्रयोग होता है।
उदाहरण
कंप्यूटर ग्राफ़िक्स
फ़ंक्शंस के साथ एक ग्राफ़िक्स अप्लिकेशन प्रोग्रामिंग अंतरफलक पर विचार करें DrawPoint
, DrawLine
, और DrawSquare
. यह देखना आसान है DrawLine
के संदर्भ में ही लागू किया जा सकता है DrawPoint
, और DrawSquare
बदले में चार कॉलों के माध्यम से कार्यान्वित किया जा सकता है DrawLine
. यदि आप इस एपीआई को एक नए आर्किटेक्चर में पोर्ट कर रहे थे तो आपके पास एक विकल्प होगा: तीन अलग-अलग कार्यों को मूल रूप से लागू करें (कार्यान्वयन में अधिक समय लगेगा, लेकिन संभवतः तेज़ कोड के परिणामस्वरूप), या लिखें DrawPoint
मूल रूप से, और सामान्य, क्रॉस-प्लेटफ़ॉर्म, कोड का उपयोग करके ऊपर वर्णित अनुसार दूसरों को लागू करें। इस दृष्टिकोण का एक महत्वपूर्ण उदाहरण X11 ग्राफिक्स सिस्टम है, जिसे बहुत कम संख्या में डिवाइस-निर्भर प्राइमेटिव प्रदान करके नए ग्राफिक्स हार्डवेयर में पोर्ट किया जा सकता है, जिससे उच्च स्तर के कार्यों को हार्डवेयर-स्वतंत्र परत पर छोड़ दिया जा सकता है।[1][2]
डबल-मौका फ़ंक्शन इस तरह के कार्यान्वयन को बनाने का एक इष्टतम तरीका है, जिससे पोर्ट का पहला ड्राफ्ट बाजार में तेजी से चलने वाले संस्करण का उपयोग कर सकता है, एक सामान्य संस्करण के साथ चलने में धीमा हो सकता है। DrawPoint
फ़ंक्शन, जबकि बाद के संस्करणों को बाज़ार में धीमे, चलने में तेज़ के रूप में संशोधित किया जा सकता है। जहां डबल-चांस पैटर्न स्कोर उच्च है, वह यह है कि बेस एपीआई में नल ड्राइवर के हिस्से के रूप में यहां दिया गया स्व-सहायक कार्यान्वयन शामिल है, और अन्य सभी कार्यान्वयन इसके विस्तार हैं। नतीजतन, पहला पोर्ट, वास्तव में, पहला प्रयोग करने योग्य कार्यान्वयन है।
C++ में एक विशिष्ट कार्यान्वयन हो सकता है:
class CBaseGfxAPI {
virtual void DrawPoint(int x, int y) = 0; /* Abstract concept for the null driver */
virtual void DrawLine(int x1, int y1, int x2, int y2) { /* DrawPoint() repeated */}
virtual void DrawSquare(int x1, int y1, int x2, int y2) { /* DrawLine() repeated */}
};
class COriginalGfxAPI : public CBaseGfxAPI {
virtual void DrawPoint(int x, int y) { /* The only necessary native calls */ }
virtual void DrawLine(int x1, int y1, int x2, int y2) { /* If this function exists a native DrawLine
routine will be used. Otherwise the base
implementation is run. */}
};
class CNewGfxAPI : public CBaseGfxAPI {
virtual void DrawPoint(int x, int y) { /* The only necessary for native calls */ }
};
ध्यान दें कि CBaseGfxAPI::DrawPoint
फ़ंक्शन का कभी भी उपयोग नहीं किया जाता है, क्योंकि कोई भी ग्राफ़िक्स कॉल उसके व्युत्पन्न वर्गों में से एक से होकर गुजरता है। तो एक कॉल CNewGfxAPI::DrawSquare
द्वारा एक वर्ग प्रस्तुत करने का यह पहला मौका होगा CNewGfxAPI
कक्षा। यदि कोई मूल कार्यान्वयन मौजूद नहीं है, तो बेस क्लास को कॉल किया जाता है, जिस बिंदु पर आभासी कार्य कार्यभार संभालता है और इसका मतलब है CNewGfxAPI::DrawLine
कहा जाता है। यह देता है CNewGfxAPI
यदि कोई उपलब्ध हो तो मूल कोड का उपयोग करने के लिए "दूसरा मौका" दें।
इस पद्धति के साथ, सैद्धांतिक रूप से, ड्रॉप्वाइंट के रूप में केवल एक मूल फ़ंक्शन का उपयोग करके एक संपूर्ण 3 डी इंजन (सॉफ़्टवेयर रैस्टराइज़िंग लागू करना) बनाना संभव है, अन्य कार्यों को समय मिलने पर लागू किया जाता है। व्यवहार में यह निराशाजनक रूप से धीमा होगा, लेकिन यह दोहरे-मौका कार्यों की संभावनाओं को प्रदर्शित करता है।
संदर्भ
- Goodwin, Steven (2005). Cross-Platform Game Programming. Charles River Media. ISBN 1-58450-379-3.