जितना अधिक मैं विभिन्न प्रोग्रामिंग प्रतिमानों के बारे में सीखता हूं, जैसे कि कार्यात्मक प्रोग्रामिंग, जितना अधिक मैं विरासत और बहुरूपता जैसे ओओपी अवधारणाओं के ज्ञान पर सवाल उठाना शुरू करता हूं। मुझे पहली बार स्कूल में विरासत और बहुरूपता के बारे में पता चला, और उस समय बहुरूपता जेनेरिक कोड लिखने के लिए एक शानदार तरीका लग रहा था जो आसान तन्मयता के लिए अनुमति देता था।
लेकिन बतख टाइपिंग (गतिशील और स्थिर दोनों) और उच्च-कार्य कार्यों जैसे कार्यात्मक सुविधाओं के चेहरे में, मैंने वस्तुओं के बीच संबंधों के नाजुक सेट के आधार पर अनावश्यक प्रतिबंध लगाने के रूप में विरासत और बहुरूपता को देखना शुरू कर दिया है। बहुरूपता के पीछे सामान्य विचार यह है कि आप एक बार एक फ़ंक्शन लिखते हैं, और बाद में आप मूल फ़ंक्शन को बदलने के बिना अपने प्रोग्राम में नई कार्यक्षमता जोड़ सकते हैं - आपको केवल एक और व्युत्पन्न वर्ग बनाना होगा जो आवश्यक विधियों को लागू करता है।
लेकिन यह बतख टाइपिंग के माध्यम से प्राप्त करने के लिए बहुत सरल है, चाहे वह पायथन जैसी गतिशील भाषा में हो, या सी ++ जैसी स्थिर भाषा हो।
एक उदाहरण के रूप में, निम्नलिखित पायथन फ़ंक्शन पर विचार करें, इसके बाद इसका स्थैतिक C ++ समतुल्य है:
def foo(obj):
obj.doSomething()
template <class Obj>
void foo(Obj& obj)
{
obj.doSomething();
}
OOP समतुल्य कुछ निम्न जावा कोड की तरह होगा:
public void foo(DoSomethingable obj)
{
obj.doSomething();
}
बेशक, अंतर यह है कि जावा संस्करण को काम करने से पहले एक इंटरफ़ेस या एक वंशानुक्रम पदानुक्रम के निर्माण की आवश्यकता होती है। इस प्रकार जावा संस्करण में अधिक काम शामिल है, और यह कम लचीला है। इसके अतिरिक्त, मुझे लगता है कि अधिकांश वास्तविक-विश्व विरासत पदानुक्रम कुछ अस्थिर हैं। हम सभी ने आकृतियाँ और जानवरों के वंचित उदाहरणों को देखा है, लेकिन वास्तविक दुनिया में, जैसे-जैसे व्यवसाय की आवश्यकताएं बदलती हैं और नई सुविधाएँ जुड़ती जाती हैं, आपको वास्तव में "is-a" के बीच संबंध बढ़ाने की आवश्यकता होने से पहले कोई भी काम करना मुश्किल है। उप-वर्ग, या फिर अपनी आवश्यकताओं को समायोजित करने के लिए आगे के आधार-वर्गों या इंटरफेस को शामिल करने के लिए अपने पदानुक्रम को फिर से तैयार / रीफ़्रैक्टर करें। बतख टाइपिंग के साथ, आपको कुछ भी मॉडलिंग करने की चिंता करने की ज़रूरत नहीं है - आपको बस उस कार्यक्षमता की चिंता है जो आपको चाहिए।
फिर भी, विरासत और बहुरूपता इतनी लोकप्रिय हैं कि मुझे संदेह है कि उन्हें अतिशयोक्ति और कोड के पुन: उपयोग के लिए प्रमुख रणनीति कहना अतिशयोक्ति होगी। तो विरासत और बहुरूपता इतनी बेतहाशा सफल क्यों हैं? क्या मैं कुछ गंभीर लाभों की अनदेखी कर रहा हूं, जो वंशानुक्रम / बहुरूपता पर टंकण से अधिक है?
obj
कोईdoSomething
विधि नहीं है तो क्या होगा ? क्या कोई अपवाद उठाया गया है? क्या कुछ नहीं होता है?