पहले एक नया एपीआई बनाएं, वही करें जो आप चाहते हैं कि आपका नया एपीआई व्यवहार हो। यदि ऐसा होता है कि इस नए एपीआई का एक नाम OLDER API है, तो मैं नए API नाम के लिए _NEW नाम रखता हूं।
int DoSomethingInterestingAPI ();
हो जाता है:
int DoSomethingInterestingAPI_NEW (int take_more_arguments); int DoSomethingInterestingAPI_OLD (); int DoSomethingInterestingAPI () {DoSomethingInterestingAPI_NEW (जो भी_बदलता है_मीमिक्स_the_old_API); ठीक है - इस स्तर पर - आपके सभी प्रतिगमन परीक्षण डिल पास - DoSomethingInterestingAPI () नाम का उपयोग करते हुए।
अगला, अपने कोड के माध्यम से जाओ और DoSomethingInterestingAPI (देव) के उपयुक्त संस्करण के लिए DoSomethingInterestingAPI () के लिए सभी कॉल को बदलें। इसमें नए एपीआई का उपयोग करने के लिए आपके प्रतिगमन परीक्षणों के कुछ हिस्सों को अद्यतन / पुनर्लेखन करना शामिल है।
अगला, [[पदावनत ()]] के रूप में DoSomethingInterestingAPIOLD () को चिह्नित करें। जब तक आप चाहें तब तक अपग्रेड किए गए एपीआई के आसपास रहें (जब तक कि आपने सुरक्षित रूप से सभी कोड को अपडेट नहीं किया है जो उस पर निर्भर हो सकता है)।
इस दृष्टिकोण के साथ, आपके प्रतिगमन परीक्षणों में कोई भी विफलता बस उस प्रतिगमन परीक्षण में कीड़े हैं या आपके कोड में कीड़े की पहचान करते हैं - ठीक वैसे ही जैसे आप चाहते हैं। स्पष्ट रूप से एपीआई के _NEW और _OLD संस्करणों को बनाकर एक एपीआई को संशोधित करने की इस चरणबद्ध प्रक्रिया से आपको नए और पुराने कोड के बिट्स थोड़ी देर के लिए सहवास करने की अनुमति मिलती है।
व्यवहार में इस दृष्टिकोण का एक अच्छा (कठिन) उदाहरण है। मेरे पास BitSubstring () फ़ंक्शन था - जहां मैंने तीसरे पैरामीटर होने के दृष्टिकोण का उपयोग किया था, जहां विकल्प में बिट्स का COUNT होना चाहिए। सी ++ में अन्य एपीआई और पैटर्न के अनुरूप होने के लिए, मैं फ़ंक्शन के तर्क के रूप में शुरू / समाप्त करना चाहता था।
https://github.com/SophistSolutions/Stroika/commit/003dd8707405c43e735ca71116c773b108c217c0
मैंने नए API के साथ एक फ़ंक्शन BitSubstring_NEW बनाया, और इसका उपयोग करने के लिए अपने सभी कोड को अपडेट कर दिया (BitSubString के लिए कोई और कॉल नहीं छोड़ रहा)। लेकिन मैंने कई रिलीज़ (महीनों) के लिए कार्यान्वयन में छोड़ दिया - और इसे पदावनत किया - ताकि हर कोई BitSubString_NEW (और उस समय के लिए एक गिनती से तर्क को शुरू / समाप्ति शैली में बदल सके)।
तब - जब वह संक्रमण पूरा हो गया था, मैंने BitSubString () और BitSubString_NEW-> BitSubString () (और नाम BitSubString_NEW नाम हटा दिया) को हटाते हुए एक और कमिट किया।