Go में लीगेसी कोड का रिफैक्टरिंग: अराजकता से व्यवस्था की ओर

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Go में लीगेसी कोड को रिफैक्टरिंग की आवश्यकता क्यों है?

Go (Golang) अपनी सरलता और प्रदर्शन के लिए प्रसिद्ध है। हालांकि, Go प्रोजेक्ट्स में भी समय के साथ लीगेसी कोड जमा हो जाता है - पुरानी संरचनाएं, अपठनीय फंक्शन, "जादुई" संख्याएं और टेस्ट की कमी। ऐसे कोड के साथ काम करना एक बुरा सपना बन जाता है: हर बदलाव जोखिम भरा होता है, और नई कार्यक्षमता जोड़ने में हफ्ते लग जाते हैं।

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



चरण 1: लीगेसी कोड का ऑडिट और मैपिंग

कोड बदलने से पहले, यह समझना जरूरी है कि आप किसके साथ काम कर रहे हैं। इस चरण को छोड़ें - और आप उस लॉजिक को तोड़ने का जोखिम उठाते हैं जिसे कोई याद नहीं रखता।



1.1. "रेड फ्लैग्स" की खोज

Go में सामान्य एंटी-पैटर्न की खोज से शुरुआत करें:

  • God-फंक्शन - 100 से अधिक पंक्तियों वाले फंक्शन।
  • ग्लोबल वेरिएबल्स - मजबूत कपलिंग और परीक्षण में कठिनाई।
  • मैजिक नंबर/स्ट्रिंग्स - कोड में बिखरे हुए कॉन्स्टेंट।
  • एरर हैंडलिंग का अभाव - वापस आने वाले error को अनदेखा करना।
  • एरर के बजाय पैनिक - बिजनेस लॉजिक के लिए panic/recover का उपयोग।
  • लेयर्स का मिश्रण - HTTP हैंडलर्स के अंदर SQL क्वेरी।


1.2. डिपेंडेंसी मैप बनाना

फंक्शन कॉल्स को विज़ुअलाइज़ करने के लिए go callgraph या guru जैसे टूल का उपयोग करें। इससे पता चलेगा:

  • पैकेजों के बीच चक्रीय निर्भरताएं।
  • "डेड" कोड जो कहीं कॉल नहीं किया जाता।
  • महत्वपूर्ण पथ जिन्हें पहले टेस्ट से कवर किए बिना नहीं छुआ जाना चाहिए।


चरण 2: टेस्ट से "सुरक्षा जाल" बनाना

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



2.1. फंक्शन स्तर पर परीक्षण

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

// लीगेसी कोडfunc CalculatePrice(base float64, discountCode string) float64 {    if discountCode == "SALE10" {        return base * 0.9    }    if discountCode == "VIP20" {        return base * 0.8    }    return base}

// कैरेक्टराइज़ेशन टेस्टfunc TestCalculatePrice(t *testing.T) { tests := []struct { name string base float64 code string want float64 }{ {"बिना छूट", 100.0, "", 100.0}, {"10% छूट", 100.0, "SALE10", 90.0}, {"20% छूट", 100.0, "VIP20", 80.0}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := CalculatePrice(tt.base, tt.code) if got != tt.want { t.Errorf("CalculatePrice(%v, %v) = %v; want %v", tt.base, tt.code, got, tt.want) } }) }}


2.2. गोल्डन फाइल्स के माध्यम से इंटीग्रेशन टेस्ट

जटिल संरचनाओं (JSON प्रतिक्रियाएं, रिपोर्ट जनरेशन) के लिए "गोल्डन फाइल्स" तकनीक का उपयोग करें। वर्तमान आउटपुट को एक फाइल में रिकॉर्ड करें, और रिफैक्टरिंग के दौरान इससे तुलना करें।

func TestHandler(t *testing.T) {    // अनुरोध निष्पादित करें    req := httptest.NewRequest("GET", "/api/data", nil)    rec := httptest.NewRecorder()    myHandler(rec, req)

// मानक से तुलना करें expected, _ := os.ReadFile("testdata/golden.json") if !bytes.Equal(rec.Body.Bytes(), expected) { t.Errorf("Output mismatch") }\

ब्लॉग

पुस्तक अनुशंसाएँ