जवाबों:
फ़ीचर फ़्लैग एक इंजीनियरिंग उपकरण है जिसका उपयोग उत्पाद विकास में लंबे समय तक रहने वाली शाखा और संघर्ष से बचने के लिए किया जा सकता है। यहां बताया गया है कि कैसे इसका उपयोग ऑब्जेक्ट-ओरिएंटेड भाषा के संदर्भ में किया जा सकता है, जिससे डेवलपर्स को किसी विशिष्ट उत्पाद सुविधा पर सहयोग करने में मदद मिलती है, जबकि एक नया संस्करण संभालता है। इस समाधान का उपयोग गैर-ऑब्जेक्ट-ओरिएंटेड संदर्भों में भी किया जा सकता है, बशर्ते "इंटरफ़ेस" की एक धारणा मौजूद हो। ( cf. OCaml मॉड्यूल प्रणाली।)
चित्रण के उद्देश्य के लिए, हम एक उपकरण को डेटाबेस में संग्रहीत डेटा के बारे में रिपोर्ट पेश करते हैं। कोड अनुरोधों को निष्पादित करने के लिए उपयोग किया जाने वाला डेटाबेसक्लाइंट वर्ग लागू करता है। जैसे ही डेटासेट बढ़ता है, यह स्पष्ट हो जाता है कि कुछ वैकल्पिक डेटा लेआउट अनुप्रयोग के प्रदर्शन में सुधार करेंगे। इसलिए ऐलिस का एक नया संस्करण का विकास होगा DatabaseClient , बेहतर लेआउट के साथ संरचनाओं से डेटा पुनः प्राप्त करने में सक्षम है, जबकि बॉब ऐतिहासिक बनाए रखेंगे DatabaseClient ।
निम्न चरणों के साथ, ऐलिस और बॉब अपने संघर्षों को कम करते हुए अल्पकालिक शाखाओं पर सहयोग कर सकते हैं।
ऐलिस नाम बदलने DatabaseClient को DatabaseClient_v1 और एक प्रतिनिधि वर्ग बनाएं जिसका नाम DatabaseClient एक वस्तु का उपयोग करता है DatabaseClient_v1 और औजार एक अंतरफलक कहा जाता DatabaseClientInterface। (यदि संभव हो तो, यह DatabaseClientInterface एक कोड आर्टिफैक्ट होना चाहिए लेकिन डक-टाइप की गई भाषाएं हमेशा इसका समर्थन नहीं करती हैं।)
बॉब 1 में ऐलिस द्वारा किए गए परिवर्तनों की समीक्षा करता है और इस बात से अवगत है कि उसका अनुरक्षण कार्य DatabaseClient_v1 पर होना चाहिए ।
ऐलिस अनुप्रयोग है कि के व्यवहार को नियंत्रित करता है में एक नया विन्यास ध्वज का परिचय DatabaseClient प्रतिनिधि और औजार एक DatabaseClient_v2 प्लेसहोल्डर, एक वर्ग को लागू करने DatabaseClientInterface जिसका तरीकों सब एक "लागू नहीं" अपवाद फेंक देते हैं।
इस के बाद, ऐलिस और बॉब, स्पष्ट तुल्यकालन के बिना सहयोग कर सकते हैं क्योंकि उनके संबंधित पुनरावृत्तियों में लिखे कोड के अधीन है DatabaseClientInterface । यह उनके समवर्ती कार्य से उत्पन्न संघर्ष के जोखिम को कम करता है।
ऐलिस से परिवर्तन बहुत कम हो सकते हैं, जैसे परीक्षण लागू करना, एक विधि को लागू करना, या आंशिक रूप से ऐसा करना, क्योंकि उत्पादन में, कोड का उपयोग करने के लिए चयन नहीं किया जाता है और पूरी तरह कार्यात्मक होने की आवश्यकता नहीं है। स्वचालित testsuite तो कॉन्फ़िगर किया जाना चाहिए कि DatabaseClientInterface हमेशा का उपयोग करता DatabaseClient_v1 ऐलिस आसानी से करने के लिए टॉगल कर सकते हैं, जबकि DatabaseClient_v2 जब स्थानीय स्तर पर testsuite चल रहा है - या एक कस्टम सीआई सेटअप में। एक बार सब कुछ तैयार है, एक एकल, परिवर्तन प्रदर्शन कर सकते हैं को नियंत्रित करने वाले विन्यास मूल्य अपडेट करके प्रतिबद्ध DatabaseClient प्रतिनिधि।
कदम काफी "आसान" हैं, एक फीचर फ्लैग ऐप में जाने के लिए आपको मूल रूप से दो चीजों की आवश्यकता है:
फ़ीचर फ़्लैग का मूल उन्हें चालू / बंद करना है, लेकिन जल्दी ही आप एक नया फीचर रैंप-अप तरीके से जारी करना चाहेंगे, उदाहरण के लिए: 5 सर्वर पर 5 ऐप को होस्ट करने के लिए "चालू" करने की सुविधा है। आप तब किसी अन्य सर्वर पर सुविधा को चालू करते हैं, जब तक कि सभी सर्वर "चालू" न हों।
इसका मतलब है कि आपको इसके बिना ऐप के अनुकूल होने की अपनी सुविधा के बारे में सावधान रहना होगा (उदाहरण के लिए DB में अतिरिक्त कॉलम)।
पहिए को सुदृढ़ करने से बचने के लिए विभिन्न भाषाओं में फ्रेमवर्क मौजूद है, अब अस्सी के एक मेंटेनेंस ने इसे कैसे काम किया, यह समझाने के लिए एक दिलचस्प रीडमी है।
एम्बेडेड सॉफ़्टवेयर की दुनिया अक्सर बिल्ड-टाइम फ़्लैग का उपयोग करती है, ऐप कोड में ही ( #define
/ #ifdef
कथन, उदाहरण के लिए) और / या बिल्ड टूल कॉन्फ़िगरेशन फ़ाइलों में ( makefile
उदाहरण के लिए)।
बिल्ड फ्लैग का उपयोग, समान तरीके से किया जा सकता है, न केवल सुविधाओं के लिए, बल्कि सभी प्रकार के कोड रीफैक्टरिंग, माइग्रेशन, डिबग सपोर्ट आदि के लिए भी)। वे निर्माण को तोड़ने या शाखा में पहले से ही काम कर रहे सुविधाओं / परियोजनाओं में प्रतिगमन के बिना एकीकरण शाखा में आंशिक या असत्यापित परिवर्तन करने की अनुमति देते हैं। बड़े / जोखिम भरे / धीमे प्रगति परिवर्तनों के साथ बिंदु निर्धारण को संभालने के लिए उत्कृष्ट (निरंतर अन्यथा एक लंबे समय तक रहने वाली शाखा की आवश्यकता होगी)।
लेकिन प्रतिगमन के लिए पहले से मौजूद शाखा कोड को सत्यापित करने के अलावा, नए कोड की प्रगति / स्थिरता सत्यापन भी करना संभव है। इसके लिए बिल्ड-टाइम फ्लैग को टॉगल करना होगा।
झंडे को टॉगल करने का एक तरीका एक ही शाखा के CI सिस्टम की एक अलग सत्यापन पाइपलाइन में उपयोग करना होगा (यदि इस तरह की कार्यक्षमता के लिए समर्थन है), झंडे को टॉगल करना - एक अलग कार्यक्षेत्र से पहले लागू किया जाना निर्माण। इस कार्यक्षेत्र में कलाकृतियों का एक अलग सेट बनाया जाएगा और फिर सत्यापित किया जाएगा।
वैकल्पिक रूप से एक लंबे समय तक रहने वाली सुविधा शाखा को मुख्य एकीकरण शाखा से खींचा जा सकता है, लेकिन इस सुविधा शाखा में एकमात्र परिवर्तन टॉगल ध्वज होगा। इस छोटे से बदलाव के कारण फीचर शाखा अपने आप बहुत तेजी से सिंक हो सकती है - व्यावहारिक रूप से मुख्य एकीकरण शाखा को बहुत करीब से छायांकन करती है। इस शाखा पर एक अलग सीआई निष्पादन को अब प्रारंभिक पैचफ़ाइल की आवश्यकता नहीं होगी। इस तरह की सुविधा शाखा को विस्तारित अवधि के लिए भी ले जाना तुच्छ होगा।
मुख्य एकीकरण शाखा में, नई बिल्ड कलाकृतियों को बनाना भी संभव हो सकता है, जो वास्तव में मौजूदा बिल्ड कलाकृतियों के क्लोन ही होंगे, लेकिन झंडे के साथ। इस तरह से न तो प्रारंभिक पैचफ़ाइल और न ही मुख्य शाखा में नए कोड को सत्यापित करने के लिए फ़ीचर शाखा आवश्यक होगी।