Kotlin में SOLID सिद्धांत: सिद्धांत और व्यवहार A से Z तक

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

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

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

परिचय: Kotlin में SOLID क्यों महत्वपूर्ण है?

\n\n

SOLID — रॉबर्ट मार्टिन (अंकल बॉब) द्वारा प्रतिपादित ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के पाँच मूलभूत सिद्धांतों का संक्षिप्त नाम है। Kotlin पारिस्थितिकी तंत्र में, जो ऑब्जेक्ट-ओरिएंटेड और फंक्शनल प्रोग्रामिंग की सर्वोत्तम विशेषताओं को जोड़ता है, SOLID सिद्धांतों का पालन लचीला, परीक्षण योग्य और रखरखाव योग्य कोड बनाने में मदद करता है। ये सिद्धांत विशेष रूप से Android विकास, Ktor पर सर्वर एप्लिकेशन और कोरूटीन पर मल्टीथ्रेडेड सिस्टम के लिए प्रासंगिक हैं।

\n\n

इस लेख में, हम Kotlin मुहावरों के अनुकूल उदाहरणों के साथ SOLID के पाँचों सिद्धांतों में से प्रत्येक पर चर्चा करेंगे। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें और कोड को केवल काम करने वाला नहीं, बल्कि वास्तव में गुणवत्तापूर्ण कैसे बनाएं।

\n\n

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

\n\n

सिद्धांत का सार

\n

एक वर्ग में बदलाव का केवल एक ही कारण होना चाहिए। दूसरे शब्दों में, प्रत्येक वर्ग ठीक एक कार्यक्षमता के लिए जिम्मेदार होता है।

\n\n

खराब उदाहरण (SRP का उल्लंघन)

\n
class UserManager {\n    fun createUser(name: String, email: String) { /* ... */ }\n    fun deleteUser(id: Int) { /* ... */ }\n    fun sendEmail(to: String, subject: String) { /* ... */ }\n    fun generateReport(userId: Int): String { /* ... */ }\n}
\n

यहाँ UserManager उपयोगकर्ता प्रबंधन, ईमेल भेजने और रिपोर्ट तैयार करने दोनों के लिए जिम्मेदार है। ईमेल तर्क में बदलाव इस वर्ग में बदलाव लाएगा, हालाँकि इसे मेल से कोई सरोकार नहीं होना चाहिए।

\n\n

अच्छा उदाहरण (SRP का पालन)

\n
class UserRepository {\n    fun createUser(name: String, email: String) { /* ... */ }\n    fun deleteUser(id: Int) { /* ... */ }\n}\n\nclass EmailService {\n    fun sendEmail(to: String, subject: String) { /* ... */ }\n}\n\nclass ReportGenerator {\n    fun generateReport(userId: Int): String { /* ... */ }\n}
\n

अब प्रत्येक वर्ग के पास बदलाव का एक ही कारण है। इससे कोड का परीक्षण और रखरखाव सरल हो जाता है।

\n\n

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

\n\n

सिद्धांत का सार

\n

सॉफ्टवेयर संस्थाएँ (वर्ग, मॉड्यूल, फ़ंक्शन) विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद होनी चाहिए। इसका मतलब है कि नया व्यवहार मौजूदा कोड को बदलने के बजाय इनहेरिटेंस या कम्पोज़िशन के माध्यम से जोड़ा जाता है।

\n\n

खराब उदाहरण (OCP का उल्लंघन)

\n
class PaymentProcessor {\n    fun process(paymentType: String) {\n        when (paymentType) {\n            "credit_card" -> // क्रेडिट कार्ड प्रसंस्करण\n            "paypal" -> // PayPal प्रसंस्करण\n            else -> throw IllegalArgumentException()\n        }\n    }\n}
\n

भुगतान का एक नया तरीका (जैसे Apple Pay) जोड़ने पर PaymentProcessor को संशोधित करना होगा, जो OCP का उल्लंघन करता है।

\n\n

अच्छा उदाहरण (OCP का पालन)

\n
interface PaymentMethod {\n    fun process(amount: Double)\n}\n\nclass CreditCardPayment : PaymentMethod {\n    override fun process(amount: Double) { /* ... */ }\n}\n\nclass PayPalPayment : PaymentMethod {\n    override fun process(amount: Double) { /* ... */ }\n}\n\nclass PaymentProcessor(private val method: PaymentMethod) {\n    fun processPayment(amount: Double) {\n        method.process(amount)\n    }\n}
\n

अब भुगतान का एक नया तरीका जोड़ने के लिए, मौजूदा कोड को छुए बिना PaymentMethod को लागू करने वाला एक वर्ग बनाना पर्याप्त है।

\n\n

3. Liskov Substitution Principle (LSP) — बारबरा लिस्कोव का प्रतिस्थापन सिद्धांत

\n\n

सिद्धांत का सार

\n

प्रोग्राम में ऑब्जेक्ट को उनके उपप्रकारों के उदाहरणों द्वारा प्रतिस्थापित किया जाना चाहिए, बिना प्रोग्राम की शुद्धता को बदले। सीधे शब्दों में कहें तो, यदि आपके पास Bird वर्ग और Penguin उपवर्ग है, तो Bird के साथ काम करने वाला कोड Penguin को प्रतिस्थापित करने पर टूटना नहीं चाहिए।

\n\n

खराब उदाहरण (LSP का उल्लंघन)

\n
open class Rectangle {\n    open var width: Int = 0\n                

ब्लॉग

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