विरासत और संरचना ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (ओओपी) में दो मूलभूत अवधारणाएं हैं, लेकिन उनका उपयोग अलग-अलग तरीके से किया जाता है और उनके अलग-अलग उद्देश्य होते हैं। इस पोस्ट का उद्देश्य उन उद्देश्यों की समीक्षा करना है, और उन्हें चुनते समय कुछ बातों को ध्यान में रखना है।
जब हम अपने डिजाइनों में विरासत को लागू करने के बारे में सोचते हैं, तो हमें यह समझना होगा:
दूसरी ओर, यदि हम वस्तुओं को एक साथ बनाने के बारे में सोचते हैं:
यह सवाल कि क्या संरचना विरासत से बेहतर है या इसके विपरीत, सॉफ्टवेयर डिजाइन में एक बहस का विषय है। दोनों दृष्टिकोणों के अपने फायदे और नुकसान हैं, और चुनाव विशिष्ट परियोजना संदर्भ और आवश्यकताओं पर निर्भर करता है। यहां मैं आपको एक उदाहरण प्रस्तुत करूंगा जहां विरासत की तुलना में रचना को प्राथमिकता दी जा सकती है।
आइए जावा में एक उदाहरण देखें जो दर्शाता है कि कुछ मामलों में विरासत के लिए संरचना कैसे बेहतर हो सकती है। मान लीजिए हम एक ऑनलाइन स्टोर में ऑर्डर प्रोसेसिंग सिस्टम पर काम कर रहे हैं।
सबसे पहले, आइए किताबों और इलेक्ट्रॉनिक्स जैसे विभिन्न प्रकार के क्रय योग्य उत्पादों का प्रतिनिधित्व करने के लिए विरासत का उपयोग करने वाले दृष्टिकोण पर विचार करें:
// Clase base para productos class Producto { String nombre; double precio; Producto(String nombre, double precio) { this.nombre = nombre; this.precio = precio; } void procesarPedido() { System.out.println("Procesando pedido para " nombre); } } // Clase para productos electrónicos que hereda de Producto class ProductoElectronico extends Producto { String modelo; ProductoElectronico(String nombre, double precio, String modelo) { super(nombre, precio); this.modelo = modelo; } } // Clase para libros que hereda de Producto class Libro extends Producto { String autor; Libro(String nombre, double precio, String autor) { super(nombre, precio); this.autor = autor; } }
यह दृष्टिकोण काम करता है, लेकिन क्या होगा यदि आपको नए उत्पाद प्रकार पेश करने या कुछ उत्पाद प्रकारों के लिए विशिष्ट कार्यक्षमता जोड़ने की आवश्यकता है?
विरासत पर पूरी तरह निर्भर रहने के बजाय, हम विभिन्न प्रकार के उत्पादों को अधिक लचीले ढंग से संभालने के लिए संरचना का उपयोग कर सकते हैं:
// Clase para productos class Producto { String nombre; double precio; Producto(String nombre, double precio) { this.nombre = nombre; this.precio = precio; } void procesarPedido() { System.out.println("Procesando pedido para " nombre); } } // Clase para productos electrónicos que utiliza composición class ProductoElectronico { Producto producto; String modelo; ProductoElectronico(String nombre, double precio, String modelo) { this.producto = new Producto(nombre, precio); this.modelo = modelo; } // Puedes agregar lógica específica para productos electrónicos si es necesario void procesarPedidoEspecifico() { System.out.println("Procesando pedido específico para " producto.nombre); } } // Clase para libros que utiliza composición class Libro { Producto producto; String autor; Libro(String nombre, double precio, String autor) { this.producto = new Producto(nombre, precio); this.autor = autor; } // Puedes agregar lógica específica para libros si es necesario void procesarPedidoEspecifico() { System.out.println("Procesando pedido específico para " producto.nombre); } }
इस दृष्टिकोण में, प्रत्येक उत्पाद प्रकार में उत्पाद वर्ग का एक उदाहरण होता है, जो प्रोसेसिंग ऑर्डर के लिए सामान्य तर्क साझा करने की अनुमति देता है। इसके अतिरिक्त, प्रत्येक उत्पाद प्रकार के पास प्रोसेसस्पेसिफिकऑर्डर() जैसी विधियों का उपयोग करके अपना विशिष्ट तर्क हो सकता है। यह डिज़ाइन अधिक लचीला है और वंशानुक्रम पदानुक्रम को प्रभावित किए बिना नए उत्पाद प्रकारों को पेश करना या प्रकार-विशिष्ट तर्क को संशोधित करना आसान बनाता है।
हालांकि सॉफ़्टवेयर डिज़ाइन में वंशानुक्रम और संरचना के बीच का चुनाव उस समस्या के संदर्भ और विशिष्ट आवश्यकताओं पर निर्भर करता है जिसे आप संबोधित कर रहे हैं। यहां कुछ स्थितियां हैं जहां आप विरासत को संरचना की तुलना में अधिक उपयुक्त विकल्प मान सकते हैं:
class Vehiculo { // ... } class Automovil extends Vehiculo { // ... }
class Animal { void comer() { // Lógica común para comer } } class Perro extends Animal { void ladrar() { // Lógica específica para ladrar } }
class Figura { void dibujar() { // Lógica común para dibujar una figura } } class Circulo extends Figura { void dibujar() { // Lógica específica para dibujar un círculo } } class Cuadrado extends Figura { void dibujar() { // Lógica específica para dibujar un cuadrado } }
यदि हम विरासत के पेशेवरों और विपक्षों का मूल्यांकन करना जारी रखते हैं, तो खराब विरासत से उत्पन्न होने वाली समस्याओं में से एक यह है कि हम इंटरफ़ेस पृथक्करण सिद्धांत का उल्लंघन करेंगे, जिसमें कहा गया है कि ग्राहकों को उन इंटरफेस पर निर्भर होने के लिए मजबूर नहीं किया जाना चाहिए जो वे करते हैं। का उपयोग नहीं। यदि एक इंटरफ़ेस को ऐसे तरीके से विस्तारित किया जाता है जिसमें ऐसी विधियां शामिल होती हैं जो सभी कार्यान्वयन के लिए प्रासंगिक नहीं होती हैं, तो उस इंटरफ़ेस का उपयोग करने वाले ग्राहकों को उन तरीकों को लागू करने या उन पर निर्भर होने के लिए मजबूर किया जा सकता है जिनकी उन्हें आवश्यकता नहीं है, जिससे कम साफ और अधिक कठिन डिज़ाइन हो सकता है बनाए रखना।
संक्षेप में, वंशानुक्रम "एक है" संबंध पर केंद्रित है और इसका उपयोग वर्ग पदानुक्रमों को मॉडल करने के लिए किया जाता है, जबकि रचना "एक है" संबंध पर केंद्रित है और इसका उपयोग अन्य सरल वस्तुओं से जटिल वस्तुओं के निर्माण के लिए किया जाता है। दोनों दृष्टिकोणों के अपने विशिष्ट उपयोग के मामले हैं और इन्हें सॉफ़्टवेयर डिज़ाइन में संबंधों की संरचना और प्रकृति के आधार पर चुना जाता है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3