कोड रीफैक्टरिंग

कंप्यूटर प्रोग्रामिंग और सॉफ्टवेर डिज़ाइन में, कोड रीफैक्टरिंग मौजूदा कंप्यूटर कोड के पुनर्गठन की प्रक्रिया है - अपघटन (कंप्यूटर विज्ञान) को बदलना - इसके बाहरी व्यवहार को बदले बिना। रिफैक्टरिंग का उद्देश्य सॉफ़्टवेयर की डिज़ाइन, संरचना और/या कार्यान्वयन (इसकी गैर-कार्यात्मक आवश्यकता|गैर-कार्यात्मक विशेषताएँ) में सुधार करना है, जबकि इसकी कार्यात्मक आवश्यकता को बनाए रखना है। रिफैक्टरिंग के संभावित लाभों में बेहतर कोड पठनीयता और कम चक्रीय जटिलता शामिल हो सकती है; ये स्रोत कोड में सुधार कर सकते हैं'तानाना को बेहतर बनाने के लिए एक सरल, स्वच्छ, या अधिक अभिव्यंजक आंतरिक सॉफ़्टवेयर वास्तुशिल्प या वस्तु मॉडल बनाएं। रिफैक्टरिंग के लिए एक और संभावित लक्ष्य बेहतर प्रदर्शन है; सॉफ्टवेयर इंजीनियरों को ऐसे प्रोग्राम लिखने की निरंतर चुनौती का सामना करना पड़ता है जो तेजी से प्रदर्शन करते हैं या कम मेमोरी का उपयोग करते हैं।

आमतौर पर, रीफैक्टरिंग मानकीकृत बुनियादी माइक्रो-रिफैक्टरिंग की एक श्रृंखला को लागू करती है, जिनमें से प्रत्येक (आमतौर पर) कंप्यूटर प्रोग्राम के स्रोत कोड में एक छोटा परिवर्तन होता है जो या तो सॉफ़्टवेयर के व्यवहार को संरक्षित करता है, या कम से कम कार्यात्मक आवश्यकताओं के अनुरूप संशोधित नहीं करता है। कई विकास पर्यावरण (सॉफ्टवेयर विकास प्रक्रिया) इन बुनियादी रिफैक्टरिंग के यांत्रिक पहलुओं के प्रदर्शन के लिए स्वचालित समर्थन प्रदान करते हैं। यदि ठीक से किया जाता है, तो कोड रीफैक्टरिंग सॉफ़्टवेयर डेवलपर्स को अंतर्निहित तर्क को सरल बनाकर और जटिलता के अनावश्यक स्तरों को समाप्त करके सिस्टम में छिपे या निष्क्रिय सॉफ्टवेयर बग या भेद्यता (कंप्यूटिंग) को खोजने और ठीक करने में मदद कर सकता है। यदि खराब तरीके से किया जाता है, तो यह आवश्यकता को विफल कर सकता है कि बाहरी कार्यक्षमता को नहीं बदला जा सकता है, और इस प्रकार नए बग पेश कर सकते हैं।

"By continuously improving the design of code, we make it easier and easier to work with. This is in sharp contrast to what typically happens: little refactoring and a great deal of attention paid to expediently add new features. If you get into the hygienic habit of refactoring continuously, you'll find that it is easier to extend and maintain code."

- Joshua Kerievsky, Refactoring to Patterns

प्रेरणा
रिफैक्टरिंग आमतौर पर कोड गंध को देखकर प्रेरित होती है। उदाहरण के लिए, हाथ में विधि बहुत लंबी हो सकती है, या यह किसी अन्य नजदीकी विधि का लगभग डुप्लिकेट कोड हो सकता है। एक बार पहचानने के बाद, इस तरह की समस्याओं को स्रोत कोड को फिर से सक्रिय करके, या इसे एक नए रूप में परिवर्तित करके संबोधित किया जा सकता है जो पहले जैसा ही व्यवहार करता है लेकिन अब गंध नहीं करता है।

लंबे रूटीन के लिए, एक या अधिक छोटे सबरूटीन निकाले जा सकते हैं; या डुप्लिकेट रूटीन के लिए, डुप्लिकेशन को हटाया जा सकता है और एक साझा फ़ंक्शन के साथ प्रतिस्थापित किया जा सकता है। रिफैक्टरिंग करने में विफलता के परिणामस्वरूप तकनीकी ऋण जमा हो सकता है; दूसरी ओर, रिफैक्टरिंग तकनीकी ऋण चुकाने के प्राथमिक साधनों में से एक है।

लाभ
रिफैक्टरिंग की गतिविधि के लाभों की दो सामान्य श्रेणियां हैं।
 * 1) रखरखाव। बग्स को ठीक करना आसान है क्योंकि सोर्स कोड को पढ़ना आसान है और इसके लेखक के इरादे को समझना आसान है। यह व्यक्तिगत रूप से संक्षिप्त, अच्छी तरह से नामित, एकल-उद्देश्यीय तरीकों के एक सेट में बड़े मोनोलिथिक रूटीन को कम करके प्राप्त किया जा सकता है। यह एक विधि को अधिक उपयुक्त वर्ग में ले जाकर या भ्रामक टिप्पणियों को हटाकर प्राप्त किया जा सकता है।
 * 2) एक्स्टेंसिबिलिटी। यदि यह पहचानने योग्य डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) का उपयोग करता है, तो एप्लिकेशन की क्षमताओं का विस्तार करना आसान है, और यह कुछ लचीलापन प्रदान करता है जहां पहले कोई अस्तित्व में नहीं हो सकता था। प्रदर्शन इंजीनियरिंग कार्यक्रमों में अक्षमताओं को दूर कर सकती है, जिसे सॉफ़्टवेयर ब्लोट के रूप में जाना जाता है, जो पारंपरिक सॉफ़्टवेयर-विकास रणनीतियों से उत्पन्न होती है, जिसका उद्देश्य किसी एप्लिकेशन के विकास के समय को चलाने में लगने वाले समय को कम करना है। प्रदर्शन इंजीनियरिंग हार्डवेयर सुरक्षा मॉड्यूल के लिए सॉफ्टवेयर को भी तैयार कर सकती है, जिस पर वह चलता है, उदाहरण के लिए, समानांतर प्रोसेसर और वेक्टर इकाइयों का लाभ उठाने के लिए।

चुनौतियां
रिफैक्टरिंग के लिए मौजूदा सॉफ्टवेयर सिस्टम का ज्ञान वापस पाने के लिए सॉफ्टवेयर सिस्टम संरचना, डेटा मॉडल और इंट्रा-एप्लिकेशन निर्भरता को निकालने की आवश्यकता होती है। टीमों के टर्नओवर का अर्थ है सिस्टम की वर्तमान स्थिति और दिवंगत डेवलपर्स द्वारा किए गए डिजाइन निर्णयों के बारे में लापता या गलत ज्ञान। आगे की कोड रीफैक्टरिंग गतिविधियों को इस ज्ञान को पुनः प्राप्त करने के लिए अतिरिक्त प्रयास की आवश्यकता हो सकती है। रिफैक्टरिंग गतिविधियाँ वास्तुशिल्प संशोधनों को उत्पन्न करती हैं जो एक सॉफ्टवेयर सिस्टम की संरचनात्मक वास्तुकला को बिगड़ती हैं। इस तरह की गिरावट वास्तुशिल्प गुणों जैसे रखरखाव और बोधगम्यता को प्रभावित करती है जिससे सॉफ्टवेयर सिस्टम का पूर्ण पुन: विकास हो सकता है। एल्गोरिदम और कोड निष्पादन के अनुक्रमों के बारे में डेटा प्रदान करने वाले टूल और तकनीकों का उपयोग करते समय कोड रिफैक्टरिंग गतिविधियों को सॉफ्टवेयर बुद्धि के साथ सुरक्षित किया जाता है। सॉफ्टवेयर सिस्टम संरचना, डेटा मॉडल, और इंट्रा-कंपोनेंट निर्भरता की आंतरिक स्थिति के लिए एक बोधगम्य प्रारूप प्रदान करना एक उच्च-स्तरीय समझ बनाने के लिए एक महत्वपूर्ण तत्व है और फिर क्या संशोधित करने की आवश्यकता है, और कैसे परिष्कृत विचार।

परीक्षण
रिफैक्टरिंग से पहले स्वचालित इकाई परीक्षण स्थापित किया जाना चाहिए ताकि यह सुनिश्चित हो सके कि रूटीन अभी भी अपेक्षा के अनुरूप व्यवहार कर रहे हैं। एकल परमाणु प्रतिबद्ध#संशोधन नियंत्रण के साथ किए जाने पर इकाई परीक्षण बड़े रिफैक्टरों में भी स्थिरता ला सकते हैं। कई परियोजनाओं में फैले सुरक्षित और परमाणु रिफैक्टरों को अनुमति देने के लिए एक आम रणनीति सभी परियोजनाओं को एक ही भंडार (संस्करण नियंत्रण) में संग्रहित करना है, जिसे monorepo कहा जाता है। इकाई परीक्षण के स्थान पर, रिफैक्टरिंग तब एक छोटा प्रोग्राम परिवर्तन करने, शुद्धता सुनिश्चित करने के लिए परीक्षण करने और एक और छोटा परिवर्तन करने का एक पुनरावृत्त चक्र है। यदि किसी बिंदु पर कोई परीक्षण विफल हो जाता है, तो अंतिम छोटा परिवर्तन पूर्ववत किया जाता है और एक अलग तरीके से दोहराया जाता है। कई छोटे चरणों के माध्यम से कार्यक्रम उस स्थान से आगे बढ़ता है जहाँ आप चाहते हैं कि वह हो। इस पुनरावृत्त प्रक्रिया के व्यावहारिक होने के लिए, परीक्षणों को बहुत तेज़ी से चलना चाहिए, या प्रोग्रामर को अपने समय का एक बड़ा अंश परीक्षणों के समाप्त होने की प्रतीक्षा में खर्च करना होगा। अत्यधिक प्रोग्रामिंग और अन्य फुर्तीले सॉफ्टवेयर विकास के समर्थक इस गतिविधि को सॉफ्टवेयर विकास प्रक्रिया का एक अभिन्न अंग बताते हैं।

तकनीक
यहाँ माइक्रो-रिफैक्टरिंग के कुछ उदाहरण दिए गए हैं; इनमें से कुछ केवल कुछ भाषाओं या भाषा प्रकारों पर ही लागू हो सकते हैं। मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की रिफैक्टरिंग बुक में एक लंबी सूची मिल सकती है और वेबसाइट। कई विकास वातावरण इन माइक्रो-रिफैक्टरिंग के लिए स्वचालित समर्थन प्रदान करते हैं। उदाहरण के लिए, एक प्रोग्रामर एक चर के नाम पर क्लिक कर सकता है और फिर संदर्भ मेनू से एनकैप्सुलेट फ़ील्ड रिफैक्टरिंग का चयन कर सकता है। आईडीई तब अतिरिक्त विवरण के लिए संकेत देगा, आमतौर पर समझदार चूक और कोड परिवर्तनों के पूर्वावलोकन के साथ। प्रोग्रामर द्वारा पुष्टि के बाद यह पूरे कोड में आवश्यक परिवर्तन करेगा।
 * तकनीकें जो अधिक एप्लिकेशन खोज और समझ की अनुमति देती हैं
 * कार्यक्रम निर्भरता ग्राफ - डेटा और नियंत्रण निर्भरताओं का स्पष्ट प्रतिनिधित्व
 * सिस्टम डिपेंडेंस ग्राफ - पीडीजी के बीच प्रक्रिया कॉल का प्रतिनिधित्व
 * सॉफ्टवेयर इंटेलिजेंस - मौजूदा इंट्रा-एप्लिकेशन निर्भरताओं को समझने के लिए प्रारंभिक स्थिति को रिवर्स इंजीनियर करता है
 * तकनीकें जो अधिक अमूर्तता (कंप्यूटर विज्ञान) की अनुमति देती हैं
 * फील्ड एनकैप्सुलेशन - गेट्टर और सेटर विधियों के साथ फ़ील्ड तक पहुँचने के लिए बल कोड
 * टाइप सामान्यीकरण - अधिक कोड साझा करने की अनुमति देने के लिए अधिक सामान्य प्रकार बनाएं
 * टाइप-चेकिंग कोड को राज्य/रणनीति से बदलें
 * बहुरूपता (कंप्यूटर विज्ञान) के साथ सशर्त बदलें
 * कोड को अधिक तार्किक टुकड़ों में तोड़ने की तकनीकें
 * कंपोनेंटाइजेशन कोड को पुन: प्रयोज्य सिमेंटिक इकाइयों में तोड़ देता है जो स्पष्ट, अच्छी तरह से परिभाषित, उपयोग में आसान इंटरफेस पेश करता है।
 * वर्ग निकालें मौजूदा क्लास से कोड के हिस्से को नए क्लास में ले जाता है।
 * एक्सट्रैक्ट मेथड, एक बड़ी विधि (कंप्यूटर साइंस) के हिस्से को एक नई विधि में बदलने के लिए। कोड को छोटे-छोटे टुकड़ों में तोड़कर इसे आसानी से समझा जा सकता है। यह समारोह (प्रोग्रामिंग) पर भी लागू होता है।
 * नाम और कोड के स्थान में सुधार के लिए तकनीकें
 * मूव मेथड या मूव फील्ड - अधिक उपयुक्त क्लास (कंप्यूटर साइंस) या सोर्स फाइल पर जाएं
 * विधि का नाम बदलें या फ़ील्ड का नाम बदलें - नाम को एक नए में बदलना जो इसके उद्देश्य को बेहतर ढंग से प्रकट करता है
 * पुल अप - ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) में, सुपरक्लास (कंप्यूटर साइंस) में जाएं
 * नीचे पुश करें - OOP में, एक उपवर्ग (कंप्यूटर विज्ञान) में जाएँ * स्वचालित क्लोन पहचान

हार्डवेयर रीफैक्टरिंग
जबकि रिफैक्टरिंग शब्द मूल रूप से सॉफ्टवेयर कोड के रिफैक्टरिंग के लिए विशेष रूप से संदर्भित है, हाल के वर्षों में हार्डवेयर विवरण भाषाओं में लिखे गए कोड को भी रिफैक्टरिंग किया गया है। हार्डवेयर विवरण भाषाओं में कोड की रीफैक्टरिंग के लिए हार्डवेयर रीफैक्टरिंग शब्द का उपयोग शॉर्टहैंड शब्द के रूप में किया जाता है। चूंकि हार्डवेयर विवरण भाषाओं को अधिकांश हार्डवेयर इंजीनियरों द्वारा प्रोग्रामिंग भाषा नहीं माना जाता है, हार्डवेयर रीफैक्टरिंग को पारंपरिक कोड रीफैक्टरिंग से अलग क्षेत्र माना जाना चाहिए।

ज़ेंग और हस द्वारा एनालॉग हार्डवेयर विवरण (VHDL-एम्स में) की स्वचालित रीफैक्टरिंग प्रस्तावित की गई है। उनके दृष्टिकोण में, रीफैक्टरिंग एक हार्डवेयर डिज़ाइन के सिम्युलेटेड व्यवहार को संरक्षित करता है। गैर-कार्यात्मक माप जो सुधार करता है वह यह है कि रिफैक्टर कोड को मानक संश्लेषण उपकरण द्वारा संसाधित किया जा सकता है, जबकि मूल कोड नहीं हो सकता। Synopsys के साथी माइक कीटिंग द्वारा डिजिटल हार्डवेयर विवरण भाषाओं की रीफैक्टरिंग, हालांकि मैन्युअल रीफैक्टरिंग की भी जांच की गई है। उनका लक्ष्य जटिल प्रणालियों को समझना आसान बनाना है, जिससे डिजाइनरों की उत्पादकता बढ़ जाती है।

इतिहास
प्रकाशित साहित्य में रिफैक्टरिंग शब्द का पहला ज्ञात उपयोग सितंबर, 1990 में विलियम ओपडीके और राल्फ जॉनसन (कंप्यूटर वैज्ञानिक) के लेख में हुआ था। ग्रिसवॉल्ड की पीएच.डी. थीसिस, Opdyke की पीएच.डी. थीसिस, 1992 में प्रकाशित, ने भी इस शब्द का इस्तेमाल किया। हालांकि दशकों से अनौपचारिक रूप से कोड को रिफैक्टरिंग किया जाता रहा है, बिल ग्रिसवॉल्ड की 1991 पीएच.डी. निबंध विलियम ओपडीके के 1992 के शोध प्रबंध के बाद कार्यात्मक और प्रक्रियात्मक कार्यक्रमों को फिर से बनाने पर पहला प्रमुख शैक्षणिक कार्य है वस्तु-उन्मुख कार्यक्रमों के पुनर्संरचना पर, हालांकि सभी सिद्धांत और तंत्र कार्यक्रम परिवर्तन प्रणालियों के रूप में लंबे समय से उपलब्ध हैं। ये सभी संसाधन रिफैक्टरिंग के लिए सामान्य तरीकों की एक सूची प्रदान करते हैं; एक रीफैक्टरिंग विधि में वैज्ञानिक पद्धति को लागू करने के तरीके और संकेतकों के बारे में वर्णन है कि आपको विधि कब लागू करनी चाहिए (या नहीं करनी चाहिए)।

मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की पुस्तक रिफैक्टरिंग: मौजूदा कोड के डिजाइन में सुधार करना विहित संदर्भ है। कम से कम 1980 के दशक की शुरुआत से ही फोर्थ (प्रोग्रामिंग भाषा) समुदाय में फैक्टरिंग और फैक्टरिंग आउट शब्द का इस तरह से उपयोग किया जाता रहा है। लियो ब्रॉडी (प्रोग्रामर) की किताब आगे सोच रहा है (1984) का अध्याय छह विषय को समर्पित है।

चरम प्रोग्रामिंग में, एक्सट्रैक्ट मेथड रिफैक्टरिंग तकनीक का अनिवार्य रूप से फोर्थ में फैक्टरिंग के समान अर्थ है; एक शब्द (या फ़ंक्शन (प्रोग्रामिंग)) को छोटे, अधिक आसानी से बनाए रखने वाले कार्यों में तोड़ने के लिए।

रिफैक्टरिंग का पुनर्निर्माण भी किया जा सकता है <रेफरी नाम = व्हाट्स-इज़-कोड-रिफैक्टरिंग? > सीवीएस या एसवीएन जैसे सॉफ़्टवेयर रिपॉजिटरी में रिकॉर्ड किए गए जटिल सॉफ़्टवेयर परिवर्तनों के संक्षिप्त विवरण प्रस्तुत करने के बाद।

स्वचालित कोड रीफैक्टरिंग
कई सॉफ्टवेयर पाठ संपादक और एकीकृत विकास पर्यावरण में ऑटोमेटेड रिफैक्टरिंग सपोर्ट है। यहाँ इनमें से कुछ संपादकों, या तथाकथित रिफैक्टरिंग ब्राउज़र की सूची दी गई है।
 * डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट (सी, सी++, सी#, कोबोल, जावा, पीएचपी और अन्य भाषाओं के लिए बड़े पैमाने पर रीफैक्टरिंग लागू करता है)
 * ग्रहण आधारित:
 * ग्रहण (सॉफ्टवेयर) (जावा (प्रोग्रामिंग भाषा) के लिए, और कुछ हद तक, सी ++, पीएचपी, रूबी और जावास्क्रिप्ट)
 * PyDev (पायथन (प्रोग्रामिंग भाषा) के लिए)
 * फोट्रान (ग्रहण (सॉफ्टवेयर) के लिए एक फोरट्रान प्लगइन)
 * एम्बरकाडेरो डेल्फी
 * इंटेलीजे आधारित:
 * Resharper (सी शार्प (प्रोग्रामिंग लैंग्वेज) के लिए | सी#)
 * ऐपकोड (उद्देश्य-सी, सी और सी ++ के लिए)
 * IntelliJ IDEA (जावा के लिए (प्रोग्रामिंग भाषा))
 * PyCharm (पायथन (प्रोग्रामिंग भाषा) के लिए)
 * वेबतूफान (जावास्क्रिप्ट के लिए)
 * PhpStorm (PHP के लिए)
 * एंड्रॉइड स्टूडियो (जावा (प्रोग्रामिंग भाषा) और सी ++ के लिए)
 * JDeveloper (जावा के लिए (प्रोग्रामिंग भाषा))
 * NetBeans (जावा के लिए (प्रोग्रामिंग भाषा))
 * स्मॉलटॉक: अधिकांश बोलियों में शक्तिशाली रिफैक्टरिंग टूल शामिल हैं। कई लोग राल्फ जॉनसन (कंप्यूटर वैज्ञानिक) द्वारा 90 के दशक की शुरुआत में निर्मित मूल रीफैक्टरिंग ब्राउज़र का उपयोग करते हैं।
 * विजुअल स्टूडियो आधारित:
 * विजुअल स्टूडियो (.NET और C++ के लिए)
 * कोडरश (विजुअल स्टूडियो के लिए ऐडऑन)
 * विजुअल असिस्ट (सी # और सी ++ के लिए रीफैक्टरिंग समर्थन के साथ विजुअल स्टूडियो के लिए एडन)
 * विंग आईडीई (पायथन (प्रोग्रामिंग भाषा) के लिए)
 * एक्सकोड (सी, उद्देश्य सी और स्विफ्ट (प्रोग्रामिंग भाषा) के लिए)
 * क्यूटी निर्माता (सी++, ऑब्जेक्टिव-सी और क्यूएमएल के लिए)

यह भी देखें

 * सुधार पैटर्न
 * को़ड समीक्षा
 * डेटाबेस रीफैक्टरिंग
 * अपघटन (कंप्यूटर विज्ञान)
 * मॉड्यूलर प्रोग्रामिंग
 * भ्रमित कोड
 * प्रीफैक्टरिंग
 * चिंताओ का विभाजन
 * सॉफ्टवेयर सहकर्मी समीक्षा
 * परीक्षण संचालित विकास

बाहरी संबंध

 * What Is Refactoring? (c2.com article)
 * Martin Fowler's homepage about refactoring