नए भाषा निर्माणों का उपयोग करने के लिए पुराने कोड को अपडेट किया जाना चाहिए, या पुराने निर्माणों के साथ अटक जाना चाहिए?


15

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

क्या मैं:

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

1
@JerryCoffin मैं टिप्पणियों में बहस करने नहीं जा रहा हूं: मैंने मेटा पर पोस्ट किया है जहां हम एक उचित चर्चा कर सकते हैं।

जवाबों:


10

इस प्रश्न का एक निश्चित उत्तर देना असंभव है, क्योंकि यह स्थिति के विवरणों पर बहुत अधिक निर्भर करता है।

कोडबेस की शैली में संगति महत्वपूर्ण है क्योंकि यह कोड को समझने में आसान बनाने में मदद करता है, जो रखरखाव की सबसे महत्वपूर्ण पहलुओं में से एक है।
आप पहले प्रोग्रामर नहीं होंगे, जिन्होंने विभिन्न शैलियों को मिलाकर कोड को समझने में कठिन बनाने के लिए नरक को शाप दिया था। यह स्वयं भी हो सकता है कि शाप देने का कार्य वर्षों में हो।

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

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


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

3
@AnandVaidya: यह IMHO एक अवास्तविक अपेक्षा है, क्योंकि यह मानता है कि पुराना कोड OCP का अनुसरण करता है या OCP का अनुसरण करने के लिए आसानी से बदला जा सकता है, जो कि शायद ही कभी मामला हो या प्रयास के लायक न हो।
डॉक्टर ब्राउन

1
जब मैंने कहा, मैं सामान्य रूप से ऊप्स का मतलब नहीं है, लेकिन सामान्य रूप से ocp है। यह मूल रूप से संभव के रूप में मौजूदा कोड को संशोधित करने की कोशिश नहीं है, और अपने खुद के कोड अलग है। यह पुराने प्रक्रियात्मक कोड के साथ भी संभव है। मैं समझता हूं कि स्पेगेटी कोड को इस तरह से संशोधित नहीं किया जा सकता है, लेकिन किसी भी प्रतिमान में अच्छी तरह से डिज़ाइन किए गए कोड के लिए, खुले पास आसानी से लागू होना चाहिए। यह ऊप्स या प्रक्रियात्मक या कार्यात्मक हो सकता है।
आनंद वैद्य २५'१

2
@AnandVaidya: जब आपको OCP से मतलब नहीं है, तो आपको इसे इस तरह नहीं बुलाना चाहिए। मुझे लगता है कि आप वास्तव में क्या मतलब है कि फेदर की कॉल अंकुरित पद्धति में नया कोड लिख रही है , इसलिए कोई नई कोड शैली को एक नए, अलग तरीके से प्रतिबंधित कर सकता है। जब यह संभव और समझदार है, तो आप सही हैं, यह ठीक है। दुर्भाग्य से यह दृष्टिकोण हमेशा लागू नहीं होता है, कम से कम यदि आप पुराने कोड DRY रखना चाहते हैं तो नहीं।
डॉक्टर ब्राउन

@DocBrown: मुझे नहीं लगता कि खुला / बंद सिद्धांत ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग तक सीमित है। आपके पास ऐसे मॉड्यूल हो सकते हैं जहां आप नई प्रक्रियाएँ जोड़ते हैं, लेकिन मौजूदा को संशोधित नहीं करते हैं, अर्थात आप मौजूदा कोड के शब्दार्थ को अक्षुण्ण रखते हैं और, यदि आपको नई कार्यक्षमता की आवश्यकता है, तो आप नया कोड लिखते हैं।
जियोर्जियो

5

काफी हद तक, कोड और यह कैसे दिखता है अप्रासंगिक है । कोड क्या करता है है क्या मायने रखता है।

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

यदि आप उस स्थिरता की गारंटी नहीं दे सकते हैं (आपको वे परीक्षण नहीं मिले हैं), तो इसे अकेले छोड़ दें।

कोई भी व्यक्ति व्यवसाय-महत्वपूर्ण सॉफ़्टवेयर के एक टुकड़े को "तोड़ने" के लिए धन्यवाद नहीं देगा, भले ही आप इसे "बेहतर" बनाने की कोशिश कर रहे हों। "वर्किंग" हर बार "बेहतर" होता है।

बेशक, इस तरह के एक अभ्यास के लिए तत्परता में इस तरह के परीक्षणों का एक सेट बनाने से रोकने के लिए कुछ भी नहीं है ...


4

लागत और लाभों के संदर्भ में लगभग कुछ भी विश्लेषण किया जा सकता है, और मुझे लगता है कि यह यहां लागू होता है।

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

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

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

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

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

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

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

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

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


1

मैं आपके लिए पहला विकल्प चुनूंगा। जब मैं कोड का पालन करता हूं तो मैं इसे बेहतर स्थिति में छोड़ने के लिए नियम का पालन करता हूं।

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


1

जवाब, कई अन्य चीजों की तरह, यह निर्भर करता है । यदि पुराने निर्माणों को अपडेट करने के लिए प्रमुख लाभ हैं, जैसे कि इसके लिए जाने की तुलना में लंबे समय तक बनाए रखने योग्य दीर्घकालिक सुधार (कॉलबैक नरक से बचना)। यदि कोई बड़ा लाभ नहीं है, तो स्थिरता संभवतः आपका मित्र है

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

योग करने के लिए: आपका अंतिम निर्णय आपके विशेष मामले के 'लागत' / 'लाभ' विश्लेषण पर आधारित होना चाहिए।

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