Rust पर लीगेसी कोड का रिफैक्टरिंग: A से Z तक

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

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

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

परिचय: Rust पर लीगेसी कोड का रिफैक्टरिंग क्यों एक चुनौती और अवसर है

\n

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

\n

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

\n\n

1. ऑडिट और तैयारी: रिफैक्टरिंग कहाँ से शुरू करें

\n

कुछ भी बदलने से पहले, यह समझना आवश्यक है कि आप किसके साथ काम कर रहे हैं। योजना के बिना रिफैक्टरिंग आपदा का सीधा रास्ता है।

\n\n

1.1. कोड बेस की सूची बनाना

\n

पहला कदम पैमाने का आकलन करना है। कमजोरियों का पता लगाने के लिए clippy जैसे स्थैतिक विश्लेषण उपकरण और cargo audit कचरा संग्रहकर्ता का उपयोग करें। निम्नलिखित पर विशेष ध्यान दें:

\n
    \n
  • unsafe ब्लॉक: ये सबसे खतरनाक हिस्से हैं। जाँच करें कि क्या वे वास्तव में आवश्यक हैं।
  • \n
  • कच्चे पॉइंटर्स: उन्हें सुरक्षित संदर्भों या स्मार्ट पॉइंटर्स (Box, Rc, Arc) से बदलें।
  • \n
  • println! और panic! मैक्रोज़: ये अक्सर अनहैंडल त्रुटियों का संकेत देते हैं।
  • \n
\n\n

1.2. टेस्ट कवरेज बनाना

\n

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

\n
// लीगेसी फंक्शन के लिए टेस्ट का उदाहरण\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_legacy_calculation() {\n        // पुराना फंक्शन जिसे हम रिफैक्टर करने की योजना बना रहे हैं\n        let result = old_calculation(5, 10);\n        assert_eq!(result, 50);\n    }\n}\n
\n\n

2. Rust कोड के रिफैक्टरिंग की मुख्य तकनीकें

\n

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

\n\n

2.1. unsafe को सुरक्षित विकल्पों से बदलना

\n

रिफैक्टरिंग का एक मुख्य लक्ष्य unsafe को कम करना है। अक्सर डेवलपर्स इसका उपयोग ऐरे के साथ काम करने के लिए करते हैं, जबकि Rust सुरक्षित तरीके प्रदान करता है।

\n

पहले (लीगेसी):

\n
fn sum_slice_unsafe(data: &[i32], len: usize) -> i32 {\n    let mut sum = 0;\n    for i in 0..len {\n        sum += unsafe { *data.as_ptr().add(i) };\n    }\n    sum\n}\n
\n

बाद में (रिफैक्टरिंग):

\n
fn sum_slice_safe(data: &[i32]) -> i32 {\n    data.iter().sum()\n}\n
\n\n

2.2. panic! मैक्रोज़ को Result से बदलना

\n

लीगेसी कोड अक्सर त्रुटियों पर पैनिक करता है। आधुनिक Rust प्रोजेक्ट्स में त्रुटियों को स्पष्ट रूप से संभालने के लिए Result का उपयोग करना आम बात है।

\n
// पहले\nfn divide(a: i32, b: i32) -> i32 {\n    if b == 0 {\n        panic!("Division by zero!");\n    }\n    a / b\n}\n\n// बाद में\nfn divide(a: i32, b: i32) -> Result<i32, String> {\n    if b == 0 {\n        return Err("Division by zero".to_string());\n    }\n    Ok(a / b)\n}\n
\n\n

2.3. मुहावरेदार निर्माणों का उपयोग करना

\n

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

\n
// लीगेसी: मैन्युअल लूप\nfn find_max_legacy(data: &[i32]) -> Option<i32> {\n    if data.is_empty() {\n        return None;\n    }\n    let mut max = data[0];\n    for i in 1..data.len() {\n        if data[i] >                

ब्लॉग

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