डबल-चांस फ़ंक्शन
सॉफ्टवेयर इंजीनियरिंग में, डबल-चांस फ़ंक्शन एक सॉफ़्टवेयर सॉफ्टवेयर पैटर्न है जिसमें क्रॉस-प्लेटफॉर्म और स्केलेबल विकास में एक प्रबल अनुप्रयोग होता है।
उदाहरण
कंप्यूटर ग्राफ़िक्स
DrawPoint
, DrawLine
और DrawSquare
के कार्यों के साथ एक ग्राफिक्स एपीआई पर विचार करें। यह देखना आसान है कि DrawLine
को केवल DrawPoint
के संदर्भ में प्रयुक्त किया जा सकता है, और DrawSquare
को बदले में DrawSquare
पर चार कॉल के माध्यम से प्रयुक्त किया जा सकता है। यदि आप इस एपीआई को एक नए आर्किटेक्चर में पोर्ट कर रहे थे तो आपके पास एक विकल्प होगा: तीन अलग-अलग कार्यों को मूल रूप से प्रयुक्त करें (कार्यान्वयन में अधिक समय लगता है, किन्तु संभवतः तेज़ कोड के परिणामस्वरूप), या 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.