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

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

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

"कोड के डिज़ाइन में लगातार सुधार करके, हम इसके साथ काम करना आसान और आसान बनाते हैं। यह सामान्यतः जो होता है उसके ठीक विपरीत है: थोड़ा रिफैक्टरिंग और नई सुविधाओं को तेजी से जोड़ने के लिए बहुत अधिक ध्यान दिया जाता है। यदि आप निरंतर रिफैक्टरिंग की स्वच्छ आदत में पड़ जाते हैं, तो आप पाएंगे कि कोड को बढ़ाना और बनाए रखना आसान है।"

- जोशुआ केरिवेस्की, रिफैक्टरिंग टू पैटर्न्स

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

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

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

चुनौतियां
रिफैक्टरिंग के लिए वर्तमान में सॉफ्टवेयर प्रणाली का ज्ञान वापस पाने के लिए सॉफ्टवेयर प्रणाली संरचना, डेटा मॉडल और इंट्रा-एप्लिकेशन निर्भरता को निकालने की आवश्यकता होती है।

टीमों के टर्नओवर का अर्थ है प्रणाली की वर्तमान स्थिति और दिवंगत डेवलपर्स द्वारा किए गए डिजाइन निर्णयों के बारे में लापता या गलत ज्ञान। आगे की कोड रीफैक्टरिंग गतिविधियों को इस ज्ञान को पुनः प्राप्त करने के लिए अतिरिक्त प्रयास की आवश्यकता हो सकती है।

रिफैक्टरिंग गतिविधियाँ वास्तुशिल्प संशोधनों को उत्पन्न करती हैं जो सॉफ्टवेयर प्रणाली की संरचनात्मक वास्तुकला को बिगड़ती हैं। इस प्रकार की गिरावट वास्तुशिल्प गुणों जैसे रखरखाव और बोधगम्यता को प्रभावित करती है जिससे सॉफ्टवेयर प्रणाली का पूर्ण पुन: विकास हो सकता है।

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

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

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

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

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

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

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

मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की पुस्तक रिफैक्टरिंग: वर्तमान में कोड के डिजाइन में सुधार करना विहित संदर्भ है।

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

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

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

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

यह भी देखें

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

बाहरी संबंध

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