विशाल गोंद विधियों से कैसे बचें?


21

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

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

गोंद विधि आमतौर पर कोड / डेटा की उलझन का एक संस्करण है जिसे मैं साफ करने का प्रयास कर रहा था। यह आमतौर पर अधिक पठनीय है, लेकिन यह अभी भी कष्टप्रद है।

मैं ऐसे तरीकों से कैसे बच सकता हूं? क्या यह पेचीदा डेटा का लक्षण है या किसी चीज़ का प्रतिबिंब है जो मैं गलत कर रहा हूं?


3
एपीआई का उपयोग किया जाना है। आपको मिली उलझी हुई गंदगी से, आपने एक एपीआई बनाया और फिर उसे फिर से पेचीदा बना दिया। शायद यह सिर्फ व्यावसायिक आवश्यकता है। लेकिन आपने मूल्य जोड़ा क्योंकि कोई और आ सकता है और आपके एपीआई का उपयोग करके आसानी से एक और गोंद कार्य कर सकता है। हाथों पर हाथ फेरने की जरूरत नहीं ...
आदित्य एमपी

1
क्या हम यहाँ वस्तुओं पर बात कर रहे हैं या सिर्फ जगह भर में फफूंद लगा रहे हैं?
एरिक रेपेने

3
मुझे नहीं लगता कि यह उस प्रश्न का डुप्लिकेट है, मैं थोड़ा और आम तौर पर बोल रहा हूं (और एकल फ़ंक्शन की तुलना में बड़े पैमाने पर)।
cmhobbs

1
erik - मैं यहाँ वस्तुओं और विधियों के बारे में बात कर रहा हूँ। मैंने कुछ सशर्त गड़बड़ियां ली हैं और उन्हें एपीआई में बदल दिया है। समस्या तब आती है जब एपीआई को कॉल करने का समय होता है। यहाँ पहला उत्तर वही हो सकता है जो मैं खोज रहा हूँ, हालाँकि।
cmhobbs

2
पृथ्वी पर कैसे एक डुप्लिकेट है?
मैटवेवी

जवाबों:


12

मैं आपको हमारे अनुभव का नेतृत्व करूँगा LedgerSMB। हमने चीजों को अलग तरह से जल्दी करने का निर्णय लिया और अभी भी वही कर रहे हैं जो आप वर्णन करते हैं, लेकिन बहुत अधिक गोंद तरीकों के बिना (हमारे पास कुछ गोंद तरीके हैं btw, बस बहुत कुछ नहीं)।

दो कोडबेस के साथ जीवन

लगभग 5 वर्षों के लिए लेजरबर्म्स दो कोडबेस के साथ बच गया है और पुराने कोडबेस को समाप्त करने से पहले यह कई और अधिक हो जाएगा। पुराने कोडबेस को निहारना एक सही हॉरर है। खराब डीबी डिजाइन, पर्ल IS->some_func(\%$some_object);कोड के साथ की तरह निर्माण करता है जो दिखाता है कि स्पैगेटी रूपक का उपयोग कभी-कभी क्यों किया जाता है (निष्पादन के रास्ते मॉड्यूल और पीठ के बीच और भाषाओं के बीच, बिना किसी तुक या कारण के)। नया कोडबेस डीबी प्रश्नों को संग्रहित प्रक्रियाओं में स्थानांतरित करने से बचाता है, जिसमें अनुरोध से निपटने के लिए एक क्लीनर फ्रेमवर्क होता है, और बहुत कुछ।

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

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

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

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

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


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

1
"निष्पादन पथ मॉड्यूल और पीठ के बीच और भाषाओं के बीच, कोई तुक या कारण नहीं है" - यह मुझे कुछ आधुनिक OO प्रथाओं की भी याद दिलाता है।
user253751

8

ऐसा लगता है कि आपने जो किया है वह एक पूर्ववर्ती कोडबेस का पेचीदा गड़बड़ है और एक सुंदर मॉड्यूलर पूर्ववर्ती कोडबेस बनाया गया है।

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

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


6

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


2
क्या आपको गोंद-पेड़ नहीं मिलता है?
Pieter B

3
@PieterB हो सकता है, लेकिन जब आप अलग-अलग तरीकों से अलग-अलग कार्य करते हैं तो अलग-अलग निर्भरताएं निकालना आसान होता है। आप नए तरीकों को निकालने के बाद एक और रीफैक्टरिंग पास कर सकते हैं।
Paling

1

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

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


0

ऐसा लगता है कि आप एपीआई के कार्यान्वयन के बारे में सोचकर ही एपीआई को फिर से तैयार कर रहे हैं, लेकिन एपीआई का उपयोग करने वाले कोड के बारे में पर्याप्त विचार किए बिना - यानी "गोंद कोड" जिसके बारे में आप बात कर रहे हैं।

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

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