मराठी

लेगसी कोड रिफॅक्टरिंगसाठी एक व्यावहारिक मार्गदर्शक, ज्यात ओळख, प्राधान्यक्रम, तंत्र आणि आधुनिकीकरण व देखभालीसाठी सर्वोत्तम पद्धतींचा समावेश आहे.

अवघड कोडवर मात करणे: लेगसी कोडसाठी रिफॅक्टरिंग स्ट्रॅटेजीज

लेगसी कोड. हा शब्द ऐकताच अनेकदा अस्ताव्यस्त, डॉक्युमेंटेशन नसलेल्या सिस्टीम्स, नाजूक डिपेंडेंसीज आणि एक प्रकारची भीती मनात येते. जगभरातील अनेक डेव्हलपर्सना या सिस्टीम्सची देखभाल आणि विकास करण्याचे आव्हान पेलावे लागते, ज्या अनेकदा व्यवसायाच्या दृष्टीने अत्यंत महत्त्वाच्या असतात. हे सर्वसमावेशक मार्गदर्शक लेगसी कोडला रिफॅक्टर करण्यासाठी व्यावहारिक स्ट्रॅटेजीज प्रदान करते, ज्यामुळे निराशेचे कारण बनलेली ही गोष्ट आधुनिकीकरण आणि सुधारणेच्या संधीत बदलते.

लेगसी कोड म्हणजे काय?

रिफॅक्टरिंग तंत्रांमध्ये जाण्यापूर्वी, "लेगसी कोड" म्हणजे काय हे परिभाषित करणे आवश्यक आहे. हा शब्द फक्त जुन्या कोडसाठी वापरला जात असला तरी, त्याची अधिक अचूक व्याख्या त्याच्या देखभालक्षमतेवर (maintainability) लक्ष केंद्रित करते. मायकल फेदर्स यांनी त्यांच्या "वर्किंग इफेक्टिव्हली विथ लेगसी कोड" या प्रसिद्ध पुस्तकात लेगसी कोडची व्याख्या 'टेस्ट्स नसलेला कोड' अशी केली आहे. या टेस्ट्सच्या अभावामुळे, कोडमध्ये सुरक्षितपणे बदल करणे आणि नवीन चुका (regressions) टाळणे कठीण होते. तथापि, लेगसी कोडमध्ये इतर वैशिष्ट्ये देखील असू शकतात:

हे लक्षात घेणे महत्त्वाचे आहे की लेगसी कोड मूळतः वाईट नसतो. तो अनेकदा एक महत्त्वपूर्ण गुंतवणूक दर्शवतो आणि त्यात मौल्यवान डोमेन ज्ञानाचा समावेश असतो. रिफॅक्टरिंगचा उद्देश या मूल्याचे जतन करणे आणि त्याच वेळी कोडची देखभालक्षमता, विश्वसनीयता आणि कार्यक्षमता सुधारणे हा आहे.

लेगसी कोड रिफॅक्टर का करावा?

लेगसी कोड रिफॅक्टर करणे एक आव्हानात्मक काम असू शकते, परंतु त्याचे फायदे अनेकदा आव्हानांपेक्षा जास्त असतात. रिफॅक्टरिंगमध्ये गुंतवणूक करण्याची काही प्रमुख कारणे येथे आहेत:

रिफॅक्टरिंगसाठी योग्य कोड ओळखणे

सर्वच लेगसी कोडला रिफॅक्टर करण्याची गरज नसते. खालील घटकांवर आधारित रिफॅक्टरिंगच्या प्रयत्नांना प्राधान्य देणे महत्त्वाचे आहे:

उदाहरण: एका जागतिक लॉजिस्टिक्स कंपनीची कल्पना करा, जिच्याकडे शिपमेंट्स व्यवस्थापित करण्यासाठी एक लेगसी सिस्टीम आहे. शिपिंग खर्चाची गणना करणारे मॉड्युल बदलणारे नियम आणि इंधनाच्या किमतींमुळे वारंवार अपडेट केले जाते. हे मॉड्युल रिफॅक्टरिंगसाठी एक प्रमुख उमेदवार आहे.

रिफॅक्टरिंगची तंत्रे

अनेक रिफॅक्टरिंग तंत्रे उपलब्ध आहेत, प्रत्येक तंत्र विशिष्ट कोड स्मेल दूर करण्यासाठी किंवा कोडच्या विशिष्ट पैलूंना सुधारण्यासाठी डिझाइन केलेले आहे. येथे काही सामान्यतः वापरली जाणारी तंत्रे आहेत:

मेथड्सची रचना करणे

ही तंत्रे मोठ्या, गुंतागुंतीच्या मेथड्सना लहान, अधिक व्यवस्थापनीय मेथड्समध्ये विभागण्यावर लक्ष केंद्रित करतात. यामुळे वाचनीयता सुधारते, डुप्लिकेशन कमी होते आणि कोडची तपासणी करणे सोपे होते.

ऑब्जेक्ट्समध्ये फीचर्स हलवणे

ही तंत्रे जबाबदाऱ्या योग्य ठिकाणी हलवून क्लासेस आणि ऑब्जेक्ट्सच्या डिझाइनमध्ये सुधारणा करण्यावर लक्ष केंद्रित करतात.

डेटा संघटित करणे

ही तंत्रे डेटा संग्रहित आणि ऍक्सेस करण्याच्या पद्धतीत सुधारणा करण्यावर लक्ष केंद्रित करतात, ज्यामुळे तो समजणे आणि बदलणे सोपे होते.

कंडिशनल एक्सप्रेशन्स सोपे करणे

कंडिशनल लॉजिक लवकरच गुंतागुंतीचे होऊ शकते. ही तंत्रे स्पष्टता आणण्याचा आणि सुलभ करण्याचा उद्देश ठेवतात.

मेथड कॉल्स सोपे करणे

जनरलायझेशन हाताळणे

ही उपलब्ध असलेल्या अनेक रिफॅक्टरिंग तंत्रांपैकी फक्त काही उदाहरणे आहेत. कोणते तंत्र वापरायचे याची निवड विशिष्ट कोड स्मेल आणि अपेक्षित परिणामावर अवलंबून असते.

उदाहरण: एका जागतिक बँकेद्वारे वापरल्या जाणाऱ्या जावा ऍप्लिकेशनमधील एक मोठी मेथड व्याजदरांची गणना करते. एक्स्ट्रॅक्ट मेथड (Extract Method) वापरून लहान, अधिक केंद्रित मेथड्स तयार केल्याने वाचनीयता सुधारते आणि मेथडच्या इतर भागांवर परिणाम न करता व्याजदर गणना लॉजिक अपडेट करणे सोपे होते.

रिफॅक्टरिंग प्रक्रिया

धोका कमी करण्यासाठी आणि यशाची शक्यता वाढवण्यासाठी रिफॅक्टरिंग पद्धतशीरपणे केले पाहिजे. येथे एक शिफारस केलेली प्रक्रिया आहे:

  1. रिफॅक्टरिंगसाठी उमेदवार ओळखा: आधी नमूद केलेल्या निकषांचा वापर करून कोडचे असे भाग ओळखा ज्यांना रिफॅक्टरिंगचा सर्वाधिक फायदा होईल.
  2. टेस्ट्स तयार करा: कोणतेही बदल करण्यापूर्वी, कोडचे विद्यमान वर्तन सत्यापित करण्यासाठी स्वयंचलित (automated) टेस्ट्स लिहा. रिफॅक्टरिंगमुळे नवीन चुका (regressions) होत नाहीत याची खात्री करण्यासाठी हे अत्यंत महत्त्वाचे आहे. JUnit (Java), pytest (Python), किंवा Jest (JavaScript) सारखी साधने युनिट टेस्ट्स लिहिण्यासाठी वापरली जाऊ शकतात.
  3. टप्प्याटप्प्याने रिफॅक्टर करा: लहान, टप्प्याटप्प्याने बदल करा आणि प्रत्येक बदलानंतर टेस्ट्स चालवा. यामुळे कोणत्याही त्रुटी ओळखणे आणि दुरुस्त करणे सोपे होते.
  4. वारंवार कमिट करा: तुमचे बदल व्हर्जन कंट्रोलमध्ये वारंवार कमिट करा. यामुळे काही चूक झाल्यास मागील आवृत्तीवर सहज परत जाता येते.
  5. कोडचे पुनरावलोकन करा: तुमचा कोड दुसऱ्या डेव्हलपरकडून तपासून घ्या. यामुळे संभाव्य समस्या ओळखण्यात आणि रिफॅक्टरिंग योग्यरित्या झाले आहे याची खात्री करण्यास मदत होते.
  6. कार्यक्षमतेवर लक्ष ठेवा: रिफॅक्टरिंगनंतर, सिस्टीमच्या कार्यक्षमतेवर लक्ष ठेवा जेणेकरून बदलांमुळे कोणतीही कार्यक्षमता कमी झाली नाही याची खात्री होईल.

उदाहरण: एका जागतिक ई-कॉमर्स प्लॅटफॉर्ममधील पायथन मॉड्यूल रिफॅक्टर करणारी एक टीम विद्यमान कार्यक्षमतेसाठी युनिट टेस्ट्स तयार करण्यासाठी `pytest` वापरते. त्यानंतर ते जबाबदाऱ्या वेगळ्या करण्यासाठी आणि मॉड्यूलची रचना सुधारण्यासाठी एक्स्ट्रॅक्ट क्लास (Extract Class) रिफॅक्टरिंग लागू करतात. प्रत्येक लहान बदलानंतर, कार्यक्षमता तशीच राहिली आहे याची खात्री करण्यासाठी ते टेस्ट्स चालवतात.

लेगसी कोडमध्ये टेस्ट्स समाविष्ट करण्यासाठी स्ट्रॅटेजीज

मायकल फेदर्स यांनी योग्यरित्या म्हटल्याप्रमाणे, लेगसी कोड म्हणजे टेस्ट्स नसलेला कोड. विद्यमान कोडबेसमध्ये टेस्ट्स समाविष्ट करणे हे एक मोठे काम वाटू शकते, परंतु सुरक्षित रिफॅक्टरिंगसाठी ते आवश्यक आहे. हे काम करण्यासाठी येथे अनेक स्ट्रॅटेजीज आहेत:

कॅरॅक्टरायझेशन टेस्ट्स (Golden Master Tests)

जेव्हा तुम्ही समजण्यास कठीण असलेल्या कोडशी व्यवहार करत असता, तेव्हा कॅरॅक्टरायझेशन टेस्ट्स तुम्हाला बदल करण्यास सुरुवात करण्यापूर्वी त्याचे विद्यमान वर्तन कॅप्चर करण्यास मदत करू शकतात. कल्पना अशी आहे की दिलेल्या इनपुट सेटसाठी कोडच्या सध्याच्या आउटपुटची तपासणी करणाऱ्या टेस्ट्स लिहा. या टेस्ट्स अचूकतेची पडताळणी करत नाहीत; त्या फक्त कोड *सध्या* काय करतो हे डॉक्युमेंट करतात.

पायऱ्या:

  1. तुम्ही ज्या कोड युनिटचे कॅरॅक्टरायझेशन करू इच्छिता ते ओळखा (उदा. फंक्शन किंवा मेथड).
  2. इनपुट व्हॅल्यूजचा एक सेट तयार करा जो सामान्य आणि एज-केस परिस्थितींची श्रेणी दर्शवतो.
  3. त्या इनपुटसह कोड चालवा आणि परिणामी आउटपुट कॅप्चर करा.
  4. अशा टेस्ट्स लिहा ज्या हे सिद्ध करतात की कोड त्या इनपुटसाठी तेच अचूक आउटपुट तयार करतो.

सावधानता: जर मूळ लॉजिक गुंतागुंतीचे किंवा डेटा-आधारित असेल तर कॅरॅक्टरायझेशन टेस्ट्स ठिसूळ असू शकतात. तुम्हाला नंतर कोडचे वर्तन बदलण्याची आवश्यकता असल्यास त्या अपडेट करण्यासाठी तयार रहा.

स्प्राउट मेथड आणि स्प्राउट क्लास

मायकल फेदर्स यांनी वर्णन केलेली ही तंत्रे, विद्यमान कोड खराब होण्याचा धोका कमी करून लेगसी सिस्टीममध्ये नवीन कार्यक्षमता समाविष्ट करण्याचा उद्देश ठेवतात.

स्प्राउट मेथड (Sprout Method): जेव्हा तुम्हाला एखादे नवीन फीचर जोडण्याची आवश्यकता असते ज्यासाठी विद्यमान मेथडमध्ये बदल करणे आवश्यक असते, तेव्हा नवीन लॉजिक असलेली एक नवीन मेथड तयार करा. मग, विद्यमान मेथडमधून या नवीन मेथडला कॉल करा. यामुळे तुम्हाला नवीन कोड वेगळा करून स्वतंत्रपणे तपासता येतो.

स्प्राउट क्लास (Sprout Class): स्प्राउट मेथडसारखेच, परंतु क्लासेससाठी. नवीन कार्यक्षमता अंमलात आणणारा एक नवीन क्लास तयार करा आणि नंतर त्याला विद्यमान सिस्टीममध्ये समाकलित करा.

सँडबॉक्सिंग (Sandboxing)

सँडबॉक्सिंगमध्ये लेगसी कोडला सिस्टीमच्या उर्वरित भागापासून वेगळे करणे समाविष्ट आहे, ज्यामुळे तुम्हाला ते नियंत्रित वातावरणात तपासता येते. हे डिपेंडेंसीजसाठी मॉक्स किंवा स्टब्स तयार करून किंवा कोड व्हर्च्युअल मशीनमध्ये चालवून केले जाऊ शकते.

मिकाडो मेथड (The Mikado Method)

मिकाडो मेथड ही गुंतागुंतीच्या रिफॅक्टरिंग कार्यांना हाताळण्यासाठी एक व्हिज्युअल समस्या-निवारण पद्धत आहे. यात कोडच्या वेगवेगळ्या भागांमधील अवलंबित्व दर्शवणारा एक आकृती तयार करणे आणि नंतर सिस्टीमच्या इतर भागांवर कमीत कमी परिणाम होईल अशा प्रकारे कोड रिफॅक्टर करणे समाविष्ट आहे. मूळ तत्व म्हणजे बदल "प्रयत्न" करणे आणि काय बिघडते ते पाहणे. जर ते बिघडले, तर शेवटच्या कार्यरत स्थितीवर परत या आणि समस्येची नोंद करा. मग मूळ बदल पुन्हा प्रयत्न करण्यापूर्वी त्या समस्येचे निराकरण करा.

रिफॅक्टरिंगसाठी साधने (टूल्स)

अनेक साधने रिफॅक्टरिंगमध्ये मदत करू शकतात, पुनरावृत्ती होणारी कामे स्वयंचलित करतात आणि सर्वोत्तम पद्धतींवर मार्गदर्शन करतात. ही साधने अनेकदा इंटिग्रेटेड डेव्हलपमेंट एन्व्हायर्नमेंट्स (IDEs) मध्ये समाकलित केलेली असतात:

उदाहरण: एका जागतिक विमा कंपनीसाठी C# ऍप्लिकेशनवर काम करणारी एक डेव्हलपमेंट टीम व्हेरिएबल्सचे नाव बदलण्यासाठी आणि मेथड्स काढण्यासाठी Visual Studio च्या अंगभूत रिफॅक्टरिंग साधनांचा वापर करते. ते कोड स्मेल्स आणि संभाव्य भेद्यता ओळखण्यासाठी SonarQube चा देखील वापर करतात.

आव्हाने आणि धोके

लेगसी कोड रिफॅक्टर करणे आव्हाने आणि धोक्यांशिवाय नाही:

सर्वोत्तम पद्धती (Best Practices)

लेगसी कोड रिफॅक्टरिंगशी संबंधित आव्हाने आणि धोके कमी करण्यासाठी, या सर्वोत्तम पद्धतींचे अनुसरण करा:

निष्कर्ष

लेगसी कोड रिफॅक्टर करणे हे एक आव्हानात्मक परंतु फायद्याचे काम आहे. या मार्गदर्शिकेत दिलेल्या स्ट्रॅटेजीज आणि सर्वोत्तम पद्धतींचे पालन करून, तुम्ही या अवघड कामावर मात करू शकता आणि तुमच्या लेगसी सिस्टीम्सना देखभाल करण्यायोग्य, विश्वसनीय आणि उच्च-कार्यक्षमता असलेल्या मालमत्तेत बदलू शकता. रिफॅक्टरिंग पद्धतशीरपणे हाताळा, वारंवार टेस्ट करा आणि तुमच्या टीमशी प्रभावीपणे संवाद साधा. काळजीपूर्वक नियोजन आणि अंमलबजावणी करून, तुम्ही तुमच्या लेगसी कोडमधील सुप्त क्षमता अनलॉक करू शकता आणि भविष्यातील नवनिर्मितीचा मार्ग मोकळा करू शकता.