कोड रीफैक्टरिंग: Difference between revisions
No edit summary |
No edit summary |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 2: | Line 2: | ||
{{Redirect|रिफ्लेक्टर|विकिपीडिया पर "रिफैक्टर" का उपयोग|विकिपीडिया:रिफैक्टरिंग टॉक पेज|selfref = सत्य}} | {{Redirect|रिफ्लेक्टर|विकिपीडिया पर "रिफैक्टर" का उपयोग|विकिपीडिया:रिफैक्टरिंग टॉक पेज|selfref = सत्य}} | ||
{{About-distinguish|एक व्यवहार-संरक्षण परिवर्तन|पुनर्लेखन (प्रोग्रामिंग)}} | {{About-distinguish|एक व्यवहार-संरक्षण परिवर्तन|पुनर्लेखन (प्रोग्रामिंग)}} | ||
[[कंप्यूटर प्रोग्रामिंग]] और [[सॉफ्टवेर डिज़ाइन]] में, कोड रीफैक्टरिंग | [[कंप्यूटर प्रोग्रामिंग]] और [[सॉफ्टवेर डिज़ाइन]] में, कोड रीफैक्टरिंग वर्तमान में [[कंप्यूटर कोड]] को उसके बाहरी व्यवहार को बदले बिना ''[[अपघटन (कंप्यूटर विज्ञान)|फैक्टरिंग (कंप्यूटर विज्ञान)]]'' को बदलने के पुनर्गठन की प्रक्रिया है। रिफैक्टरिंग का उद्देश्य इसकी कार्यक्षमता को संरक्षित करते हुए [[सॉफ़्टवेयर]] की डिज़ाइन, संरचना और/या कार्यान्वयन (इसकी ''गैर-[[कार्यात्मक आवश्यकता|कार्यात्मक विशेषताएँ]]'') में सुधार करना है। रिफैक्टरिंग के संभावित लाभों में उत्तम कोड [[पठनीयता]] और कम चक्रीय जटिलता सम्मिलित हो सकती है; ये स्रोत कोड की रखरखाव क्षमता में सुधार कर सकते हैं और {{'}}[[तानाना|विस्तारशीलता]] में सुधार के लिए एक सरल, स्वच्छ, या अधिक अभिव्यंजक आंतरिक [[सॉफ़्टवेयर वास्तुशिल्प]] या [[वस्तु मॉडल]] बना सकते हैं। रिफैक्टरिंग के लिए एक और संभावित लक्ष्य उत्तम प्रदर्शन है; सॉफ्टवेयर इंजीनियरों को ऐसे प्रोग्राम लिखने की निरंतर चुनौती का सामना करना पड़ता है जो तेजी से प्रदर्शन करते हैं या कम मेमोरी का उपयोग करते हैं। | ||
सामान्यतः, रीफैक्टरिंग मानकीकृत मूलभूत माइक्रो-रिफैक्टरिंग की श्रृंखला को प्रयुक्त करती है, जिनमें से प्रत्येक (सामान्यतः) कंप्यूटर प्रोग्राम के स्रोत कोड में छोटा परिवर्तन होता है जो या तो सॉफ़्टवेयर के व्यवहार को संरक्षित करता है, या कम से कम कार्यात्मक आवश्यकताओं के अनुरूप संशोधित नहीं करता है। कई [[विकास पर्यावरण (सॉफ्टवेयर विकास प्रक्रिया)]] इन मूलभूत रिफैक्टरिंग के यांत्रिक स्थितियों के प्रदर्शन के लिए स्वचालित समर्थन प्रदान करते हैं। यदि ठीक से किया जाता है, तो कोड रीफैक्टरिंग सॉफ़्टवेयर डेवलपर्स को अंतर्निहित तर्क को सरल बनाकर और जटिलता के अनावश्यक स्तरों को समाप्त करके सिस्टम में छिपे या निष्क्रिय [[सॉफ्टवेयर बग]] या [[भेद्यता (कंप्यूटिंग)|कमजोरियों (कंप्यूटिंग)]] को खोजने और ठीक करने में सहायता कर सकता है। यदि खराब विधि से किया जाता है, तो यह आवश्यकता को विफल कर सकता है कि बाहरी कार्यक्षमता को नहीं बदला जा सकता है, और इस प्रकार नए बग प्रस्तुत कर सकते हैं। | |||
{{quote|कोड के डिज़ाइन में लगातार सुधार करके, हम इसके साथ काम करना आसान और आसान बनाते हैं। यह सामान्यतः जो होता है उसके ठीक विपरीत है: थोड़ा रिफैक्टरिंग और नई सुविधाओं को तेजी से जोड़ने के लिए बहुत अधिक ध्यान दिया जाता है। यदि आप निरंतर रिफैक्टरिंग की स्वच्छ आदत में पड़ जाते हैं, तो आप पाएंगे कि कोड को बढ़ाना और बनाए रखना आसान है।|जोशुआ केरिवेस्की, ''रिफैक्टरिंग टू पैटर्न्स''<ref name=kerievsky>{{उद्धरण पुस्तक | अंतिम = केरिवेस्की | पहला = यहोशू | शीर्षक = पैटर्न के लिए रिफैक्टरिंग | प्रकाशक = एडिसन वेस्ले | वर्ष = 2004}}</ref>}} | {{quote|कोड के डिज़ाइन में लगातार सुधार करके, हम इसके साथ काम करना आसान और आसान बनाते हैं। यह सामान्यतः जो होता है उसके ठीक विपरीत है: थोड़ा रिफैक्टरिंग और नई सुविधाओं को तेजी से जोड़ने के लिए बहुत अधिक ध्यान दिया जाता है। यदि आप निरंतर रिफैक्टरिंग की स्वच्छ आदत में पड़ जाते हैं, तो आप पाएंगे कि कोड को बढ़ाना और बनाए रखना आसान है।|जोशुआ केरिवेस्की, ''रिफैक्टरिंग टू पैटर्न्स''<ref name=kerievsky>{{उद्धरण पुस्तक | अंतिम = केरिवेस्की | पहला = यहोशू | शीर्षक = पैटर्न के लिए रिफैक्टरिंग | प्रकाशक = एडिसन वेस्ले | वर्ष = 2004}}</ref>}} | ||
Line 10: | Line 10: | ||
== प्रेरणा == | == प्रेरणा == | ||
रिफैक्टरिंग | रिफैक्टरिंग सामान्यतः [[कोड गंध|कोड स्मेल]] को देखकर प्रेरित होती है।<ref name="fowler"/> उदाहरण के लिए, हाथ में विधि बहुत लंबी हो सकती है, या यह किसी अन्य आस-पास की विधि [[डुप्लिकेट कोड|नकल कोड]] हो सकता है। एक बार पहचानने जाने के बाद, इस प्रकार की समस्याओं को स्रोत कोड को फिर से सक्रिय करके, या इसे नए रूप में परिवर्तित करके संबोधित किया जा सकता है जो पहले जैसा ही व्यवहार करता है किन्तु अब स्मेल नहीं करता है। | ||
लंबे रूटीन के लिए, एक या अधिक छोटे सबरूटीन निकाले जा सकते हैं; या डुप्लिकेट रूटीन के लिए, डुप्लिकेशन को हटाया जा सकता है और साझा फ़ंक्शन के साथ प्रतिस्थापित किया जा सकता है। रिफैक्टरिंग करने में विफलता के परिणामस्वरूप [[तकनीकी ऋण]] जमा हो सकता है; दूसरी ओर, रिफैक्टरिंग | लंबे रूटीन के लिए, एक या अधिक छोटे सबरूटीन निकाले जा सकते हैं; या डुप्लिकेट रूटीन के लिए, डुप्लिकेशन को हटाया जा सकता है और साझा फ़ंक्शन के साथ प्रतिस्थापित किया जा सकता है। रिफैक्टरिंग करने में विफलता के परिणामस्वरूप [[तकनीकी ऋण|विधिी ऋण]] जमा हो सकता है; दूसरी ओर, रिफैक्टरिंग विधिी ऋण चुकाने के प्राथमिक साधनों में से है।<ref>{{cite book|last1=Suryanarayana|first1=Girish|title=Refactoring for Software Design Smells|date=November 2014|publisher=Morgan Kaufmann|isbn=978-0128013977|pages=258}}</ref> | ||
== लाभ == | == लाभ == | ||
रिफैक्टरिंग की गतिविधि के लाभों की दो सामान्य श्रेणियां हैं। | रिफैक्टरिंग की गतिविधि के लाभों की दो सामान्य श्रेणियां हैं। | ||
# रखरखाव। बग्स को ठीक करना | # रखरखाव। बग्स को ठीक करना सरल है क्योंकि सोर्स कोड को पढ़ना सरल है और इसके लेखक के इरादे को समझना सरल है।<ref name=martin>{{cite book | last = Martin | first = Robert |title = Clean Code | publisher = Prentice Hall | year = 2009}}</ref> यह व्यक्तिगत रूप से संक्षिप्त, अच्छी तरह से नामित, एकल-उद्देश्यीय विधियों के समूहों में बड़े मोनोलिथिक रूटीन को कम करके प्राप्त किया जा सकता है। यह विधि को अधिक उपयुक्त वर्ग में ले जाकर या भ्रामक टिप्पणियों को हटाकर प्राप्त किया जा सकता है। | ||
# एक्स्टेंसिबिलिटी। यदि यह पहचानने योग्य डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) का उपयोग करता है, तो एप्लिकेशन की क्षमताओं का विस्तार करना | # एक्स्टेंसिबिलिटी। यदि यह पहचानने योग्य डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) का उपयोग करता है, तो एप्लिकेशन की क्षमताओं का विस्तार करना सरल है, और यह कुछ लचीलापन प्रदान करता है जहां पहले कोई अस्तित्व में नहीं हो सकता था।<ref name=kerievsky/> प्रदर्शन इंजीनियरिंग कार्यक्रमों में अक्षमताओं को दूर कर सकती है, जिसे सॉफ़्टवेयर ब्लोट के रूप में जाना जाता है, जो पारंपरिक सॉफ़्टवेयर-विकास रणनीतियों से उत्पन्न होती है, जिसका उद्देश्य किसी एप्लिकेशन के विकास के समय को चलाने में लगने वाले समय को कम करना है। प्रदर्शन इंजीनियरिंग [[हार्डवेयर सुरक्षा मॉड्यूल]] के लिए सॉफ्टवेयर को भी तैयार कर सकती है, जिस पर वह चलता है, उदाहरण के लिए, समानांतर प्रोसेसर और वेक्टर इकाइयों का लाभ उठाने के लिए।<ref>{{Cite journal|doi=10.1126/science.aam9744|doi-access=free|title=There's plenty of room at the Top: What will drive computer performance after Moore's law?|year=2020|last1=Leiserson|first1=Charles E.|last2=Thompson|first2=Neil C.|last3=Emer|first3=Joel S.|last4=Kuszmaul|first4=Bradley C.|last5=Lampson|first5=Butler W.|last6=Sanchez|first6=Daniel|last7=Schardl|first7=Tao B.|journal=Science|volume=368|issue=6495|pages=eaam9744|pmid=32499413}}</ref> | ||
== चुनौतियां == | == चुनौतियां == | ||
रिफैक्टरिंग के लिए | रिफैक्टरिंग के लिए वर्तमान में सॉफ्टवेयर सिस्टम का ज्ञान वापस पाने के लिए सॉफ्टवेयर सिस्टम संरचना, डेटा मॉडल और इंट्रा-एप्लिकेशन निर्भरता को निकालने की आवश्यकता होती है।<ref> | ||
{{Cite journal | {{Cite journal | ||
|last1=Haendler|first1=Thorsten | |last1=Haendler|first1=Thorsten | ||
Line 49: | Line 49: | ||
}}</ref> | }}</ref> | ||
रिफैक्टरिंग गतिविधियाँ वास्तुशिल्प संशोधनों को उत्पन्न करती हैं जो सॉफ्टवेयर सिस्टम की संरचनात्मक वास्तुकला को बिगड़ती हैं। इस | रिफैक्टरिंग गतिविधियाँ वास्तुशिल्प संशोधनों को उत्पन्न करती हैं जो सॉफ्टवेयर सिस्टम की संरचनात्मक वास्तुकला को बिगड़ती हैं। इस प्रकार की गिरावट वास्तुशिल्प गुणों जैसे रखरखाव और बोधगम्यता को प्रभावित करती है जिससे सॉफ्टवेयर सिस्टम का पूर्ण पुन: विकास हो सकता है।<ref> | ||
{{Cite journal | {{Cite journal | ||
|last1=van Gurp|first1=Jilles | |last1=van Gurp|first1=Jilles | ||
Line 62: | Line 62: | ||
}}</ref> | }}</ref> | ||
एल्गोरिदम और कोड निष्पादन के अनुक्रमों के बारे में डेटा प्रदान करने वाले टूल और | एल्गोरिदम और कोड निष्पादन के अनुक्रमों के बारे में डेटा प्रदान करने वाले टूल और विधियों का उपयोग करते समय कोड रिफैक्टरिंग गतिविधियों को [[सॉफ्टवेयर बुद्धि|सॉफ्टवेयर इंटेलिजेंस]] के साथ सुरक्षित किया जाता है।<ref> | ||
{{Cite journal | {{Cite journal | ||
|last1=Hassan|first1=Ahmed E. | |last1=Hassan|first1=Ahmed E. | ||
Line 88: | Line 88: | ||
== परीक्षण == | == परीक्षण == | ||
रिफैक्टरिंग से पहले स्वचालित इकाई परीक्षण स्थापित किया जाना चाहिए | रिफैक्टरिंग से पहले स्वचालित इकाई परीक्षण स्थापित किया जाना चाहिए जिससे यह सुनिश्चित हो सके कि रूटीन अभी भी अपेक्षा के अनुरूप व्यवहार कर रहे हैं।<ref>{{Cite book |title=Refactoring : improving the design of existing code |last=Fowler |first=Martin |date=1999 |publisher=Addison-Wesley |isbn=978-0201485677 |location=Reading, MA |oclc=41017370 |url=https://archive.org/details/isbn_9780201485677 }}</ref> एकल परमाणु प्रतिबद्ध#संशोधन नियंत्रण के साथ किए जाने पर इकाई परीक्षण बड़े रिफैक्टरों में भी स्थिरता ला सकते हैं। कई परियोजनाओं में फैले सुरक्षित और परमाणु रिफैक्टरों को अनुमति देने के लिए आम रणनीति सभी परियोजनाओं को ही [[भंडार (संस्करण नियंत्रण)|स्टोरेज (संस्करण नियंत्रण)]] में संग्रहित करना है, जिसे [[monorepo|मोनोरेपो]] कहा जाता है।<ref>{{cite book |last1=Smart |first1=John Ferguson |title=Java Power Tools |date=2008 |publisher="O'Reilly Media, Inc." |isbn=9781491954546 |page=301 |url=https://books.google.com/books?id=kE0UDQAAQBAJ&q=visual+sourcesafe+atomic+commit&pg=PA301 |access-date=26 July 2018 |language=en}}</ref> | ||
इकाई परीक्षण के स्थान पर, रिफैक्टरिंग तब छोटा प्रोग्राम परिवर्तन करने, शुद्धता सुनिश्चित करने के लिए परीक्षण करने और और छोटा परिवर्तन करने का पुनरावृत्त चक्र है। यदि किसी बिंदु पर कोई परीक्षण विफल हो जाता है, तो अंतिम छोटा परिवर्तन पूर्ववत किया जाता है और अलग | इकाई परीक्षण के स्थान पर, रिफैक्टरिंग तब छोटा प्रोग्राम परिवर्तन करने, शुद्धता सुनिश्चित करने के लिए परीक्षण करने और और छोटा परिवर्तन करने का पुनरावृत्त चक्र है। यदि किसी बिंदु पर कोई परीक्षण विफल हो जाता है, तो अंतिम छोटा परिवर्तन पूर्ववत किया जाता है और अलग विधि से दोहराया जाता है। कई छोटे चरणों के माध्यम से कार्यक्रम उस स्थान से आगे बढ़ता है जहाँ आप चाहते हैं कि वह हो। इस पुनरावृत्त प्रक्रिया के व्यावहारिक होने के लिए, परीक्षणों को बहुत तेज़ी से चलना चाहिए, या प्रोग्रामर को अपने समय का बड़ा अंश परीक्षणों के समाप्त होने की प्रतीक्षा में खर्च करना होगा। अत्यधिक प्रोग्रामिंग और अन्य फुर्तीले सॉफ्टवेयर विकास के समर्थक इस गतिविधि को [[सॉफ्टवेयर विकास प्रक्रिया]] का अभिन्न अंग बताते हैं। | ||
== | == विधि == | ||
यहाँ माइक्रो-रिफैक्टरिंग के कुछ उदाहरण दिए गए हैं; इनमें से कुछ केवल कुछ भाषाओं या | यहाँ माइक्रो-रिफैक्टरिंग के कुछ उदाहरण दिए गए हैं; इनमें से कुछ केवल कुछ भाषाओं या लैंग्वेज प्रकारों पर ही प्रयुक्त हो सकते हैं। एक लंबी सूची [[मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर)]] और वेबसाइट में पाई जा सकती है।<ref name="fowler">{{cite book|title=Refactoring. Improving the Design of Existing Code|last=Fowler|first=Martin|publisher=Addison-Wesley|year=1999|isbn=978-0-201-48567-7|pages=[https://archive.org/details/isbn_9780201485677/page/63 63ff]|author-link=Martin Fowler (software engineer)|url=https://archive.org/details/isbn_9780201485677/page/63}}</ref><ref name="refactoring.com">(these are only about OOP however).[http://refactoring.com/catalog/index.html Refactoring techniques in Fowler's refactoring Website]</ref> कई विकास वातावरण इन माइक्रो-रिफैक्टरिंग के लिए स्वचालित समर्थन प्रदान करते हैं। उदाहरण के लिए, प्रोग्रामर चर के नाम पर क्लिक कर सकता है और फिर [[संदर्भ मेनू]] से एनकैप्सुलेट क्षेत्र रिफैक्टरिंग का चयन कर सकता है। आईडीई तब अतिरिक्त विवरणमें के लिए संकेत देगा, सामान्यतः समझदार चूक और कोड परिवर्तनों के पूर्वावलोकन के साथ। प्रोग्रामर द्वारा पुष्टि के बाद यह पूरे कोड में आवश्यक परिवर्तन करेगा। | ||
* | * विधियों जो अधिक एप्लिकेशन खोज और समझ की अनुमति देती हैं | ||
** [[कार्यक्रम निर्भरता ग्राफ]] - डेटा और नियंत्रण निर्भरताओं का स्पष्ट प्रतिनिधित्व <ref> | ** [[कार्यक्रम निर्भरता ग्राफ]] - डेटा और नियंत्रण निर्भरताओं का स्पष्ट प्रतिनिधित्व <ref> | ||
{{Cite journal | {{Cite journal | ||
Line 123: | Line 123: | ||
|s2cid=18160599 | |s2cid=18160599 | ||
}}</ref> | }}</ref> | ||
** सॉफ्टवेयर इंटेलिजेंस - | ** सॉफ्टवेयर इंटेलिजेंस - वर्तमान में इंट्रा-एप्लिकेशन निर्भरताओं को समझने के लिए प्रारंभिक स्थिति को रिवर्स इंजीनियर करता है | ||
* | * विधियों जो अधिक अमूर्तता (कंप्यूटर विज्ञान) की अनुमति देती हैं | ||
** [[फील्ड एनकैप्सुलेशन|क्षेत्र एनकैप्सुलेशन]] - गेट्टर और सेटर विधियों के साथ क्षेत्र तक पहुँचने के लिए बल कोड | ** [[फील्ड एनकैप्सुलेशन|क्षेत्र एनकैप्सुलेशन]] - गेट्टर और सेटर विधियों के साथ क्षेत्र तक पहुँचने के लिए बल कोड | ||
** टाइप सामान्यीकरण - अधिक कोड साझा करने की अनुमति देने के लिए अधिक सामान्य प्रकार बनाएं | ** टाइप सामान्यीकरण - अधिक कोड साझा करने की अनुमति देने के लिए अधिक सामान्य प्रकार बनाएं | ||
** टाइप-चेकिंग कोड को राज्य/रणनीति से बदलें<ref>{{cite web| url = http://refactoring.com/catalog/replaceTypeCodeWithStateStrategy.html| title = Replace type-checking code with State/Strategy}}</ref> | ** टाइप-चेकिंग कोड को राज्य/रणनीति से बदलें<ref>{{cite web| url = http://refactoring.com/catalog/replaceTypeCodeWithStateStrategy.html| title = Replace type-checking code with State/Strategy}}</ref> | ||
** [[बहुरूपता (कंप्यूटर विज्ञान)]] के साथ सशर्त बदलें<ref>{{cite web| url = http://refactoring.com/catalog/replaceConditionalWithPolymorphism.html| title = Replace conditional with polymorphism}}</ref> | ** [[बहुरूपता (कंप्यूटर विज्ञान)]] के साथ सशर्त बदलें<ref>{{cite web| url = http://refactoring.com/catalog/replaceConditionalWithPolymorphism.html| title = Replace conditional with polymorphism}}</ref> | ||
* कोड को अधिक तार्किक टुकड़ों में तोड़ने की | * कोड को अधिक तार्किक टुकड़ों में तोड़ने की विधियों | ||
** कंपोनेंटाइजेशन कोड को पुन: प्रयोज्य सिमेंटिक इकाइयों में तोड़ देता है जो स्पष्ट, अच्छी तरह से परिभाषित, उपयोग में | ** कंपोनेंटाइजेशन कोड को पुन: प्रयोज्य सिमेंटिक इकाइयों में तोड़ देता है जो स्पष्ट, अच्छी तरह से परिभाषित, उपयोग में सरल इंटरफेस प्रस्तुत करता है। | ||
** [[वर्ग निकालें]] | ** [[वर्ग निकालें]] वर्तमान में क्लास से कोड के भाग को नए क्लास में ले जाता है। | ||
** एक्सट्रैक्ट विधि, बड़ी विधि (कंप्यूटर साइंस) के | ** एक्सट्रैक्ट विधि, बड़ी विधि (कंप्यूटर साइंस) के भाग को नई विधि में परिवर्तन के लिए। कोड को छोटे-छोटे टुकड़ों में तोड़कर इसे सरलता से समझा जा सकता है। यह [[समारोह (प्रोग्रामिंग)|फंक्शन (प्रोग्रामिंग)]] पर भी प्रयुक्त होता है। | ||
* नाम और कोड के स्थान में सुधार के लिए | * नाम और कोड के स्थान में सुधार के लिए विधियों | ||
** प्रेरित विधि या प्रेरित क्षेत्र - अधिक उपयुक्त क्लास (कंप्यूटर साइंस) या सोर्स फाइल पर जाएं | ** प्रेरित विधि या प्रेरित क्षेत्र - अधिक उपयुक्त क्लास (कंप्यूटर साइंस) या सोर्स फाइल पर जाएं | ||
** विधि का नाम बदलें या क्षेत्र का नाम बदलें - नाम को नए में बदलना जो इसके उद्देश्य को | ** विधि का नाम बदलें या क्षेत्र का नाम बदलें - नाम को नए में बदलना जो इसके उद्देश्य को उत्तम रूप से प्रकट करता है | ||
** पुल अप - [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) में, सुपरक्लास (कंप्यूटर साइंस) में जाएं | ** पुल अप - [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) में, सुपरक्लास (कंप्यूटर साइंस) में जाएं | ||
** नीचे पुश करें - ओओपी में, [[उपवर्ग (कंप्यूटर विज्ञान)]] में जाएँ<ref name="refactoring.com"/> | ** नीचे पुश करें - ओओपी में, [[उपवर्ग (कंप्यूटर विज्ञान)]] में जाएँ<ref name="refactoring.com"/> | ||
Line 142: | Line 142: | ||
== हार्डवेयर रीफैक्टरिंग == | == हार्डवेयर रीफैक्टरिंग == | ||
चूँकि रिफैक्टरिंग शब्द मूल रूप से सॉफ्टवेयर कोड के रिफैक्टरिंग के लिए विशेष रूप से संदर्भित है, नविन के वर्षों में [[हार्डवेयर विवरण भाषा]]ओं में लिखे गए कोड को भी रिफैक्टरिंग किया गया है। हार्डवेयर विवरण भाषाओं में कोड की रीफैक्टरिंग के लिए हार्डवेयर रीफैक्टरिंग शब्द का उपयोग शॉर्टहैंड शब्द के रूप में किया जाता है। चूंकि हार्डवेयर विवरण भाषाओं को अधिकांश हार्डवेयर इंजीनियरों द्वारा [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लैंग्वेज]] नहीं माना जाता है,<ref>[[Hardware description languages#HDL and programming languages]]</ref> हार्डवेयर रीफैक्टरिंग को पारंपरिक कोड रीफैक्टरिंग से अलग क्षेत्र माना जाना चाहिए। | |||
ज़ेंग और हस द्वारा एनालॉग हार्डवेयर विवरण ([[VHDL-एम्स]] में) की स्वचालित रीफैक्टरिंग प्रस्तावित की गई है।<ref>Kaiping Zeng, Sorin A. Huss, "Architecture refinements by code refactoring of behavioral VHDL-AMS models". ISCAS 2006</ref> उनके दृष्टिकोण में, रीफैक्टरिंग हार्डवेयर डिज़ाइन के सिम्युलेटेड व्यवहार को संरक्षित करता है। गैर-कार्यात्मक माप जो सुधार करता है वह यह है कि रिफैक्टर कोड को मानक संश्लेषण उपकरण द्वारा संसाधित किया जा सकता है, | ज़ेंग और हस द्वारा एनालॉग हार्डवेयर विवरण ([[VHDL-एम्स]] में) की स्वचालित रीफैक्टरिंग प्रस्तावित की गई है।<ref>Kaiping Zeng, Sorin A. Huss, "Architecture refinements by code refactoring of behavioral VHDL-AMS models". ISCAS 2006</ref> उनके दृष्टिकोण में, रीफैक्टरिंग हार्डवेयर डिज़ाइन के सिम्युलेटेड व्यवहार को संरक्षित करता है। गैर-कार्यात्मक माप जो सुधार करता है वह यह है कि रिफैक्टर कोड को मानक संश्लेषण उपकरण द्वारा संसाधित किया जा सकता है, चूँकि मूल कोड नहीं हो सकता। [[Synopsys|सारांश]] के [[साथी]] माइक कीटिंग द्वारा डिजिटल हार्डवेयर विवरण भाषाओं की रीफैक्टरिंग, चूंकि मैन्युअल रीफैक्टरिंग की भी जांच की गई है।<ref>M. Keating :"Complexity, Abstraction, and the Challenges of Designing Complex Systems", in DAC'08 tutorial [http://www.dac.com/events/eventdetails.aspx?id=77-130] {{Webarchive|url=https://web.archive.org/web/20160328163412/https://dac.com/events/eventdetails.aspx?id=77-130|date=2016-03-28}}"Bridging a Verification Gap: C++ to RTL for Practical Design"</ref><ref>M. Keating, P. Bricaud: ''Reuse Methodology Manual for System-on-a-Chip Designs'', Kluwer Academic Publishers, 1999.</ref> उनका लक्ष्य जटिल प्रणालियों को समझना सरल बनाना है, जिससे डिजाइनरों की उत्पादकता बढ़ जाती है। | ||
== इतिहास == | == इतिहास == | ||
Line 179: | Line 179: | ||
| format = compressed Postscript | | format = compressed Postscript | ||
| access-date = 2008-02-12 | | access-date = 2008-02-12 | ||
}}</ref> 1992 में प्रकाशित, ने भी इस शब्द का | }}</ref> 1992 में प्रकाशित, ने भी इस शब्द का उपयोग किया था।<ref name="etymology" /> चूंकि दशकों से अनौपचारिक रूप से कोड को रिफैक्टरिंग किया जाता रहा है, [[बिल ग्रिसवॉल्ड]] की 1991 पीएच.डी. शोध प्रबंध<ref name="griswold-thesis" /> कार्यात्मक और प्रक्रियात्मक कार्यक्रमों के पुनर्संरचना पर पहले प्रमुख शैक्षणिक कार्यों में से एक है, इसके बाद विलियम ओपेडिक के 1 992 के शोध प्रबंध<ref name="opdyke-thesis" /> वस्तु-उन्मुख कार्यक्रमों के पुनर्संरचना पर,<ref name="etymology">{{cite web| url = http://martinfowler.com/bliki/EtymologyOfRefactoring.html| title = Martin Fowler, "MF Bliki: EtymologyOfRefactoring"}}</ref> चूंकि सभी सिद्धांत और तंत्र कार्यक्रम परिवर्तन प्रणालियों के रूप में लंबे समय से उपलब्ध हैं। ये सभी संसाधन रिफैक्टरिंग के लिए सामान्य विधियों की सूची प्रदान करते हैं; रीफैक्टरिंग विधि में वैज्ञानिक पद्धति को प्रयुक्त करने के विधि और संकेतकों के बारे में वर्णन है कि आपको विधि कब प्रयुक्त करनी चाहिए (या नहीं करनी चाहिए)। | ||
मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की पुस्तक रिफैक्टरिंग: | मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की पुस्तक रिफैक्टरिंग: वर्तमान में कोड के डिजाइन में सुधार करना विहित संदर्भ है। | ||
कम से कम 1980 के दशक की | कम से कम 1980 के दशक की प्रारंभ से ही [[फोर्थ (प्रोग्रामिंग भाषा)|फोर्थ (प्रोग्रामिंग लैंग्वेज)]] समुदाय में फैक्टरिंग और फैक्टरिंग आउट शब्द का इस प्रकार से उपयोग किया जाता रहा है। [[लियो ब्रॉडी (प्रोग्रामर)]] की किताब [[आगे सोच रहा है]] (1984) का अध्याय छह<ref>{{cite book | ||
|last1=Brodie | |last1=Brodie | ||
|first1=Leo | |first1=Leo | ||
Line 197: | Line 197: | ||
}}</ref> विषय को समर्पित है। | }}</ref> विषय को समर्पित है। | ||
चरम प्रोग्रामिंग में, एक्सट्रैक्ट विधि रिफैक्टरिंग | चरम प्रोग्रामिंग में, एक्सट्रैक्ट विधि रिफैक्टरिंग विधि का अनिवार्य रूप से वही अर्थ है जो फोर्थ में फैक्टरिंग के रूप में "शब्द" (या फ़ंक्शन) को छोटे और सरलता से से बनाए रखने वाले कार्यों में तोड़ने के लिए होता है। | ||
सीवीएस या एसवीएन जैसे सॉफ़्टवेयर रिपॉजिटरी में रिकॉर्ड किए गए जटिल सॉफ़्टवेयर परिवर्तनों के संक्षिप्त विवरण का उत्पादन करने के लिए रिफैक्टरिंग पोस्टहॉक का पुनर्निर्माण भी किया जा सकता है। | सीवीएस या एसवीएन जैसे सॉफ़्टवेयर रिपॉजिटरी में रिकॉर्ड किए गए जटिल सॉफ़्टवेयर परिवर्तनों के संक्षिप्त विवरण का उत्पादन करने के लिए रिफैक्टरिंग पोस्टहॉक का पुनर्निर्माण भी किया जा सकता है। | ||
Line 203: | Line 203: | ||
== स्वचालित कोड रीफैक्टरिंग == | == स्वचालित कोड रीफैक्टरिंग == | ||
कई सॉफ्टवेयर [[पाठ संपादक]] और [[एकीकृत विकास पर्यावरण]] में ऑटोमेटेड रिफैक्टरिंग सपोर्ट है। यहाँ इनमें से कुछ संपादकों, या तथाकथित [[रिफैक्टरिंग ब्राउज़र]] की सूची दी गई है। | कई सॉफ्टवेयर [[पाठ संपादक]] और [[एकीकृत विकास पर्यावरण]] में ऑटोमेटेड रिफैक्टरिंग सपोर्ट है। यहाँ इनमें से कुछ संपादकों, या तथाकथित [[रिफैक्टरिंग ब्राउज़र]] की सूची दी गई है। | ||
* [[डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट]] (सी, सी++, सी#, कोबोल, जावा, [[पीएचपी]] और अन्य भाषाओं के लिए बड़े पैमाने पर रीफैक्टरिंग | * [[डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट]] (सी, सी++, सी#, कोबोल, जावा, [[पीएचपी]] और अन्य भाषाओं के लिए बड़े पैमाने पर रीफैक्टरिंग प्रयुक्त करता है) | ||
* ग्रहण आधारित: | * ग्रहण आधारित: | ||
** [[ग्रहण (सॉफ्टवेयर)]] ([[जावा (प्रोग्रामिंग भाषा)]] के लिए, और कुछ | ** [[ग्रहण (सॉफ्टवेयर)]] ([[जावा (प्रोग्रामिंग भाषा)|जावा (प्रोग्रामिंग लैंग्वेज)]] के लिए, और कुछ सीमा तक, सी ++, पीएचपी, रूबी और [[जावास्क्रिप्ट]]) | ||
** [[PyDev]] ([[पायथन (प्रोग्रामिंग भाषा)]] के लिए) | ** [[PyDev|पायडेव]] ([[पायथन (प्रोग्रामिंग भाषा)|पायथन (प्रोग्रामिंग लैंग्वेज)]] के लिए) | ||
** [[फोट्रान]] (ग्रहण (सॉफ्टवेयर) के लिए [[फोरट्रान]] प्लगइन) | ** [[फोट्रान]] (ग्रहण (सॉफ्टवेयर) के लिए [[फोरट्रान]] प्लगइन) | ||
* [[एम्बरकाडेरो डेल्फी]] | * [[एम्बरकाडेरो डेल्फी]] | ||
* इंटेलीजे आधारित: | * इंटेलीजे आधारित: | ||
** [[Resharper]] (सी शार्प (प्रोग्रामिंग लैंग्वेज) के लिए | सी#) | ** [[Resharper|रेशर्पेर]] (सी शार्प (प्रोग्रामिंग लैंग्वेज) के लिए | सी#) | ||
** [[ऐपकोड]] (उद्देश्य-सी, सी और सी ++ के लिए) | ** [[ऐपकोड]] (उद्देश्य-सी, सी और सी ++ के लिए) | ||
** [[IntelliJ IDEA]] (जावा के लिए (प्रोग्रामिंग | ** [[IntelliJ IDEA|इंटेलीज आइडिया]] (जावा के लिए (प्रोग्रामिंग लैंग्वेज)) | ||
** [[PyCharm]] (पायथन (प्रोग्रामिंग | ** [[PyCharm|पाइचार्म]] (पायथन (प्रोग्रामिंग लैंग्वेज) के लिए) | ||
** [[वेबतूफान]] (जावास्क्रिप्ट के लिए) | ** [[वेबतूफान]] (जावास्क्रिप्ट के लिए) | ||
** [[PhpStorm]] ( | ** [[PhpStorm|पीएचपीस्टॉर्म]] (पीएचपी के लिए) | ||
** [[एंड्रॉइड स्टूडियो]] (जावा (प्रोग्रामिंग | ** [[एंड्रॉइड स्टूडियो]] (जावा (प्रोग्रामिंग लैंग्वेज) और सी ++ के लिए) | ||
* [[JDeveloper]] (जावा के लिए (प्रोग्रामिंग | * [[JDeveloper|जेडेवलपर]] (जावा के लिए (प्रोग्रामिंग लैंग्वेज)) | ||
* [[NetBeans]] (जावा के लिए (प्रोग्रामिंग | * [[NetBeans|नेटबीन्स]] (जावा के लिए (प्रोग्रामिंग लैंग्वेज)) | ||
*स्मॉलटॉक: अधिकांश बोलियों में शक्तिशाली रिफैक्टरिंग टूल | *स्मॉलटॉक: अधिकांश बोलियों में शक्तिशाली रिफैक्टरिंग टूल सम्मिलित हैं। कई लोग राल्फ जॉनसन (कंप्यूटर वैज्ञानिक) द्वारा 90 के दशक की प्रारंभ में निर्मित मूल रीफैक्टरिंग ब्राउज़र का उपयोग करते हैं। | ||
* [[विजुअल स्टूडियो]] आधारित: | * [[विजुअल स्टूडियो]] आधारित: | ||
** विजुअल स्टूडियो ( | ** विजुअल स्टूडियो (डॉट नेट और सी++ के लिए) | ||
** [[कोडरश]] (विजुअल स्टूडियो के लिए ऐडऑन) | ** [[कोडरश]] (विजुअल स्टूडियो के लिए ऐडऑन) | ||
** [[विजुअल असिस्ट]] (सी # और सी ++ के लिए रीफैक्टरिंग समर्थन के साथ विजुअल स्टूडियो के लिए एडन) | ** [[विजुअल असिस्ट]] (सी # और सी ++ के लिए रीफैक्टरिंग समर्थन के साथ विजुअल स्टूडियो के लिए एडन) | ||
* [[विंग आईडीई]] (पायथन (प्रोग्रामिंग | * [[विंग आईडीई]] (पायथन (प्रोग्रामिंग लैंग्वेज) के लिए) | ||
* [[एक्सकोड]] (सी, [[उद्देश्य सी]] और [[स्विफ्ट (प्रोग्रामिंग भाषा)]] के लिए)<ref>{{cite web| url = https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html| title = What's new in Xcode 9}}</ref> | * [[एक्सकोड]] (सी, [[उद्देश्य सी]] और [[स्विफ्ट (प्रोग्रामिंग भाषा)|स्विफ्ट (प्रोग्रामिंग लैंग्वेज)]] के लिए)<ref>{{cite web| url = https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html| title = What's new in Xcode 9}}</ref> | ||
* [[क्यूटी निर्माता]] (सी++, ऑब्जेक्टिव-सी और क्यूएमएल के लिए)<ref>{{cite web| url = https://doc.qt.io/qtcreator/creator-editor-refactoring.html| title = Refactoring in Qt Creator}}</ref> | * [[क्यूटी निर्माता]] (सी++, ऑब्जेक्टिव-सी और क्यूएमएल के लिए)<ref>{{cite web| url = https://doc.qt.io/qtcreator/creator-editor-refactoring.html| title = Refactoring in Qt Creator}}</ref> | ||
Line 302: | Line 302: | ||
*{{curlie|Computers/Programming/Methodologies/Refactoring|Refactoring}} | *{{curlie|Computers/Programming/Methodologies/Refactoring|Refactoring}} | ||
[[Category: | [[Category:Articles with Curlie links]] | ||
[[Category:Articles with hatnote templates targeting a nonexistent page]] | |||
[[Category:CS1 English-language sources (en)]] | |||
[[Category: | |||
[[Category:Created On 18/02/2023]] | [[Category:Created On 18/02/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Missing redirects]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Short description with empty Wikidata description]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:Webarchive template wayback links]] | |||
[[Category:कोड रीफैक्टरिंग| कोड रीफैक्टरिंग ]] | |||
[[Category:चरम कार्यक्रम]] | |||
[[Category:प्रौद्योगिकी नवविज्ञान]] |
Latest revision as of 17:52, 19 September 2023
कंप्यूटर प्रोग्रामिंग और सॉफ्टवेर डिज़ाइन में, कोड रीफैक्टरिंग वर्तमान में कंप्यूटर कोड को उसके बाहरी व्यवहार को बदले बिना फैक्टरिंग (कंप्यूटर विज्ञान) को बदलने के पुनर्गठन की प्रक्रिया है। रिफैक्टरिंग का उद्देश्य इसकी कार्यक्षमता को संरक्षित करते हुए सॉफ़्टवेयर की डिज़ाइन, संरचना और/या कार्यान्वयन (इसकी गैर-कार्यात्मक विशेषताएँ) में सुधार करना है। रिफैक्टरिंग के संभावित लाभों में उत्तम कोड पठनीयता और कम चक्रीय जटिलता सम्मिलित हो सकती है; ये स्रोत कोड की रखरखाव क्षमता में सुधार कर सकते हैं और 'विस्तारशीलता में सुधार के लिए एक सरल, स्वच्छ, या अधिक अभिव्यंजक आंतरिक सॉफ़्टवेयर वास्तुशिल्प या वस्तु मॉडल बना सकते हैं। रिफैक्टरिंग के लिए एक और संभावित लक्ष्य उत्तम प्रदर्शन है; सॉफ्टवेयर इंजीनियरों को ऐसे प्रोग्राम लिखने की निरंतर चुनौती का सामना करना पड़ता है जो तेजी से प्रदर्शन करते हैं या कम मेमोरी का उपयोग करते हैं।
सामान्यतः, रीफैक्टरिंग मानकीकृत मूलभूत माइक्रो-रिफैक्टरिंग की श्रृंखला को प्रयुक्त करती है, जिनमें से प्रत्येक (सामान्यतः) कंप्यूटर प्रोग्राम के स्रोत कोड में छोटा परिवर्तन होता है जो या तो सॉफ़्टवेयर के व्यवहार को संरक्षित करता है, या कम से कम कार्यात्मक आवश्यकताओं के अनुरूप संशोधित नहीं करता है। कई विकास पर्यावरण (सॉफ्टवेयर विकास प्रक्रिया) इन मूलभूत रिफैक्टरिंग के यांत्रिक स्थितियों के प्रदर्शन के लिए स्वचालित समर्थन प्रदान करते हैं। यदि ठीक से किया जाता है, तो कोड रीफैक्टरिंग सॉफ़्टवेयर डेवलपर्स को अंतर्निहित तर्क को सरल बनाकर और जटिलता के अनावश्यक स्तरों को समाप्त करके सिस्टम में छिपे या निष्क्रिय सॉफ्टवेयर बग या कमजोरियों (कंप्यूटिंग) को खोजने और ठीक करने में सहायता कर सकता है। यदि खराब विधि से किया जाता है, तो यह आवश्यकता को विफल कर सकता है कि बाहरी कार्यक्षमता को नहीं बदला जा सकता है, और इस प्रकार नए बग प्रस्तुत कर सकते हैं।
कोड के डिज़ाइन में लगातार सुधार करके, हम इसके साथ काम करना आसान और आसान बनाते हैं। यह सामान्यतः जो होता है उसके ठीक विपरीत है: थोड़ा रिफैक्टरिंग और नई सुविधाओं को तेजी से जोड़ने के लिए बहुत अधिक ध्यान दिया जाता है। यदि आप निरंतर रिफैक्टरिंग की स्वच्छ आदत में पड़ जाते हैं, तो आप पाएंगे कि कोड को बढ़ाना और बनाए रखना आसान है।
— जोशुआ केरिवेस्की, रिफैक्टरिंग टू पैटर्न्स[1]
प्रेरणा
रिफैक्टरिंग सामान्यतः कोड स्मेल को देखकर प्रेरित होती है।[2] उदाहरण के लिए, हाथ में विधि बहुत लंबी हो सकती है, या यह किसी अन्य आस-पास की विधि नकल कोड हो सकता है। एक बार पहचानने जाने के बाद, इस प्रकार की समस्याओं को स्रोत कोड को फिर से सक्रिय करके, या इसे नए रूप में परिवर्तित करके संबोधित किया जा सकता है जो पहले जैसा ही व्यवहार करता है किन्तु अब स्मेल नहीं करता है।
लंबे रूटीन के लिए, एक या अधिक छोटे सबरूटीन निकाले जा सकते हैं; या डुप्लिकेट रूटीन के लिए, डुप्लिकेशन को हटाया जा सकता है और साझा फ़ंक्शन के साथ प्रतिस्थापित किया जा सकता है। रिफैक्टरिंग करने में विफलता के परिणामस्वरूप विधिी ऋण जमा हो सकता है; दूसरी ओर, रिफैक्टरिंग विधिी ऋण चुकाने के प्राथमिक साधनों में से है।[3]
लाभ
रिफैक्टरिंग की गतिविधि के लाभों की दो सामान्य श्रेणियां हैं।
- रखरखाव। बग्स को ठीक करना सरल है क्योंकि सोर्स कोड को पढ़ना सरल है और इसके लेखक के इरादे को समझना सरल है।[4] यह व्यक्तिगत रूप से संक्षिप्त, अच्छी तरह से नामित, एकल-उद्देश्यीय विधियों के समूहों में बड़े मोनोलिथिक रूटीन को कम करके प्राप्त किया जा सकता है। यह विधि को अधिक उपयुक्त वर्ग में ले जाकर या भ्रामक टिप्पणियों को हटाकर प्राप्त किया जा सकता है।
- एक्स्टेंसिबिलिटी। यदि यह पहचानने योग्य डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) का उपयोग करता है, तो एप्लिकेशन की क्षमताओं का विस्तार करना सरल है, और यह कुछ लचीलापन प्रदान करता है जहां पहले कोई अस्तित्व में नहीं हो सकता था।[1] प्रदर्शन इंजीनियरिंग कार्यक्रमों में अक्षमताओं को दूर कर सकती है, जिसे सॉफ़्टवेयर ब्लोट के रूप में जाना जाता है, जो पारंपरिक सॉफ़्टवेयर-विकास रणनीतियों से उत्पन्न होती है, जिसका उद्देश्य किसी एप्लिकेशन के विकास के समय को चलाने में लगने वाले समय को कम करना है। प्रदर्शन इंजीनियरिंग हार्डवेयर सुरक्षा मॉड्यूल के लिए सॉफ्टवेयर को भी तैयार कर सकती है, जिस पर वह चलता है, उदाहरण के लिए, समानांतर प्रोसेसर और वेक्टर इकाइयों का लाभ उठाने के लिए।[5]
चुनौतियां
रिफैक्टरिंग के लिए वर्तमान में सॉफ्टवेयर सिस्टम का ज्ञान वापस पाने के लिए सॉफ्टवेयर सिस्टम संरचना, डेटा मॉडल और इंट्रा-एप्लिकेशन निर्भरता को निकालने की आवश्यकता होती है।[6]
टीमों के टर्नओवर का अर्थ है सिस्टम की वर्तमान स्थिति और दिवंगत डेवलपर्स द्वारा किए गए डिजाइन निर्णयों के बारे में लापता या गलत ज्ञान। आगे की कोड रीफैक्टरिंग गतिविधियों को इस ज्ञान को पुनः प्राप्त करने के लिए अतिरिक्त प्रयास की आवश्यकता हो सकती है।[7]
रिफैक्टरिंग गतिविधियाँ वास्तुशिल्प संशोधनों को उत्पन्न करती हैं जो सॉफ्टवेयर सिस्टम की संरचनात्मक वास्तुकला को बिगड़ती हैं। इस प्रकार की गिरावट वास्तुशिल्प गुणों जैसे रखरखाव और बोधगम्यता को प्रभावित करती है जिससे सॉफ्टवेयर सिस्टम का पूर्ण पुन: विकास हो सकता है।[8]
एल्गोरिदम और कोड निष्पादन के अनुक्रमों के बारे में डेटा प्रदान करने वाले टूल और विधियों का उपयोग करते समय कोड रिफैक्टरिंग गतिविधियों को सॉफ्टवेयर इंटेलिजेंस के साथ सुरक्षित किया जाता है।[9] सॉफ्टवेयर सिस्टम संरचना, डेटा मॉडल, और इंट्रा-कंपोनेंट निर्भरता की आंतरिक स्थिति के लिए बोधगम्य प्रारूप प्रदान करना उच्च-स्तरीय समझ बनाने के लिए महत्वपूर्ण तत्व है और फिर क्या संशोधित करने की आवश्यकता है, और कैसे परिष्कृत विचार।[10]
परीक्षण
रिफैक्टरिंग से पहले स्वचालित इकाई परीक्षण स्थापित किया जाना चाहिए जिससे यह सुनिश्चित हो सके कि रूटीन अभी भी अपेक्षा के अनुरूप व्यवहार कर रहे हैं।[11] एकल परमाणु प्रतिबद्ध#संशोधन नियंत्रण के साथ किए जाने पर इकाई परीक्षण बड़े रिफैक्टरों में भी स्थिरता ला सकते हैं। कई परियोजनाओं में फैले सुरक्षित और परमाणु रिफैक्टरों को अनुमति देने के लिए आम रणनीति सभी परियोजनाओं को ही स्टोरेज (संस्करण नियंत्रण) में संग्रहित करना है, जिसे मोनोरेपो कहा जाता है।[12]
इकाई परीक्षण के स्थान पर, रिफैक्टरिंग तब छोटा प्रोग्राम परिवर्तन करने, शुद्धता सुनिश्चित करने के लिए परीक्षण करने और और छोटा परिवर्तन करने का पुनरावृत्त चक्र है। यदि किसी बिंदु पर कोई परीक्षण विफल हो जाता है, तो अंतिम छोटा परिवर्तन पूर्ववत किया जाता है और अलग विधि से दोहराया जाता है। कई छोटे चरणों के माध्यम से कार्यक्रम उस स्थान से आगे बढ़ता है जहाँ आप चाहते हैं कि वह हो। इस पुनरावृत्त प्रक्रिया के व्यावहारिक होने के लिए, परीक्षणों को बहुत तेज़ी से चलना चाहिए, या प्रोग्रामर को अपने समय का बड़ा अंश परीक्षणों के समाप्त होने की प्रतीक्षा में खर्च करना होगा। अत्यधिक प्रोग्रामिंग और अन्य फुर्तीले सॉफ्टवेयर विकास के समर्थक इस गतिविधि को सॉफ्टवेयर विकास प्रक्रिया का अभिन्न अंग बताते हैं।
विधि
यहाँ माइक्रो-रिफैक्टरिंग के कुछ उदाहरण दिए गए हैं; इनमें से कुछ केवल कुछ भाषाओं या लैंग्वेज प्रकारों पर ही प्रयुक्त हो सकते हैं। एक लंबी सूची मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) और वेबसाइट में पाई जा सकती है।[2][13] कई विकास वातावरण इन माइक्रो-रिफैक्टरिंग के लिए स्वचालित समर्थन प्रदान करते हैं। उदाहरण के लिए, प्रोग्रामर चर के नाम पर क्लिक कर सकता है और फिर संदर्भ मेनू से एनकैप्सुलेट क्षेत्र रिफैक्टरिंग का चयन कर सकता है। आईडीई तब अतिरिक्त विवरणमें के लिए संकेत देगा, सामान्यतः समझदार चूक और कोड परिवर्तनों के पूर्वावलोकन के साथ। प्रोग्रामर द्वारा पुष्टि के बाद यह पूरे कोड में आवश्यक परिवर्तन करेगा।
- विधियों जो अधिक एप्लिकेशन खोज और समझ की अनुमति देती हैं
- कार्यक्रम निर्भरता ग्राफ - डेटा और नियंत्रण निर्भरताओं का स्पष्ट प्रतिनिधित्व [14]
- सिस्टम डिपेंडेंस ग्राफ - पीडीजी के बीच प्रक्रिया कॉल का प्रतिनिधित्व [15]
- सॉफ्टवेयर इंटेलिजेंस - वर्तमान में इंट्रा-एप्लिकेशन निर्भरताओं को समझने के लिए प्रारंभिक स्थिति को रिवर्स इंजीनियर करता है
- विधियों जो अधिक अमूर्तता (कंप्यूटर विज्ञान) की अनुमति देती हैं
- क्षेत्र एनकैप्सुलेशन - गेट्टर और सेटर विधियों के साथ क्षेत्र तक पहुँचने के लिए बल कोड
- टाइप सामान्यीकरण - अधिक कोड साझा करने की अनुमति देने के लिए अधिक सामान्य प्रकार बनाएं
- टाइप-चेकिंग कोड को राज्य/रणनीति से बदलें[16]
- बहुरूपता (कंप्यूटर विज्ञान) के साथ सशर्त बदलें[17]
- कोड को अधिक तार्किक टुकड़ों में तोड़ने की विधियों
- कंपोनेंटाइजेशन कोड को पुन: प्रयोज्य सिमेंटिक इकाइयों में तोड़ देता है जो स्पष्ट, अच्छी तरह से परिभाषित, उपयोग में सरल इंटरफेस प्रस्तुत करता है।
- वर्ग निकालें वर्तमान में क्लास से कोड के भाग को नए क्लास में ले जाता है।
- एक्सट्रैक्ट विधि, बड़ी विधि (कंप्यूटर साइंस) के भाग को नई विधि में परिवर्तन के लिए। कोड को छोटे-छोटे टुकड़ों में तोड़कर इसे सरलता से समझा जा सकता है। यह फंक्शन (प्रोग्रामिंग) पर भी प्रयुक्त होता है।
- नाम और कोड के स्थान में सुधार के लिए विधियों
- प्रेरित विधि या प्रेरित क्षेत्र - अधिक उपयुक्त क्लास (कंप्यूटर साइंस) या सोर्स फाइल पर जाएं
- विधि का नाम बदलें या क्षेत्र का नाम बदलें - नाम को नए में बदलना जो इसके उद्देश्य को उत्तम रूप से प्रकट करता है
- पुल अप - ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) में, सुपरक्लास (कंप्यूटर साइंस) में जाएं
- नीचे पुश करें - ओओपी में, उपवर्ग (कंप्यूटर विज्ञान) में जाएँ[13]
- स्वचालित क्लोन पहचान[18]
हार्डवेयर रीफैक्टरिंग
चूँकि रिफैक्टरिंग शब्द मूल रूप से सॉफ्टवेयर कोड के रिफैक्टरिंग के लिए विशेष रूप से संदर्भित है, नविन के वर्षों में हार्डवेयर विवरण भाषाओं में लिखे गए कोड को भी रिफैक्टरिंग किया गया है। हार्डवेयर विवरण भाषाओं में कोड की रीफैक्टरिंग के लिए हार्डवेयर रीफैक्टरिंग शब्द का उपयोग शॉर्टहैंड शब्द के रूप में किया जाता है। चूंकि हार्डवेयर विवरण भाषाओं को अधिकांश हार्डवेयर इंजीनियरों द्वारा प्रोग्रामिंग लैंग्वेज नहीं माना जाता है,[19] हार्डवेयर रीफैक्टरिंग को पारंपरिक कोड रीफैक्टरिंग से अलग क्षेत्र माना जाना चाहिए।
ज़ेंग और हस द्वारा एनालॉग हार्डवेयर विवरण (VHDL-एम्स में) की स्वचालित रीफैक्टरिंग प्रस्तावित की गई है।[20] उनके दृष्टिकोण में, रीफैक्टरिंग हार्डवेयर डिज़ाइन के सिम्युलेटेड व्यवहार को संरक्षित करता है। गैर-कार्यात्मक माप जो सुधार करता है वह यह है कि रिफैक्टर कोड को मानक संश्लेषण उपकरण द्वारा संसाधित किया जा सकता है, चूँकि मूल कोड नहीं हो सकता। सारांश के साथी माइक कीटिंग द्वारा डिजिटल हार्डवेयर विवरण भाषाओं की रीफैक्टरिंग, चूंकि मैन्युअल रीफैक्टरिंग की भी जांच की गई है।[21][22] उनका लक्ष्य जटिल प्रणालियों को समझना सरल बनाना है, जिससे डिजाइनरों की उत्पादकता बढ़ जाती है।
इतिहास
प्रकाशित साहित्य में रिफैक्टरिंग शब्द का पहला ज्ञात उपयोग सितंबर, 1990 में विलियम ओपडीके और राल्फ जॉनसन (कंप्यूटर वैज्ञानिक) के लेख में हुआ था।[23] ग्रिसवॉल्ड की पीएच.डी. थीसिस,[24] ओपडाइक की पीएच.डी. थीसिस,[25] 1992 में प्रकाशित, ने भी इस शब्द का उपयोग किया था।[26] चूंकि दशकों से अनौपचारिक रूप से कोड को रिफैक्टरिंग किया जाता रहा है, बिल ग्रिसवॉल्ड की 1991 पीएच.डी. शोध प्रबंध[24] कार्यात्मक और प्रक्रियात्मक कार्यक्रमों के पुनर्संरचना पर पहले प्रमुख शैक्षणिक कार्यों में से एक है, इसके बाद विलियम ओपेडिक के 1 992 के शोध प्रबंध[25] वस्तु-उन्मुख कार्यक्रमों के पुनर्संरचना पर,[26] चूंकि सभी सिद्धांत और तंत्र कार्यक्रम परिवर्तन प्रणालियों के रूप में लंबे समय से उपलब्ध हैं। ये सभी संसाधन रिफैक्टरिंग के लिए सामान्य विधियों की सूची प्रदान करते हैं; रीफैक्टरिंग विधि में वैज्ञानिक पद्धति को प्रयुक्त करने के विधि और संकेतकों के बारे में वर्णन है कि आपको विधि कब प्रयुक्त करनी चाहिए (या नहीं करनी चाहिए)।
मार्टिन फाउलर (सॉफ्टवेयर इंजीनियर) की पुस्तक रिफैक्टरिंग: वर्तमान में कोड के डिजाइन में सुधार करना विहित संदर्भ है।
कम से कम 1980 के दशक की प्रारंभ से ही फोर्थ (प्रोग्रामिंग लैंग्वेज) समुदाय में फैक्टरिंग और फैक्टरिंग आउट शब्द का इस प्रकार से उपयोग किया जाता रहा है। लियो ब्रॉडी (प्रोग्रामर) की किताब आगे सोच रहा है (1984) का अध्याय छह[27] विषय को समर्पित है।
चरम प्रोग्रामिंग में, एक्सट्रैक्ट विधि रिफैक्टरिंग विधि का अनिवार्य रूप से वही अर्थ है जो फोर्थ में फैक्टरिंग के रूप में "शब्द" (या फ़ंक्शन) को छोटे और सरलता से से बनाए रखने वाले कार्यों में तोड़ने के लिए होता है।
सीवीएस या एसवीएन जैसे सॉफ़्टवेयर रिपॉजिटरी में रिकॉर्ड किए गए जटिल सॉफ़्टवेयर परिवर्तनों के संक्षिप्त विवरण का उत्पादन करने के लिए रिफैक्टरिंग पोस्टहॉक का पुनर्निर्माण भी किया जा सकता है।
स्वचालित कोड रीफैक्टरिंग
कई सॉफ्टवेयर पाठ संपादक और एकीकृत विकास पर्यावरण में ऑटोमेटेड रिफैक्टरिंग सपोर्ट है। यहाँ इनमें से कुछ संपादकों, या तथाकथित रिफैक्टरिंग ब्राउज़र की सूची दी गई है।
- डीएमएस सॉफ्टवेयर रीइंजीनियरिंग टूलकिट (सी, सी++, सी#, कोबोल, जावा, पीएचपी और अन्य भाषाओं के लिए बड़े पैमाने पर रीफैक्टरिंग प्रयुक्त करता है)
- ग्रहण आधारित:
- ग्रहण (सॉफ्टवेयर) (जावा (प्रोग्रामिंग लैंग्वेज) के लिए, और कुछ सीमा तक, सी ++, पीएचपी, रूबी और जावास्क्रिप्ट)
- पायडेव (पायथन (प्रोग्रामिंग लैंग्वेज) के लिए)
- फोट्रान (ग्रहण (सॉफ्टवेयर) के लिए फोरट्रान प्लगइन)
- एम्बरकाडेरो डेल्फी
- इंटेलीजे आधारित:
- रेशर्पेर (सी शार्प (प्रोग्रामिंग लैंग्वेज) के लिए | सी#)
- ऐपकोड (उद्देश्य-सी, सी और सी ++ के लिए)
- इंटेलीज आइडिया (जावा के लिए (प्रोग्रामिंग लैंग्वेज))
- पाइचार्म (पायथन (प्रोग्रामिंग लैंग्वेज) के लिए)
- वेबतूफान (जावास्क्रिप्ट के लिए)
- पीएचपीस्टॉर्म (पीएचपी के लिए)
- एंड्रॉइड स्टूडियो (जावा (प्रोग्रामिंग लैंग्वेज) और सी ++ के लिए)
- जेडेवलपर (जावा के लिए (प्रोग्रामिंग लैंग्वेज))
- नेटबीन्स (जावा के लिए (प्रोग्रामिंग लैंग्वेज))
- स्मॉलटॉक: अधिकांश बोलियों में शक्तिशाली रिफैक्टरिंग टूल सम्मिलित हैं। कई लोग राल्फ जॉनसन (कंप्यूटर वैज्ञानिक) द्वारा 90 के दशक की प्रारंभ में निर्मित मूल रीफैक्टरिंग ब्राउज़र का उपयोग करते हैं।
- विजुअल स्टूडियो आधारित:
- विजुअल स्टूडियो (डॉट नेट और सी++ के लिए)
- कोडरश (विजुअल स्टूडियो के लिए ऐडऑन)
- विजुअल असिस्ट (सी # और सी ++ के लिए रीफैक्टरिंग समर्थन के साथ विजुअल स्टूडियो के लिए एडन)
- विंग आईडीई (पायथन (प्रोग्रामिंग लैंग्वेज) के लिए)
- एक्सकोड (सी, उद्देश्य सी और स्विफ्ट (प्रोग्रामिंग लैंग्वेज) के लिए)[28]
- क्यूटी निर्माता (सी++, ऑब्जेक्टिव-सी और क्यूएमएल के लिए)[29]
यह भी देखें
- सुधार पैटर्न
- को़ड समीक्षा
- डेटाबेस रीफैक्टरिंग
- फैक्टरिंग (कंप्यूटर विज्ञान)
- मॉड्यूलर प्रोग्रामिंग
- भ्रमित कोड
- प्रीफैक्टरिंग
- चिंताओ का विभाजन
- सॉफ्टवेयर सहकर्मी समीक्षा
- परीक्षण संचालित विकास
संदर्भ
- ↑ 1.0 1.1 Template:उद्धरण पुस्तक
- ↑ 2.0 2.1 Fowler, Martin (1999). Refactoring. Improving the Design of Existing Code. Addison-Wesley. pp. 63ff. ISBN 978-0-201-48567-7.
- ↑ Suryanarayana, Girish (November 2014). Refactoring for Software Design Smells. Morgan Kaufmann. p. 258. ISBN 978-0128013977.
- ↑ Martin, Robert (2009). Clean Code. Prentice Hall.
- ↑ Leiserson, Charles E.; Thompson, Neil C.; Emer, Joel S.; Kuszmaul, Bradley C.; Lampson, Butler W.; Sanchez, Daniel; Schardl, Tao B. (2020). "There's plenty of room at the Top: What will drive computer performance after Moore's law?". Science. 368 (6495): eaam9744. doi:10.1126/science.aam9744. PMID 32499413.
- ↑ Haendler, Thorsten; Neumann, Gustaf (2019). "A Framework for the Assessment and Training of Software Refactoring Competences". Proc. Of 11th International Conference on Knowledge Management and Information Systems (KMIS).: 307–316. doi:10.5220/0008350803070316. ISBN 978-989-758-382-7. S2CID 204754665.
- ↑ Nassif, Matthieu; Robillard, Martin P. (November 2017). "Revisiting turnover-induced knowledge loss in software projects". 2017 IEEE International Conference on Software Maintenance and Evolution (ICSME): 261–272. doi:10.1109/ICSME.2017.64. ISBN 978-1-5386-0992-7. S2CID 13147063.
- ↑ van Gurp, Jilles; Bosch, Jan (March 2002). "Design erosion: problems and causes". Journal of Systems and Software. 61 (2): 105–119. doi:10.1016/S0164-1212(01)00152-2.
- ↑ Hassan, Ahmed E.; Xie, Tao (November 2010). "Software intelligence: the future of mining software engineering data". In Proceedings of the FSE/SDP Workshop on Future of Software Engineering Research (FoSER '10): 161–166. doi:10.1145/1882362.1882397. S2CID 3485526.
- ↑ Novais, Renato; Santos, José Amancio; Mendonça, Manoel (2017). "Experimentally assessing the combination of multiple visualization strategies for software evolution analysis". Journal of Systems and Software. 128: 56–71. doi:10.1016/j.jss.2017.03.006.
- ↑ Fowler, Martin (1999). Refactoring : improving the design of existing code. Reading, MA: Addison-Wesley. ISBN 978-0201485677. OCLC 41017370.
- ↑ Smart, John Ferguson (2008). Java Power Tools (in English). "O'Reilly Media, Inc.". p. 301. ISBN 9781491954546. Retrieved 26 July 2018.
- ↑ 13.0 13.1 (these are only about OOP however).Refactoring techniques in Fowler's refactoring Website
- ↑ Ferrante, Jeanne; Ottenstein, Karl J.; Warren, Joe D. (July 1987). "The program dependence graph and its use in optimization". ACM Transactions on Programming Languages and Systems. ACM. 9 (3): 319–349. doi:10.1145/24039.24041. S2CID 505075.
- ↑ Donglin, Linag; Harrold, M. J. (November 2008). "Slicing objects using system dependence graphs". Proceedings. International Conference on Software Maintenance. IEEE: 319–349. doi:10.1109/ICSM.1998.738527. ISBN 978-0-8186-8779-2. S2CID 18160599.
- ↑ "Replace type-checking code with State/Strategy".
- ↑ "Replace conditional with polymorphism".
- ↑ Bruntink, Magiel, et al. "An evaluation of clone detection techniques for crosscutting concerns." Software Maintenance, 2004. Proceedings. 20th IEEE International Conference on. IEEE, 2004.
- ↑ Hardware description languages#HDL and programming languages
- ↑ Kaiping Zeng, Sorin A. Huss, "Architecture refinements by code refactoring of behavioral VHDL-AMS models". ISCAS 2006
- ↑ M. Keating :"Complexity, Abstraction, and the Challenges of Designing Complex Systems", in DAC'08 tutorial [1] Archived 2016-03-28 at the Wayback Machine"Bridging a Verification Gap: C++ to RTL for Practical Design"
- ↑ M. Keating, P. Bricaud: Reuse Methodology Manual for System-on-a-Chip Designs, Kluwer Academic Publishers, 1999.
- ↑ Opdyke, William F.; Johnson, Ralph E. (September 1990). "Refactoring: An Aid in Designing Application Frameworks and Evolving Object-Oriented Systems". Proceedings of the Symposium on Object Oriented Programming Emphasizing Practical Applications (SOOPPA). ACM.
- ↑ 24.0 24.1 Griswold, William G (July 1991). Program Restructuring as an Aid to Software Maintenance (PDF) (Ph.D. thesis). University of Washington. Retrieved 2011-12-24.
- ↑ 25.0 25.1 Opdyke, William F (June 1992). Refactoring Object-Oriented Frameworks (Ph.D. thesis). University of Illinois at Urbana-Champaign. Archived from the original (compressed Postscript) on 2019-12-16. Retrieved 2008-02-12.
- ↑ 26.0 26.1 "Martin Fowler, "MF Bliki: EtymologyOfRefactoring"".
- ↑ Brodie, Leo (2004). Thinking Forth. pp. 171–196. ISBN 0-9764587-0-5. Archived from the original on 16 December 2005. Retrieved 3 May 2020.
- ↑ "What's new in Xcode 9".
- ↑ "Refactoring in Qt Creator".
अग्रिम पठन
- Wake, William C. (2003). Refactoring Workbook. Addison-Wesley. ISBN 978-0-321-10929-3.
- Mens, T.; Tourwe, T. (February 2004). "A survey of software refactoring". IEEE Transactions on Software Engineering. 30 (2): 126–139. doi:10.1109/tse.2004.1265817. ISSN 0098-5589. S2CID 206778272.
- Feathers, Michael C (2004). Working Effectively with Legacy Code. Prentice Hall. ISBN 978-0-13-117705-5.
- Kerievsky, Joshua (2004). Refactoring To Patterns. Addison-Wesley. ISBN 978-0-321-21335-8.
- Arsenovski, Danijel (2008). Professional Refactoring in Visual Basic. Wrox. ISBN 978-0-470-17979-6.
- Arsenovski, Danijel (2009). Professional Refactoring in C# and ASP.NET. Wrox. ISBN 978-0-470-43452-9.
- Ritchie, Peter (2010). Refactoring with Visual Studio 2010. Packt. ISBN 978-1-84968-010-3.
बाहरी संबंध
- What Is Refactoring? (c2.com article)
- Martin Fowler's homepage about refactoring
- Refactoring at Curlie