2008-12-12 14 views
11

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

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

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

आप कुछ रणनीति सिर्फ जाँच में अपने गुस्से को रखने के लिए है, तो उस रूप में अच्छी तरह का स्वागत है।

सुझाव इस प्रकार अब तक:

  1. स्थापना परीक्षण कवरेज
  2. कोड तह
  3. पुनर्निर्माण मौजूदा तरीकों
  4. दस्तावेज़ व्यवहार वृद्धिशील सुधार के लिए की खोज की
  5. उद्देश्य के रूप में

संपादित करें:

चार्ल्स कॉनवे एक पॉडकास्ट की अनुशंसा करता है जो बहुत उपयोगी साबित हुआ। link

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

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

ग्रेट टिप बड़ी कक्षा का उपयोग करें जो कहीं और उपयोग किया जाता है और इसे एक emtpy इंटरफ़ेस लागू करता है। फिर कक्षा का उपयोग करके कोड लें और इसके बजाय इंटरफ़ेस को तुरंत चालू करें। यह आपको आपके कोड में उस बड़ी कक्षा में सभी निर्भरताओं की पूरी सूची देगा।

+3

भागो, और पीछे देखने के लिए मत रोको !!! – JoshBerke

+0

अगर मैं केवल जोश कर सकता हूं ... अगर मैं केवल ... –

+0

हे, मैंने सुना है, मुझे एक बार इस COM + एप बहु-थ्रेडेड की समीक्षा करनी पड़ी, कोड की 20,000 लाइनें, जिसमें चक्रीय जटिलता की ऊंचाई अधिक थी, तब मैंने कभी देखा। ओह और यह केवल 5 तरीकों की तरह था। मैंने इस सेवा को "पुन: उपयोग" करने का सुझाव देने के लिए एमजीएमटी पर पक्के और हँसे। – JoshBerke

उत्तर

9

ओच! उस स्थान की तरह लगता है जो मैं काम करने के लिए उपयोग करता हूं।

Working effectivly with legacy code पर एक नज़र डालें। अत्याचारी कोड से निपटने के तरीके में कुछ रत्न हैं।

डॉटनेट्रॉक्स ने हाल ही में विरासत कोड के साथ काम करने पर show किया था। कोई जादू गोली नहीं है जो इसे काम करने जा रही है।

मैंने जो सबसे अच्छी सलाह सुनी है वह परीक्षण में कोड को बढ़ाना शुरू कर रहा है।

+0

उस पॉडकास्ट में सलाह के कुछ वाकई वाकई अच्छे टुकड़े थे। पोस्ट के लिए धन्यवाद। –

+0

कभी भी, मुझे उम्मीद है कि आप एक कार्य रणनीति ढूंढ सकते हैं। यदि आपको कोई विशेष विधि मिलती है जो आपको पोस्ट करने में मदद कर सकती है? मुझे इसके बारे में सुनना चाहूंगी। –

+0

मैं बस ऐसा करने जा रहा हूं। –

4

जो मुझे अपनी मौजूदा नौकरी की याद दिलाता है और जब मैं पहली बार शामिल हो गए। उन्होंने मुझे कुछ भी लिखने नहीं दिया क्योंकि मेरे पास एक ही तर्क था, "ये कक्षाएं इतनी बड़ी और खराब लिखी गई हैं! कोई भी उन्हें संभवतः समझ नहीं सकता है कि उन्हें अकेले नई कार्यक्षमता जोड़ें।"

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

3

कोड फोल्डिंग सहायता कर सकती है। यदि आप विशाल वर्ग के भीतर सामान को स्थानांतरित कर सकते हैं और इसे कुछ हद तक तार्किक तरीके से व्यवस्थित कर सकते हैं, तो आप विभिन्न ब्लॉक के चारों ओर गुना डाल सकते हैं।

कुछ भी छुपाएं, और आप अलग-अलग फ़ाइलों की बजाय फ़ोल्डरों को छोड़कर सी सी प्रतिमान पर वापस आ गए हैं।

+0

बहुत सारे कोड बेस बहुत प्रक्रियात्मक हैं, इसलिए देख रहे हैं पर सी में संभाली गई इस समस्या के समाधान भी एक अच्छी जगह हो सकते हैं। धन्यवाद! –

+0

लगता है जैसे "एक सुअर पर लिपस्टिक डालना" - मैं बुलेट काट दूंगा और धीरे-धीरे डिजाइन को बेहतर बनाने की कोशिश करता हूं। – tvanfosson

+0

मुझे लगता है कि यह मेरा सबसे बड़ा मानसिक ब्लॉक है हालांकि। एक बार जब मैं "मुझे" करना चाहता हूं, तो मैं एक मानसिक स्थिति में जाता हूं जहां एकमात्र समाधान जो मैं देखता हूं वह एक पूर्ण पूर्ण पुनर्लेख है। –

4

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

+0

यदि कोड बहुत सारी टिप्पणियों के लिए बहुत खराब लिखा गया है तो इसे निश्चित रूप से दोबारा करने की आवश्यकता है। कोड को केवल न्यूनतम टिप्पणियों के साथ समझा जाना चाहिए। – tvanfosson

+0

कोड "अच्छी तरह से लिखा" हो सकता है लेकिन क्योंकि यह कुछ जटिल करता है, किसी ऐसे व्यक्ति के लिए जिसने इसे पहले कभी नहीं देखा, इसे बहुत सारी टिप्पणियों की आवश्यकता है। बेकार नहीं (उदा। सूची में सभी ऑब्जेक्ट्स पर लूपिंग) लेकिन उपयोगी वाले (उदा। सुनिश्चित करने के लिए foo() को रीसेट करने की आवश्यकता है() बाद में विफल नहीं होगा)। – Elie

+0

यह शुद्धियों के लिए यह अधिक उपयोगी हो सकता है: मैंने * लिखित * कोड लिखा है जो भयानक प्रक्रियात्मक gyrations करना था क्योंकि यह वही करना था (यह पढ़ रहा था और चुनिंदा ईमेल ईमेल)। सबसे अच्छा मैं अगले प्रोग्रामर के लिए छोड़ सकता था बहुत सारी टिप्पणियां थीं। – staticsan

2

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

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

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

3

मैं इस स्थिति में भी आया हूं।

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

दूसरा, मैं मुख्य एल्गोरिदम की पहचान करता हूं और उन्हें एक संख्या प्रणाली का उपयोग करके अपने हिस्सों में विघटित करता हूं संख्याओं और अक्षरों के बीच वैकल्पिक (यह बदसूरत है लेकिन मेरे लिए अच्छा काम करता है)। उदाहरण के लिए आप एक एल्गोरिदम 4 "स्तर" गहरे भाग को देख सकते हैं और संख्या 1.b.3.e या कुछ अन्य भगवान भयानक चीज होगी।ध्यान दें कि जब मैं स्तर कहता हूं, तो मैं जरूरी ब्लॉक या दायरे को नियंत्रित करने के लिए सीधे संदर्भ नहीं दे रहा हूं, लेकिन जहां मैंने एल्गोरिदम के चरणों और उप-चरणों की पहचान की है।

फिर यह एल्गोरिदम को पढ़ने और फिर से पढ़ने का विषय है। जब आप शुरू करते हैं तो यह बहुत समय लगता है, लेकिन मुझे लगता है कि ऐसा करने से एक बार में तर्क का एक बड़ा सौदा समझने की प्राकृतिक क्षमता विकसित होती है। साथ ही, यदि आपको इस कोड के लिए जिम्मेदार त्रुटि मिलती है, तो समय से पहले इसे पेपर पर दृष्टि से तोड़ने से आपको कोड को "नेविगेट" करने में मदद मिलती है, क्योंकि आपके पास पहले से ही आपके सिर में इसका नक्शा है।

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

+0

ओहोह! यह बहुत प्रयास है, लेकिन यह करने का यह सही तरीका होना चाहिए। कुडोस। –

3

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

मुझे स्रोत कोड मिला। एक फ़ाइल, 22,000 लाइनें सी, कोई अमूर्तता। मैंने इसे पढ़ने में घंटों बिताए; यह सब महान काम था, लेकिन यह सब बुरी तरह से किया गया था। मैं एक लाइन या यहां तक ​​कि एक विचार का पुन: उपयोग करने में सक्षम नहीं था।

मुझे यकीन है कि क्या कहानी का नैतिक है नहीं कर रहा हूँ, लेकिन अगर मैं काम पर इस सामग्री का उपयोग करने के लिए मजबूर किया गया था, मैं इसे एक समय में एक बंद चिप टुकड़े करने के लिए विनती की अनुमति है, के लिए इकाई परीक्षण का निर्माण होगा प्रत्येक टुकड़ा, और अंततः टुकड़ों से बाहर एक नई, समझदार चीज बढ़ जाती है। यह दृष्टिकोण जगह पर एक बड़ी ईंट को दोबारा बनाए रखने और बनाए रखने की कोशिश करने से थोड़ा अलग है, लेकिन मैं विरासत कोड को छूटे हुए छोड़ देता हूं और समानांतर में एक नई प्रणाली लाने की कोशिश करता हूं।

+0

कभी-कभी यूनिट परीक्षण एक अच्छा निदान उपकरण हो सकता है यह पता लगाने के लिए कि "विधि 1" वास्तव में क्या तरीका है :)। –

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