कोड पुन: उपयोग

सॉफ़्टवेयर विकास (और सामान्य रूप से क्रमानुदेशन (कंप्यूटर प्रोग्रामिंग)) में, कोड पुन: उपयोग, जिसे सॉफ़्टवेयर पुन: उपयोग भी कहा जाता है, नए सॉफ़्टवेयर के निर्माण के लिए मौजूदा सॉफ़्टवेयर या सॉफ़्टवेयर ज्ञान का उपयोग, पुन: प्रयोज्यता का पालन करना होता है।

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

कोड पुन: उपयोग निर्भरता का तात्पर्य है जो कोड रखरखाव को कठिन बना सकता है। कम से कम एक अध्ययन में पाया गया कि कोड का पुन: उपयोग तकनीकी ऋण को कम करता है।

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

कोड पुन: उपयोग का उद्देश्य समय और संसाधनों को बचाना है और सॉफ्टवेयर उत्पाद विकास प्रक्रिया के भीतर किसी न किसी रूप में पहले से ही बनाई गई संपदा का लाभ उठाकर अतिरेक (सूचना सिद्धांत) को कम करना है। पुन: उपयोग में मुख्य विचार यह है कि एक समय में लिखे गए कंप्यूटर प्रोग्राम के कुछ हिस्सों को बाद में लिखे गए अन्य प्रोग्राम के निर्माण में उपयोग किया जा सकता है या उपयोग किया जाना चाहिए।

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

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

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

अगले संस्करण के लिए प्रारंभिक बिंदु के रूप में मौजूदा प्रोग्राम के पूर्व संस्करण का उपयोग करने का सामान्य अभ्यास भी कोड पुन: उपयोग का रूप है।

कुछ तथाकथित कोड "पुन: उपयोग" में किसी मौजूदा प्रोग्राम से कुछ या सभी कोड को नए में कॉपी करना सम्मिलित है। जबकि संगठन इस दृष्टिकोण के साथ नए उत्पाद के लिए बाजार लाभ के लिए समय का एहसास कर सकते हैं, वे बाद में कट और पेस्ट प्रोग्रामिंग के कारण समान कोड दोहराव की कई समस्याओं से परेशान हो सकते हैं।

कई शोधकर्ताओं ने पुन: उपयोग को तेज, आसान, अधिक व्यवस्थित और प्रोग्रामिंग की सामान्य प्रक्रिया का अभिन्न अंग बनाने के लिए काम किया है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के आविष्कार के पीछे ये कुछ मुख्य लक्ष्य हैं, जो औपचारिक पुन: उपयोग के सबसे सामान्य रूपों में से एक बन गया है। कुछ समय बाद का आविष्कार सामान्य प्रोग्रामिंग है।

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

पुन: उपयोग के प्रकार
प्रेरणा और ड्राइविंग कारकों के संबंध में, पुन: उपयोग हो सकता है:
 * अवसरवादी - परियोजना शुरू करने के लिए तैयार होने के दौरान, टीम को पता चलता है कि मौजूदा घटक हैं जिनका वे पुन: उपयोग कर सकते हैं।
 * नियोजित - टीम रणनीतिक रूप से घटकों को डिज़ाइन करती है जिससे कि वे भविष्य की परियोजनाओं में पुन: प्रयोज्य हों सकते हैं।

पुन: उपयोग को आगे वर्गीकृत किया जा सकता है:


 * आंतरिक पुन: उपयोग - टीम अपने स्वयं के घटकों का पुन: उपयोग करती है। यह व्यावसायिक निर्णय हो सकता है, क्योंकि टीम परियोजना के लिए महत्वपूर्ण घटक को नियंत्रित करना चाहती है।
 * बाहरी पुन: उपयोग - टीम तीसरे पक्ष के घटक को लाइसेंस देना चुन सकती है। एक तीसरे पक्ष के घटक को लाइसेंस देने पर सामान्यतः टीम को आंतरिक रूप से विकसित करने की लागत का 1 से 20 प्रतिशत खर्च होता है। टीम को घटक को खोजने, सीखने और एकीकृत करने में लगने वाले समय पर भी विचार करना चाहिए।

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

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

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

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

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

डिजाइन पैटर्न
डिज़ाइन पैटर्न आवर्ती समस्या का सामान्य समाधान है। डिजाइन पैटर्न मूर्त से अधिक वैचारिक हैं और सटीक आवश्यकता को पूरा करने के लिए संशोधित किया जा सकता है। हालाँकि, कुछ पैटर्न को लागू करने के लिए अमूर्त वर्गों और इंटरफेस का पुन: उपयोग किया जा सकता है।

फ़्रेमवर्क
डेवलपर्स सामान्यतः तीसरे पक्ष के अनुप्रयोगों और रूपरेखाओं के माध्यम से सॉफ्टवेयर के बड़े क्षण का पुन: उपयोग करते हैं। चूंकि ढांचे सामान्यतः प्रांत-विशिष्ट होते हैं और केवल अनुप्रयोगों के वर्ग के लिए लागू होते हैं.

उच्च-क्रम अभिलक्षक
कार्यात्मक प्रोग्रामिंग में उच्च-क्रम अभिलक्षक का उपयोग कई स्थितियों में किया जा सकता है जहां पहले डिजाइन पैटर्न या ढांचे का उपयोग किया जाता था।

रेट्रोकंप्यूटिंग
रेट्रोकंप्यूटिंग में कोड का पुन: उपयोग सम्मिलित है, केवल इसलिए कि पुराने कंप्यूटरों पर रेट्रो प्रोग्राम या उनके लिए एमुलेटर चलाए जा रहे हैं।

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

कोड-पुन: उपयोग आक्रान्त के उदाहरण हैं रिटर्न-टू-लिबक हमला, रिटर्न-ओरिएंटेड प्रोग्रामिंग और जंप-ओरिएंटेड प्रोग्रामिंग है।

अवयव
ऑब्जेक्ट ओरिएंटेड सीमा में घटक, सहयोगी वर्गों (या केवल वर्ग) और उसके इंटरफेस के समुच्चय का प्रतिनिधित्व करता है। घटकों के प्रतिस्थापन को सक्षम करने के लिए इंटरफेस जिम्मेदार हैं। पुन: प्रयोज्य घटकों को घटक स्रोत कोड प्रबंधन तकनीकों (CSCM) का उपयोग करके एससीएम रिपॉजिटरी के बीच अलग और समकालिक किया जा सकता है।

कंप्यूटर के बाहर
"कोड पुन: उपयोग" की पूरी अवधारणा सॉफ्टवेयर के बाहर इंजीनियरिंग अनुप्रयोगों को भी सम्मिलित कर सकती है। उदाहरण के लिए, कंप्यूटर एडेड डिजाइन में पैरामीट्रिक मॉडलिंग पुन: प्रयोज्य डिज़ाइन बनाने की अनुमति देता है। मानकीकरण के परिणामस्वरूप अंतर-संचालित भागों का निर्माण होता है जिसे कई संदर्भों में पुन: उपयोग किया जा सकता है।

आलोचना
कोड पुन: उपयोग के परिणामस्वरूप पुन: उपयोग किए जा रहे घटक पर निर्भरता (कंप्यूटर प्रोग्रामिंग) में कोड का पुन: उपयोग होता है। रोब पाइक ने कहा कि "थोड़ी सी नकल थोड़ी निर्भरता से बेहतर है"। जब उन्होंने गूगल संयुक्त किया, तब कंपनी कोड के पुन: उपयोग पर बहुत जोर दे रही थी। उनका मानना है कि गूगल का कोडबेस अभी भी संकलन गति और रखरखाव के संदर्भ में उस पूर्व नीति के परिणामों से पीड़ित है।

यह भी देखें

 * अपने आप को मत दोहराओ
 * सॉफ्टवेयर पुन: उपयोग पर अंतर्राष्ट्रीय सम्मेलन
 * वंशानुक्रम (कंप्यूटर विज्ञान)
 * भाषा बंधन
 * यहाँ आविष्कार नहीं किया गया (विलोम)
 * बहुरूपता टाइप करें
 * प्रक्रियात्मक प्रोग्रामिंग
 * पहिया का पुनः आविष्कार (विलोम)
 * पुन: प्रयोज्यता
 * मेट्रिक्स का पुन: उपयोग करें
 * सत्य का एकल स्रोत
 * सॉफ्टवेयर ढांचा
 * आभासी विरासत

बाहरी संबंध

 * ReNews – an information site about software reuse and domain engineering
 * Software Reuse Tips Article