किसी और को एक refactoring समस्या है? [बन्द है]


17

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


16
आपको कठोर समय सीमा की आवश्यकता है :)

क्या आप यहां उस कोड के बारे में बात कर रहे हैं जो आप अपने लिए (हॉबीस्ट प्रोजेक्ट्स) लिख रहे हैं या कोड आप अपनी नौकरी के हिस्से के रूप में लिख रहे हैं?
कार्सन 63000


1
क्या आप जीवन में कहीं और किसी भी मौके से थोड़ा गुदा हैं? मुझे पता है कि मैं भयानक रूप से ओसीडी और परफेक्ट हो सकता हूं अगर मैं खुद को छोड़ दूं ...
हम्फ्रे बोगार्ट

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

जवाबों:


18

मैं इन पलों का आनंद लेता हूं जब वे मेरे साथ होते हैं।

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

किसी भी तरह से, अपनी गलतियों से सीखना बहुत अच्छी बात है!


8

इस गतिविधि को बाधित करने और इसे अधिक उत्पादक बनाने के लिए यहां कुछ नियम दिए गए हैं:

  • टाइम-बॉक्स इसे, उदाहरण के लिए 25 मिनट के लिए टाइमर सेट करें
  • यह तभी करें जब आपके पास अच्छा टेस्ट कवरेज हो।
  • अगले कुछ सुविधाओं के विकास के लिए अपने रीफैक्टरिंग को उपयोगी बनाने का प्रयास करें

1
मैं आपसे सहमत हूं, लेकिन (3) ... मैं अगली कुछ विशेषताओं के बारे में सोचूंगा, अगर मुझे यकीन है कि उन विशेषताओं को अगले संस्करण में शामिल किया जाना है, क्योंकि यदि आप YAGNI (यू ऐन) में नहीं पड़ सकते हैं टी गोना नीड इट)। मेरा सुझाव है कि मार्टिन फाउलर और केंट बेक की पुस्तक "रिफैक्टिंग: इम्प्रूविंग द डिज़ाइन ऑफ़ एक्सिस्टिंग कोड" पढ़ना।
बजे ऑस्कर मेडरोस

1
@ ऑस्कर: सहमत। मेरे कहने का मतलब था कि खुद के खात्मे और YAGNI बनाने से परहेज करना।
अजहेग्लोव

7

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


3

ईमानदार होने के लिए, मुझे अधिक चिंता होगी यदि आप कोड के विशाल स्थानों को क्रैंक कर रहे हैं और सोच रहे हैं कि यह सब सही है और किसी भी रिफैक्टिंग की आवश्यकता नहीं है ...

जब मैं छोटा और अनुभवहीन था, तो मैं अपनी प्रोग्रामिंग क्षमता के बारे में बहुत अभिमानी था, और हमेशा यह कल्पना करने के लिए प्रवृत्त हुआ कि यह वास्तव में अच्छी तरह से डिजाइन और योजना बनाने के लिए संभव है - और एक बार जब मैं कार्यान्वयन के चरण में पहुंचता हूं तो मैं इसे धमाका कर दूँगा। ' सभी सही रहेंगे।

वास्तविकता लगभग विपरीत है। कुछ तो यह भी कहते हैं कि जैसे ही आप कोडिंग शुरू करते हैं, आपको रखरखाव मोड में होना चाहिए। यहाँ विचार यह है कि SDLC का "कार्यान्वयन" चरण वास्तव में ऐसा नहीं है, क्योंकि आपको बग फिक्सिंग या रिफ्लेक्टिंग को कभी भी एक तरफ नहीं रखना चाहिए और यह दिखावा करना चाहिए कि जो कोड आप बना रहे हैं वह "ताज़ा" और सही है।

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


2

मैं सुझाव दूंगा कि शुद्ध रूप से भावना या कोड गंध पर निर्भर न हों।

स्पष्ट रूप से बताएं कि कोड में क्या गलत है और क्या समाधान हैं। गंभीरता से, इसे लिखें, क्योंकि आप समीक्षा करना चाहते हैं कि आपका रिफ्लेक्टर इसके खिलाफ कितना प्रभावी था।

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

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


1

इसमें कोई संदेह नहीं है कि मैं इस जाल में पड़ता हूँ, लेकिन भविष्य के समर्थन / डिबगिंग के लिए कुछ रीफैक्टरिंग महत्वपूर्ण है।

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


1

जब मैं पहली बार किसी भाषा या तकनीक को सीख रहा होता हूं तो मैं इस फंदे में पड़ जाता हूं। उदाहरण के लिए, जब आप पहली बार जावा सीखते हैं, तो कल्पना करें कि आप एक सर्वलेट के साथ एक वेब-ऐप लिखते हैं, यह सोचकर कि यह सही तरीका है। तब आपको एहसास होता है कि जेएसपी है और आपको लगता है कि ओह यह नया है जो शायद सही है। फिर एक बार जब आप आधा रास्ता तय कर लेते हैं, तो आप स्ट्रट्स और शायद कुछ ईजेबी सामान ढूंढ लेते हैं, जिसके बाद आपको स्प्रिंग (xml आधारित) मिल जाता है, जिसके बाद आपको कूल @ एमवीसी एनोटेशन मिलते हैं, जिसके बाद आपको यह सब पता चलता है और आप खराब हो जाते हैं। Groovy / grails और scala / लिफ्ट के बीच चुनाव! यह व्यक्तिगत परियोजनाओं के लिए पूरी तरह से ठीक है क्योंकि बिंदु आमतौर पर सीखना है और जरूरी नहीं कि कुछ समय सीमा तक हिट हो।

मैं काम पर भी uber-refactorer हुआ करता था। लेकिन जैसा कि मैंने अधिक अनुभव प्राप्त किया है कि मैं और अधिक चयनात्मक हो गया हूँ कि मैं क्या करूँगा। यह पता चला है कि जब आप एक कंपनी छोड़ते हैं तो आप अपने साथ कोड नहीं लेते हैं, और आमतौर पर अन्य इंजीनियर इसे ठीक करने की तुलना में कोड को तेजी से मिटा सकते हैं।


1

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

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

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