2010-10-28 3 views
21

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

"रिफैक्टरिंग" कोड बदलाव ला रहा है इसकी डिजाइन में सुधार करने के इतनी के रूप में परिवर्तन की लागत को कम करने के लिए। इसे लगातार किए बिना आपको उलझन कोड बेस मिलते हैं जो परीक्षण लिखना अधिक कठिन होता है।

वास्तविक जीवन में वहाँ हमेशा ग्राहकों बेचा नई सुविधाओं और राजनीति की वजह से किया गया है कि कर रहे हैं सभी ग्राहकों को देखने के लिए कि प्रगति पर सुविधाओं में से "अपने" समूह बनाया जा रहा है है। तो यह बहुत ही कम है कि शाखाओं पर बैठे आधा तैयार सुविधाओं के बिना एक समय है।

यदि कोई रिफैक्टरिंग किया गया है, तो "फीचर शाखाओं" में विलय करना असंभव नहीं होने पर बहुत कठिन हो जाता है।

क्या हमें किसी भी रिफैक्टरिंग करने में सक्षम होने पर छोड़ देना है?

यह भी देखें "How do you handle the tension between refactoring and the need for merging?"

उत्तर

12

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

मुझे विवादास्पद राय है कि आपको फीचर शाखाओं से लगभग सभी लागतों (लगभग) पर बचना चाहिए। विलय की लागत बहुत अधिक है, और (शायद अधिक महत्वपूर्ण बात) साझा कोड आधार में "निरंतर एकीकृत" करने में विफल होने की अवसर लागत भी अधिक है।

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

+0

XP पैनजैंडम केवल एक कोडलाइन होने के बारे में अशिष्ट हैं। मुझे यकीन नहीं है कि यह समझना कितना व्यवहार्य है कि अभ्यास में (मुझे लगता है कि आपको प्रत्येक समर्थित रिलीज के लिए एक ट्रंक प्लस रखरखाव शाखा की आवश्यकता हो सकती है, जिसका अर्थ है कम से कम दो कोडेलिन), लेकिन यह निश्चित है कि वे आपके साथ सहमत हैं। –

+0

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

+0

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

10

मैं इस उत्तेजक थीसिस की तरह ('रिफैक्टरिंग देने'), क्योंकि यह समृद्ध चर्चा :)

मैं मानता हूँ तुम, बड़ा रिफैक्टरिंग जब समानांतर codelines के बहुत सारे होने के साथ बहुत सावधान रहना होगा क्योंकि संघर्ष को बढ़ा सकते हैं है विलय के दौरान एकीकरण बहुत काम करता है और यहां तक ​​कि रिग्रेशन-बग पेश करता है।

इसके कारण रिफैक्टरिंग बनाम फीचर-शाखा समस्या के साथ, बहुत सारे ट्रेडऑफ हैं। इसलिए मैं मामले के आधार पर किसी मामले पर निर्णय लेता हूं:

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

सारांश के रूप में मैं codeline के आधार पर मेरी refactorings की योजना:

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

रिफैक्टरिंग और विलय दो संयुक्त विषय Plastic SCM पर केंद्रित है। वास्तव में ध्यान केंद्रित करने के लिए दो महत्वपूर्ण क्षेत्र हैं: कोई moved or renamed on a branch वाली फ़ाइलों के साथ (विलय के दौरान) कार्य कर रहा है। यहां अच्छी खबर यह है कि सभी "नई उम्र" एससीएम आपको सही तरीके से (प्लास्टिक, गिट, एचजी) करने देगी जबकि पुराने लोग बस असफल हो जाते हैं (एसवीएन, पर्सफोर्स और यहां तक ​​कि पुराने भी)।

दूसरा भाग एक ही फ़ाइल के अंदर रिफैक्टर कोड से निपट रहा है: आप जानते हैं, आप अपना कोड ले जाते हैं और अन्य डेवलपर इसे समानांतर में संशोधित करता है। यह एक कठिन समस्या है लेकिन हम नए मर्ज/डिफ टूलसेट के साथ भी इस पर ध्यान केंद्रित करते हैं। xdiff info here और xmerge (क्रॉस-विलय) here खोजें। find moved code here ("तुलना से परे" की तुलना में) के बारे में एक अच्छी चर्चा।

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

+0

क्या प्लास्टिक विलय उपकरण सादे पाठ की बजाय एक पार्स पेड़ पर काम करते हैं? यदि ऐसा है तो कौन सी भाषाएं समर्थित हैं? –

+0

वर्तमान xmerge/xdiff टेक्स्ट पर समान पैटर्न खोजने पर आधारित हैं, इसलिए वे भाषा स्वतंत्र हैं। एक साइड नोट के रूप में मैं आपको पार्सिंग-आधारित (सी #, जावा और फिर सी और बाद में सी ++) बता सकता हूं। – pablo

1

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

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

पिछले कुछ सालों में research बहुत सारे हैं, आखिरकार कुछ उत्पाद बाजार में आ रहे हैं।

संबंधित मुद्दे