Rust में SOLID सिद्धांत: सिद्धांत और व्यवहार

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

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

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

परिचय: Rust डेवलपर्स के लिए SOLID क्यों महत्वपूर्ण है



SOLID — ऑब्जेक्ट-ओरिएंटेड डिज़ाइन के पाँच मूलभूत सिद्धांत हैं जो लचीला, रखरखाव योग्य और स्केलेबल कोड बनाने में मदद करते हैं। इस तथ्य के बावजूद कि Rust एक क्लासिक OOP भाषा नहीं है, ये सिद्धांत trait, स्वामित्व और सामान्यीकरण प्रणाली के कारण पूरी तरह से लागू होते हैं। इस लेख में, हम Rust पर व्यावहारिक उदाहरणों के साथ SOLID के प्रत्येक सिद्धांत का विश्लेषण करेंगे।



आप सीखेंगे कि कैसे:

  • डीकंपोज़िशन के माध्यम से "दिव्य" संरचनाओं से बचें
  • traits के माध्यम से विस्तार योग्य सिस्टम डिज़ाइन करें
  • विरासत के बिना पॉलीमॉर्फिज़्म का प्रभावी ढंग से उपयोग करें
  • इंटरफ़ेस को अलग करें और निर्भरताएँ इंजेक्ट करें


1. Single Responsibility Principle (SRP) — एकल उत्तरदायित्व का सिद्धांत



SRP कहता है: "एक संरचना या मॉड्यूल में बदलाव का केवल एक ही कारण होना चाहिए"। Rust में, इसका अर्थ है कि प्रत्येक प्रकार को एक स्पष्ट रूप से परिभाषित कार्य के लिए जिम्मेदार होना चाहिए।



SRP का उल्लंघन: "दिव्य" संरचना



struct Report {    data: Vec<String>,}

impl Report { fn generate(&self) -> String { self.data.join(", ") }

fn save_to_file(&self, path: &str) -> std::io::Result<()> { let content = self.generate(); std::fs::write(path, content) }

fn send_email(&self, recipient: &str) { // ईमेल भेजने का तर्क println!("{} रिपोर्ट {} को भेजी जा रही है", self.generate(), recipient); }}


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



SRP के साथ सही कार्यान्वयन



struct Report {    data: Vec<String>,}

impl Report { fn new(data: Vec<String>) -> Self { Self { data } }

fn generate(&self) -> String { self.data.join(", ") }}

struct FileSaver;

impl FileSaver { fn save(report: &Report, path: &str) -> std::io::Result<()> { std::fs::write(path, report.generate()) }}

struct EmailSender;

impl EmailSender { fn send(report: &Report, recipient: &str) { println!("{} रिपोर्ट {} को भेजी जा रही है", report.generate(), recipient); }}


अब प्रत्येक संरचना की एक जिम्मेदारी है: Report — जनरेशन, FileSaver — सहेजना, EmailSender — भेजना। इससे कोड का परीक्षण और संशोधन सरल हो जाता है।



2. Open/Closed Principle (OCP) — खुले/बंद का सिद्धांत



OCP कहता है: "क्लासेस को विस्तार के लिए खुला, लेकिन संशोधन के लिए बंद होना चाहिए"। Rust में, यह trait और सामान्यीकरण के माध्यम से प्राप्त किया जाता है।



उदाहरण: भुगतान प्रसंस्करण प्रणाली



trait PaymentProcessor {    fn process(&self, amount: f64) -> String;}

struct CreditCardProcessor;

impl PaymentProcessor for CreditCardProcessor { fn process(&self, amount: f64) -> String { format!("क्रेडिट कार्ड के माध्यम से {} की प्रक्रिया", amount) }}

struct PayPalProcessor;

impl PaymentProcessor for PayPalProcessor { fn process(&self, amount: f64) -> String { format!("PayPal के माध्यम से {} की प्रक्रिया", amount) }}

struct PaymentHandler<T: PaymentProcessor> { processor: T,}

impl<T: PaymentProcessor> PaymentHandler<T> { fn execute(&self, amount: f64) -> String { self.processor.process(amount) }}


भुगतान का एक नया तरीका जोड़ना (जैसे, CryptoProcessor) मौजूदा कोड में बदलाव की आवश्यकता नहीं है — बस PaymentProcessor trait को लागू करना पर्याप्त है।



ब्लॉग

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