Kotlin में Builder सिर्फ Java से "कॉपी-पेस्ट" क्यों नहीं है?
\n\nयदि आपने कभी Java में लिखा है, तो आप निश्चित रूप से क्लासिक Builder पैटर्न से परिचित होंगे। कोड की दर्जनों पंक्तियाँ, आंतरिक स्थैतिक क्लास, set विधियाँ और अंतिम build()। यह सब काम करता है, लेकिन बोझिल लगता है।
अब कल्पना करें कि आप Kotlin पर आ गए हैं। एक ऐसी भाषा जिसे संक्षिप्त और अभिव्यंजक बनाने के लिए बनाया गया था। और यहाँ आप एक ऐसे कार्य का सामना करते हैं: कई मापदंडों वाली एक वस्तु बनानी है, जिनमें से कुछ वैकल्पिक हैं। आपका हाथ Java से क्लासिक Builder लिखने के लिए बढ़ता है...
\n\nरुकिए! Kotlin में इस पैटर्न को 10 गुना आसान, अधिक सुरुचिपूर्ण और सुरक्षित तरीके से लागू किया जा सकता है। इस लेख में, हम Kotlin में Builder पैटर्न को लागू करने के 4 तरीकों पर चर्चा करेंगे - सबसे सरल से लेकर उन्नत DSL दृष्टिकोण तक।
\n\nयह सामग्री Stack Overflow के एक वास्तविक प्रश्न पर आधारित है, जिसे हज़ारों बार देखा गया है। हमने इसे शैक्षिक सामग्री के लिए अनुकूलित किया है ताकि आप तुरंत ज्ञान को व्यवहार में लागू कर सकें।
\n\nसमस्या: Builder की आवश्यकता कब होती है?
\n\nकल्पना करें कि आपके पास एक क्लास Pizza है:
class Pizza(\n val size: String,\n val cheese: Boolean = false,\n val pepperoni: Boolean = false,\n val mushrooms: Boolean = false,\n val olives: Boolean = false,\n val extraCheese: Boolean = false\n)\n\nयह ठीक लगता है। लेकिन जब आप 5 वैकल्पिक मापदंडों वाली पिज़्ज़ा बनाते हैं, तो कोड अपठनीय हो जाता है:
\n\nval pizza = Pizza("Large", true, false, true, false, true)\n\nआँखों से यह देखना कि कौन सा पैरामीटर क्या दर्शाता है, कष्टदायक है। यहाँ Builder पैटर्न मदद करता है।
\n\nतरीका 1. क्लासिक Java-शैली Builder (संगतता के लिए)
\n\nयदि आपको Java कोड का समर्थन करना है या आप अत्यधिक स्पष्ट API चाहते हैं, तो आप क्लासिक दृष्टिकोण का उपयोग कर सकते हैं:
\n\nclass Pizza private constructor(\n val size: String,\n val cheese: Boolean,\n val pepperoni: Boolean,\n val mushrooms: Boolean,\n val olives: Boolean,\n val extraCheese: Boolean\n) {\n class Builder(private val size: String) {\n private var cheese: Boolean = false\n private var pepperoni: Boolean = false\n private var mushrooms: Boolean = false\n private var olives: Boolean = false\n private var extraCheese: Boolean = false\n\n fun cheese(value: Boolean) = apply { cheese = value }\n fun pepperoni(value: Boolean) = apply { pepperoni = value }\n fun mushrooms(value: Boolean) = apply { mushrooms = value }\n fun olives(value: Boolean) = apply { olives = value }\n fun extraCheese(value: Boolean) = apply { extraCheese = value }\n\n fun build() = Pizza(size, cheese, pepperoni, mushrooms, olives, extraCheese)\n }\n}\n\n// उपयोग:\nval pizza = Pizza.Builder("Large")\n .cheese(true)\n .pepperoni(true)\n .mushrooms(true)\n .build()\n\nलाभ: स्पष्ट कोड, Java डेवलपर्स के लिए समझने योग्य।
\nनुकसान: बहुत सारा boilerplate कोड, Kotlin की क्षमताओं का उपयोग नहीं करता।
तरीका 2. नामित तर्कों और डिफ़ॉल्ट मानों के साथ Kotlin शैली
\n\nसबसे सरल और अक्सर सबसे अच्छा तरीका है Builder का बिल्कुल उपयोग न करना, बल्कि भाषा की क्षमताओं पर भरोसा करना:
\n\ndata class Pizza(\n val size: String,\n val cheese: Boolean = false,\n val pepperoni: Boolean = false,\n val mushrooms: Boolean = false,\n val olives: Boolean = false,\n val extraCheese: Boolean = false\n)\n\n// उपयोग:\nval pizza = Pizza(\n size = "Large",\n cheese = true,\n pepperoni = true,\n mushrooms = true\n)\n\nयह स्वच्छ, पढ़ने योग्य और टाइप-सुरक्षित कोड है। Kotlin के नामित तर्क "जादुई संख्याओं" और मापदंडों के क्रम की समस्या को हल करते हैं।
\n\n