स्पष्ट रूप से परीक्षण की अनुपस्थिति लोगों को घबराहट करने जा रही है जब आप कोड को दोबारा करने का प्रयास करते हैं।किसी को भी कोई विश्वास मिलेगा कि आपका रिफैक्टरिंग एप्लिकेशन को तोड़ नहीं देता है? मुझे लगता है कि अधिकांश जवाब आपको मिलेगा, "यह बहुत कठिन और बहुत सफल नहीं होगा", और यह काफी हद तक है क्योंकि आप एक बड़े मैन्युअल कार्य का सामना कर रहे हैं और जवाब में कोई विश्वास नहीं है।
केवल दो तरीके हैं।
परीक्षणों का एक समूह बनाएं। दुर्भाग्य से, यह बहुत समय लगेगा और अधिकांश प्रबंधकों को कोई मूल्य नहीं दिखता है; आखिरकार, आप अब तक उनके बिना मिल गए हैं। विश्वास प्रश्न पर वापस इशारा करते हुए मदद नहीं करेगा; उपयोगी कुछ भी होने से पहले आप अभी भी बहुत समय का उपयोग कर रहे हैं। यदि वे करते हैं आपको परीक्षण बनाने दें, तो आपको परीक्षणों को विकसित करने की समस्या होगी जैसा कि आप रिफैक्टर करते हैं; वे कार्यक्षमता को थोड़ा सा नहीं बदल सकते हैं, लेकिन जब आप नए एपीआई बनाते हैं तो परीक्षणों को नए एपीआई से मिलान करने के लिए बदलना होगा। यह कोड आधार को पुन: सक्रिय करने से परे अतिरिक्त काम है।
रिफैक्टरिंग प्रक्रिया स्वचालित करें। यदि आप भरोसेमंद स्वचालित परिवर्तन लागू करते हैं, तो आप तर्क दे सकते हैं (अक्सर असफल) कि refactored कोड मूल सिस्टम फ़ंक्शन को संरक्षित करता है। असुरक्षित तर्क को हरा करने का तरीका उन परीक्षणों को लिखना है (पहली विधि देखें) और आवेदन और परीक्षणों में रीफैक्टरिंग प्रक्रिया लागू करें; चूंकि एप्लिकेशन संरचनाओं को बदलता है, परीक्षणों को भी बदलना पड़ता है। लेकिन वे स्वचालित मशीनरी के दृष्टिकोण से सिर्फ आवेदन कोड हैं।
बहुत से लोग उत्तरार्द्ध नहीं करते हैं; आपको ऐसे टूल कहां मिलते हैं जो ऐसी चीजें कर सकते हैं?
वास्तव में, ऐसे उपकरण मौजूद हैं। उन्हें program transformation tools कहा जाता है और कोड पर बड़े पैमाने पर परिवर्तन करने के लिए उपयोग किया जाता है। इन्हें बड़े पैमाने पर रीफैक्टरिंग के लिए टूल के रूप में सोचें; पैमाने के कारण, वे इंटरेक्टिव नहीं होते हैं।
यह कार्य के लिए उन्हें कॉन्फ़िगर करने का प्रयास करता है; आपको अपने कस्टम वांछित परिणाम को पूरा करने के लिए कस्टम नियम लिखना होगा। आप शायद एक सप्ताह में ऐसा नहीं कर सकते हैं, लेकिन यह एक बड़ी प्रणाली को मैन्युअल रूप से संशोधित करने से बहुत कम काम है। और आपको यह समझना चाहिए कि आपके पास मौजूदा सॉफ्टवेयर में 150 व्यक्ति-वर्ष निवेश किए गए हैं; यह गड़बड़ करने के लिए इतना लंबा लगा। ऐसा लगता है कि "कुछ" प्रयास तुलना में छोटा होना ठीक होना चाहिए।
मुझे केवल ऐसे 3 टूल हैं जो वास्तविक कोड पर काम करने का मौका रखते हैं: TXL, Stratego/XT, और हमारे टूल, DMS Software Reengineering Toolkit। पहले दो अकादमिक उत्पाद हैं (हालांकि अतीत में वाणिज्यिक गतिविधियों के लिए TXL का उपयोग किया गया है); डीएमएस वाणिज्यिक है।
डीएमएस का उपयोग विभिन्न प्रकार के बड़े पैमाने पर सॉफ्टवेयर एनीसिस और बड़े पैमाने पर परिवर्तन कार्यों के लिए किया गया है। एक कार्य automated translation between languages for the B-2 Stealth Bomber था। एक और, आपकी रिफैक्टरिंग समस्या के बहुत करीब, घटक के लिए एक बड़े पैमाने पर घटक-आधारित सिस्टम सी ++ के स्वचालित आर्किटेक्चरिंग था, एक विरासत मालिकाना आरटीओएस से घटक के व्यवस्थित नियमों के बारे में अपने idiosyncratic नियमों के साथ, कॉरबा/आरटी में जिसमें घटक एपीआई था विज्ञापन संरचनाओं से CORBA- शैली पहलू और ग्रहण इंटरफेस के साथ-साथ विरासत आरटीओएस सेवाओं के स्थान पर कॉरबा/आरटी सेवाओं का उपयोग करने के लिए बदला जा सकता है। (इन कार्यों को वास्तविक स्मार्ट और डीएमएस-समझदार लोगों द्वारा वास्तविक प्रयास के 1-2 व्यक्ति-वर्ष के साथ किया गया था)।
अभी भी परीक्षण-निर्माण समस्या है (ऊपर दिए गए दोनों उदाहरणों में पहले से ही महान सिस्टम परीक्षण थे) .. यहां मैं एक अंग पर बाहर जा रहा हूं। मेरा मानना है कि फ़ंक्शन इनपुट-आउटपुट परिणामों को एकत्रित करने के लिए चल रहे कोड को मापकर परीक्षण पीढ़ी को स्वचालित करने के लिए ऐसे टूल प्राप्त करने में आशा है।हमने स्रोत कोड के लिए सभी प्रकार के वाद्ययंत्र बनाए हैं (जाहिर है आपको इसे उपकरण के बाद संकलित करना होगा) और लगता है कि हम जानते हैं कि यह कैसे करें। YMMV।
वहाँ कुछ आप करते हैं जो काफी कम महत्वाकांक्षी है: कोड के पुन: प्रयोज्य भागों की पहचान, जानने क्या कोड में पुन: उपयोग किया गया है द्वारा। अधिकांश सॉफ़्टवेयर सिस्टम में बहुत सारे क्लोन कोड होते हैं (हमारा अनुभव 10-20% है [और मैं दूसरे उत्तरों में छोटी संख्याओं की PHP रिपोर्ट से हैरान हूं; मुझे संदेह है कि वे एक कमजोर क्लोन डिटेक्टर का उपयोग कर रहे हैं)। क्लोन कोड एप्लिकेशन सॉफ़्टवेयर में अनुपलब्ध अमूर्तता का संकेत है। यदि आप क्लोन पा सकते हैं और देख सकते हैं कि वे कैसे भिन्न होते हैं, तो आप उन्हें आसानी से देख सकते हैं कि उन्हें स्पष्ट रूप से और पुन: प्रयोज्य बनाने के लिए उन्हें कैसे कार्य (या जो भी) में सारणित किया जाए।
Salion इंक did clone detection and abstraction। पेपर अमूर्त गतिविधि का पता नहीं लगाता है; वास्तव में क्या सैलियन पता चला क्लोन की आवधिक समीक्षा थी, और समेकित लोगों के मैन्युअल उपचार या जो (अक्सर पुस्तकालय) विधियों में समझ में आया था। शुद्ध परिणाम कोड आधार वास्तव में आकार में घट गया था और प्रोग्रामर अधिक प्रभावी हो गए क्योंकि उनके पास बेहतर ("अधिक पुन: प्रयोज्य") पुस्तकालय थे।
वे एक गाइड के रूप में कार्यक्रम सिंटेक्स के उपयोग से क्लोन ढूंढने की हमारी CloneDR, एक उपकरण का इस्तेमाल किया। क्लोनडीआर को सटीक क्लोन और नज़दीकी मिस (पहचानकर्ताओं या बयानों के प्रतिस्थापन) मिलते हैं और लेआउट और टिप्पणियों के बावजूद क्लोन लोकेशन और क्लोन पैरामीकरण की एक विशिष्ट सूची प्रदान करते हैं। आप लिंक पर कई भाषाओं के लिए क्लोन रिपोर्ट देख सकते हैं। (मैं अपने कई टोपी के बीच originator and author of CloneDR हूँ)।
एक और जवाब में चर्चा पीएचपी परियोजना के लिए "छोटे क्लोन प्रतिशत" के बारे में: मैं क्या एक क्लोन डिटेक्टर के लिए इस्तेमाल किया जा रहा था पता नहीं है। केवल क्लोन पीएचपी पर ध्यान केंद्रित डिटेक्टर कि मैं जानता हूँ कि PHPCPD, जो IMHO एक भयानक क्लोन डिटेक्टर है, अगर मैं दावा किए गए कार्यान्वयन को समझता हूं तो यह केवल सटीक क्लोन पाता है। तुलनात्मक उद्देश्यों के लिए हमारी साइट पर PHP उदाहरण देखें।