बाहरी व्यवहार को बदले बिना मैं रिफैक्टरिंग को कितनी दूर तक धकेल सकता हूं?


27

मार्टिन फाउलर के अनुसार , कोड रीफैक्टरिंग (जोर मेरा) है:

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

इस संदर्भ में "बाहरी व्यवहार" क्या है? उदाहरण के लिए, यदि मैं चाल विधि को लागू करने के लिए और कुछ विधि को अन्य वर्ग में ले जाता हूं, तो ऐसा लगता है कि मैं बाहरी व्यवहार को बदलता हूं, है न?

इसलिए, मुझे इस बात का पता लगाने में दिलचस्पी है कि एक बदलाव एक रिफ्लेक्टर होने के नाते क्या होता है और कुछ और हो जाता है। शब्द "रीफैक्टरिंग" का बड़े परिवर्तनों के लिए दुरुपयोग किया जा सकता है: क्या इसके लिए एक अलग शब्द है?

अद्यतन करें। इंटरफ़ेस के बारे में बहुत सारे दिलचस्प जवाब, लेकिन इस पद्धति को स्थानांतरित करने से इंटरफ़ेस में बदलाव नहीं होगा?


यदि मौजूदा व्यवहार बेकार या अधूरा है, तो इसे संशोधित करें, हटाएं / इसे फिर से लिखें। हो सकता है कि आप फिर से फैक्टरिंग न करें, लेकिन कौन परवाह करता है कि अगर सिस्टम सही होगा तो नाम क्या होगा?
जॉब

2
आपके पर्यवेक्षक को परवाह हो सकती है यदि आपको रिफ्लेक्टर की अनुमति दी गई थी और आपने फिर से लिखा था।
जेफ़ो

2
रिफैक्टरिंग की सीमा इकाई परीक्षण है। यदि आपके पास उनके द्वारा तैयार किए गए विनिर्देश हैं, तो कुछ भी जो आप बदलते हैं, जो परीक्षण नहीं तोड़ते हैं, वह है रिफैक्टरिंग?
जॉर्ज सिल्वा


यदि आप अधिक सीखना चाहते हैं, तो यह विषय एक सक्रिय अनुसंधान क्षेत्र भी है। इस विषय पर कई वैज्ञानिक प्रकाशन कर रहे हैं, उदाहरण के लिए, informatik.uni-trier.de/~ley/db/indices/a-tree/s/...
Skarab

जवाबों:


25

इस संदर्भ में "बाहरी" का अर्थ है "उपयोगकर्ताओं के लिए अवलोकन योग्य"। किसी एप्लिकेशन या किसी सार्वजनिक API के मामले में अन्य कार्यक्रमों के मामले में उपयोगकर्ता मनुष्य हो सकते हैं।

इसलिए यदि आप क्लास M से क्लास B तक की विधि M को स्थानांतरित करते हैं, और दोनों कक्षाएं किसी एप्लिकेशन के अंदर गहरी हैं, और कोई भी उपयोगकर्ता परिवर्तन के कारण ऐप के व्यवहार में किसी भी परिवर्तन का पालन नहीं कर सकता है, तो आप इसे सही तरीके से रीफैक्टरिंग कह सकते हैं।

यदि, OTOH, कुछ अन्य उच्च स्तरीय सबसिस्टम / घटक अपने व्यवहार को बदल देता है या परिवर्तन के कारण टूट जाता है, तो यह वास्तव में (आमतौर पर) उपयोगकर्ताओं के लिए अवलोकन योग्य है (या कम से कम sysadmins लॉग की जाँच करने के लिए)। या अगर आपकी कक्षाएं एक सार्वजनिक एपीआई का हिस्सा थीं, तो वहां 3 पार्टी कोड हो सकता है जो एम वर्ग ए का हिस्सा होने पर निर्भर करता है, बी नहीं। इसलिए इनमें से कोई भी मामले सख्त अर्थों में नहीं हैं।

किसी भी कोड के काम को कॉल करने की प्रवृत्ति है, जो कि मुझे लगता है कि गलत है।

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

तो बाहरी व्यवहार को बदलने वाले reworks के लिए सही शब्द क्या है?

मैं इसे नया स्वरूप कहूंगा ।

अद्यतन करें

इंटरफ़ेस के बारे में बहुत सारे दिलचस्प जवाब, लेकिन इस पद्धति को स्थानांतरित करने से इंटरफ़ेस में बदलाव नहीं होगा?

किस? विशिष्ट वर्ग, हाँ। लेकिन क्या ये वर्ग किसी भी तरह से प्रत्यक्ष रूप से बाहरी दुनिया को दिखाई देते हैं? यदि नहीं - क्योंकि वे अपने कार्यक्रम के अंदर हैं, और नहीं के बाहरी इंटरफ़ेस (API / जीयूआई) के हिस्से के कार्यक्रम (जब तक परिवर्तन टूट जाता है कुछ, निश्चित रूप से) कोई परिवर्तन नहीं किया वहाँ बाहरी पार्टियों द्वारा मानने योग्य है -।

मुझे लगता है कि इससे परे एक गहरा सवाल है: क्या एक विशिष्ट वर्ग अपने आप में एक स्वतंत्र इकाई के रूप में मौजूद है? ज्यादातर मामलों में, उत्तर नहीं है : वर्ग केवल एक बड़े घटक के रूप में मौजूद है, कक्षाओं और वस्तुओं का एक पारिस्थितिकी तंत्र, जिसके बिना इसे तत्काल नहीं किया जा सकता है और / या अनुपयोगी है। इस पारिस्थितिकी तंत्र में न केवल इसकी (प्रत्यक्ष / अप्रत्यक्ष) निर्भरता शामिल है, बल्कि अन्य वर्ग / वस्तुएं भी हैं जो इस पर निर्भर हैं। ऐसा इसलिए है क्योंकि इन उच्च स्तरीय कक्षाओं के बिना, हमारी कक्षा से जुड़ी जिम्मेदारी सिस्टम के उपयोगकर्ताओं के लिए अर्थहीन / बेकार हो सकती है।

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

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

* और कोई भी आसानी से उस डोमेन मॉडल को जोड़ सकता है, जो हमारी कक्षा का प्रतिनिधित्व करता है, वह स्वयं केवल कुछ "वास्तविक चीज़" का एक अनुमानित प्रतिनिधित्व है ...


3
नाइटपैकिंग, मैं कहूंगा कि 'डिज़ाइन चेंज' रिडिजाइन नहीं। नया स्वरूप बहुत महत्वपूर्ण लगता है।
user606723

4
दिलचस्प है - आपके उदाहरण में कक्षा A 'कोड का एक मौजूदा निकाय "है, और यदि विधि M सार्वजनिक है तो A के बाहरी व्यवहार को बदला जा रहा है। इसलिए आप शायद कह सकते हैं कि कक्षा A को नया रूप दिया गया है, जबकि समग्र प्रणाली को फिर से बनाया जा रहा है।
saus

मुझे उपयोगकर्ताओं के लिए अवलोकन करना पसंद है। इसलिए मैं यह नहीं कहूंगा कि इकाई परीक्षण टूटना एक संकेत है, लेकिन अंत में अंत या एकीकरण परीक्षण एक संकेत होगा।
एंडी विसेंडांगर

8

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


1
मुझे नहीं लगता कि यह एक अच्छा जवाब है। Refactoring API में परिवर्तन कर सकती है। लेकिन यह अंत-उपयोगकर्ता या इनपुट / फ़ाइलों को पढ़ने / उत्पन्न करने के तरीके को प्रभावित नहीं करना चाहिए।
आरडीएस

3

मेरे लिए, रिफैक्टरिंग सबसे अधिक उत्पादक / आरामदायक रही है जब सीमाएं परीक्षण और / या औपचारिक विनिर्देश द्वारा निर्धारित की गई थीं।

  • ये सीमाएँ मुझे सुरक्षित महसूस करने के लिए पर्याप्त रूप से कठोर हैं कि अगर मैं कभी-कभार पार करता हूं, तो यह जल्द ही पता चल जाएगा ताकि मुझे ठीक होने के लिए बहुत सारे बदलाव न करने पड़ें। दूसरी ओर, ये अप्रासंगिक व्यवहार को बदलने के बारे में चिंता किए बिना कोड को बेहतर बनाने के लिए पर्याप्त मार्ग देते हैं।

  • बात मैं विशेष रूप से पसंद है कि इस प्रकार की सीमाएं बोलने के लिए अनुकूल हैं। मेरा मतलब है, 1) मैं परिवर्तन करता हूं और सत्यापित करता हूं कि यह कल्पना / परीक्षणों का अनुपालन करता है। फिर, 2) यह क्यूए या उपयोगकर्ता परीक्षण के लिए पारित किया जाता है - यहां ध्यान दें, यह अभी भी विफल हो सकता है क्योंकि कुछ कल्पना / परीक्षणों में गायब है। ठीक है, अगर 3 ए) परीक्षण गुजरता है, तो मैं कर रहा हूं, ठीक है। अन्यथा, यदि 3 बी) परीक्षण विफल हो जाता है तो मैं 4) परिवर्तन को वापस करता हूं और 5) परीक्षण जोड़ता हूं या कल्पना को स्पष्ट करता हूं ताकि अगली बार यह गलती दोहराई न जाए। ध्यान दें कि यदि परीक्षण पास या विफल हो जाता है, तो मुझे कुछ भी हासिल होता है - कोड / परीक्षण / कल्पना में सुधार होता है - मेरे प्रयास कुल कचरे में नहीं बदलते हैं।

अन्य प्रकार की सीमाओं के लिए - अब तक, मेरे पास ज्यादा भाग्य नहीं था।

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

एक और मैंने कोशिश की कि कोड लॉजिक (जिस तरह से मैं इसे पढ़ते समय समझता हूं) को बनाए रखना है। सबसे प्राथमिक (और आमतौर पर बहुत फलदायी नहीं) परिवर्तनों को छोड़कर, यह एक हमेशा कीड़े का एक कैन था ... या मुझे बग्स की एक कैन कहनी चाहिए? मेरा मतलब है प्रतिगमन बग। स्पेगेटी कोड के साथ काम करते समय कुछ महत्वपूर्ण तोड़ना बहुत आसान है।


3

पुनर्रचना पुस्तक अपने संदेश में बहुत मजबूत है कि आप कर सकते हैं केवल पुनर्रचना जब आप इकाई परीक्षण कवरेज प्रदर्शन

इस प्रकार, आप कह सकते हैं कि जब तक आप अपनी इकाई के किसी भी परीक्षण को नहीं तोड़ रहे हैं, तब तक आप रिफैक्टिंग कर रहे हैं । जब आप परीक्षण तोड़ते हैं, तो आप किसी और को फिर से सक्रिय नहीं कर रहे हैं।

लेकिन: इस तरह के सरल रिफ्लेक्टरिंग के बारे में जैसे कि कक्षाओं या सदस्यों के नाम बदलने के बारे में कैसे? क्या वे परीक्षण नहीं तोड़ते?

हां, वे करते हैं, और प्रत्येक मामले में आपको विचार करना होगा कि क्या यह महत्वपूर्ण है। यदि आपका SUT एक सार्वजनिक API / SDK है तो एक नाम बदलकर, वास्तव में, एक ब्रेकिंग चेंज है। यदि नहीं, तो शायद ठीक है।

हालाँकि, इस बात पर विचार करें कि अक्सर परीक्षण टूट जाते हैं क्योंकि आपने ऐसा व्यवहार बदल दिया है जिसकी आप वास्तव में परवाह करते हैं, लेकिन क्योंकि परीक्षण फ्रेगाइल टेस्ट हैं


3

इस संदर्भ में "बाहरी व्यवहार" को परिभाषित करने का सबसे अच्छा तरीका "परीक्षण के मामले" हो सकते हैं।

यदि आप कोड को रिफलेक्टर करते हैं और यह परीक्षण मामलों (रिफैक्टरिंग से पहले परिभाषित) को पारित करना जारी रखता है, तो रिफैक्टरिंग ने बाहरी व्यवहार को नहीं बदला है। यदि एक या अधिक परीक्षण के मामले विफल होते हैं, तो आपने बाहरी व्यवहार को बदल दिया है।

कम से कम, यह विषय पर प्रकाशित विभिन्न पुस्तकों की मेरी समझ है (उदाहरण के लिए, फाउलर)।


2

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

इसलिए कक्षाओं के बीच फ़ंक्शंस को ठीक करना तब तक ठीक होना चाहिए जब तक कि वे वे नहीं हैं जो उपयोगकर्ता देखते हैं।

जब तक कोड rework बाहरी व्यवहारों को परिवर्तित नहीं करता है, तब तक नए कार्यों को जोड़ें या मौजूदा कार्यों को हटा दें, मुझे लगता है कि rework को एक रिफैक्टरिंग कहना ठीक है।


सहमत नहीं हैं। यदि आप अपने पूरे डेटा एक्सेस कोड को nHibernate के साथ बदलते हैं, तो यह बाहरी व्यवहार को नहीं बदलता है, लेकिन यह Fowler की "अनुशासित तकनीकों का पालन नहीं करता है।" यह रीइंजीनियरिंग होगी और इसे रिफैक्टिंग कहते हुए इसमें शामिल जोखिम कारक को छिपाया जाएगा।
pdr

1

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

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

इसलिए यदि किसी वर्ग के पास "doSomethingAmazing" नामक एक विधि है, तो यह उपयोगकर्ता के लिए कोई मायने नहीं रखता है यदि उस वर्ग द्वारा कार्यान्वित किया जाता है जिसे वे संदर्भित कर रहे हैं, या उस वर्ग द्वारा निर्मित एक सुपरक्लास द्वारा। उपयोगकर्ता के लिए यह सब मायने रखता है कि नया (refactored) "doSomethingAmazing" का परिणाम पुराने (अपरिष्कृत) "doSomethingAmazing" के समान है।

हालाँकि, जिसे कई मामलों में रिफैक्टिंग कहा जाता है, वह सही रीफैक्टरिंग नहीं है, लेकिन शायद एक रीइम्प्लायमेंट जो कि कुछ नई सुविधा जोड़ने के लिए कोड को संशोधित करने के लिए आसान बनाया जाता है। इसलिए (बाद में छद्म) -सक्रियता के मामले में, नया (refactored) कोड वास्तव में कुछ अलग करता है, या शायद पुराने से कुछ अधिक।


क्या होगा यदि एक विंडोज़ फ़ॉर्म एक डायलॉग को पॉप करने के लिए उपयोग किया जाता है "क्या आप सुनिश्चित हैं कि आप ओके बटन दबाना चाहते थे?" और मैंने इसे हटाने का फैसला किया क्योंकि यह थोड़ा अच्छा है और उपयोगकर्ताओं को परेशान करता है, तो क्या मैंने फिर से कोड को फिर से डिजाइन किया है, इसे फिर से डिज़ाइन किया है, इसे संशोधित किया है, अन्य?
जॉब

@job: आपने नए चश्मे को पूरा करने के लिए कार्यक्रम बदल दिया है।
jmoreno

IMHO आप यहाँ विभिन्न मानदंडों का मिश्रण कर सकते हैं। खरोंच से कोड को फिर से लिखना वास्तव में रिफैक्टिंग नहीं है, लेकिन यह इस बात की परवाह किए बिना है कि इसने बाहरी व्यवहार को बदल दिया है या नहीं। इसके अलावा, यदि क्लास इंटरफ़ेस बदलना रिफैक्टिंग नहीं था, तो मूव मेथड एट अल कैसे करें । रिफ्लेक्टरिंग की सूची में मौजूद है ?
Péter Török

@ Péter Török - यह पूरी तरह से इस बात पर निर्भर करता है कि "क्लास इंटरफ़ेस को बदलने" से आपका क्या मतलब है क्योंकि एक OOP भाषा में जो उत्तराधिकार को लागू करता है, एक वर्ग के इंटरफ़ेस में वह नहीं है जो केवल क्लास द्वारा ही लागू किया जाता है। क्लास इंटरफ़ेस बदलने का अर्थ है इंटरफ़ेस में किसी विधि को निकालना / जोड़ना (या किसी विधि के हस्ताक्षर को बदलना - अर्थात संख्या एक प्रकार का पैरामीटर जो पास किया जाता है)। रीफैक्टरिंग का अर्थ है कि विधि, वर्ग या सुपरक्लास का जवाब कौन दे रहा है।
ज़ेके हेंसल

IMHO - यह संपूर्ण प्रश्न प्रोग्रामर के लिए किसी भी उपयोगी मूल्य के लिए बहुत गूढ़ हो सकता है।
ज़ेके हेंसेल

1

"बाहरी व्यवहार" द्वारा मुख्य रूप से वह सार्वजनिक इंटरफ़ेस के बारे में बात कर रहा है, लेकिन यह सिस्टम के आउटपुट / कलाकृतियों को भी शामिल करता है। (यानी आपके पास एक ऐसा तरीका है जो एक फ़ाइल बनाता है, फ़ाइल के स्वरूप को बदलने से बाहरी व्यवहार बदल जाएगा)

e: मैं "चाल पद्धति" को बाहरी व्यवहार में बदलाव मानता हूँ। यहाँ ध्यान रखें कि फाउलर मौजूदा कोड आधारों के बारे में बात कर रहा है जो जंगली में जारी किए गए हैं। आपकी स्थिति के आधार पर आप यह सत्यापित करने में सक्षम हो सकते हैं कि आपका परिवर्तन किसी भी बाहरी क्लाइंट को नहीं तोड़ता है और आपके मीरा के रास्ते पर आगे बढ़ता है।

e2: "तो बाहरी व्यवहार को बदलने वाले reworks के लिए सही शब्द क्या है?" - एपीआई रीफैक्टरिंग, ब्रेकिंग चेंज, आदि ... इसके अभी भी रीफैक्टरिंग, इसके सिर्फ एक सार्वजनिक इंटरफ़ेस को रिफ़्लेक्ट करने के लिए सर्वोत्तम प्रथाओं का पालन नहीं करना जो पहले से ही ग्राहकों के साथ जंगली में है।


लेकिन अगर वह सार्वजनिक इंटरफ़ेस के बारे में बात कर रहा है, तो "मूव विधि" के बारे में क्या कहना है?
साइबेरियाईगूय

@ इडासा ने आपके सवाल का जवाब देने के लिए मेरी प्रतिक्रिया संपादित की।

@kekela, लेकिन यह अभी भी मेरे लिए स्पष्ट नहीं है कि यह "रीफैक्टरिंग" बात कहां समाप्त होती है
साइबेरियाई

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

0

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

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

निष्कर्ष में, "सीमा", प्रश्न में उल्लिखित है, यदि आप भ्रमित करते हैं (मिक्स: डी) रिफैक्टरिंग-द-प्रक्रिया के साथ तकनीक को फिर से जोड़ते हैं तो पार किया जाता है।

पुनश्च: अच्छा सवाल है, btw।


इसे कई बार पढ़ें, लेकिन फिर भी इसे प्राप्त न करें
साइबेरियाई

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

0

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


0

एक रिफैक्टरिंग की सीमाएँ किसी दिए गए रिफ़ैक्टरिंग के लिए विशिष्ट होती हैं। वहाँ बस एक जवाब नहीं हो सकता है और सब कुछ शामिल है। एक कारण यह है कि रिफैक्टिंग शब्द अपने आप में गैर विशिष्ट है।

आप रिफ्लेक्टर कर सकते हैं:

  • सोर्स कोड
  • कार्यक्रम वास्तुकला
  • यूआई डिज़ाइन / उपयोगकर्ता सहभागिता

और मुझे यकीन है कि कई अन्य चीजें हैं।

शायद रिफ्लेक्टर के रूप में परिभाषित किया जा सकता है

"एक कार्रवाई या क्रियाओं का समूह जो किसी विशेष प्रणाली में एन्ट्रापी को कम करता है"


0

वहाँ निश्चित रूप से कुछ सीमा पर आप कितनी दूर refactor कर सकते हैं। देखें: जब दो एल्गोरिदम समान हैं?

लोग आमतौर पर एल्गोरिदम को उन कार्यक्रमों की तुलना में अधिक सार मानते हैं जो उन्हें लागू करते हैं। इस विचार को औपचारिक रूप देने का प्राकृतिक तरीका यह है कि एल्गोरिदम एक उपयुक्त समतुल्य संबंध के साथ कार्यक्रमों के समतुल्य वर्ग हैं। हमारा तर्क है कि इस तरह का कोई सम्‍मिलित संबंध नहीं है।

तो, बहुत दूर मत जाओ, या आप परिणाम में कोई विश्वास नहीं होगा। दूसरी ओर, अनुभव यह बताता है कि आप अक्सर एक एल्गोरिथ्म को दूसरे के साथ बदल सकते हैं, और एक ही उत्तर प्राप्त कर सकते हैं, कभी-कभी तेज। यह है कि सौंदर्य, एह?


0

आप "बाहरी" अर्थ के बारे में सोच सकते हैं

रोज के लिए खड़े हो जाओ।

तो सिस्टम में कोई भी परिवर्तन जो किसी भी सूअर को प्रभावित नहीं करता है, को रिफैक्टिंग माना जा सकता है।

वर्ग इंटरफ़ेस बदलना कोई समस्या नहीं है, यदि वर्ग का उपयोग केवल एक सिस्टम द्वारा किया जाता है जो आपकी टीम द्वारा बनाया और बनाए रखा जाता है। हालाँकि यदि वर्ग .net फ्रेमवर्क में एक सार्वजनिक वर्ग है जो प्रत्येक .net प्रोग्रामर द्वारा उपयोग किया जाता है तो यह एक बहुत अलग बात है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.