कार्यात्मक प्रोग्रामिंग से जुड़े भेदभाव क्यों हैं?


30

OO प्रोग्रामिंग के कई वर्षों में मैंने समझा है कि भेदभाव करने वाले संघ क्या हैं, लेकिन मैं वास्तव में उन्हें कभी याद नहीं करता। मैं हाल ही में सी # में कुछ कार्यात्मक प्रोग्रामिंग कर रहा हूं और अब मुझे लगता है कि मैं चाहता हूं कि मैं उनके पास रहूं। यह मुझे चकित कर रहा है क्योंकि इसके चेहरे पर, भेदभाव वाली यूनियनों की अवधारणा कार्यात्मक / ओओ डायकोटॉमी से काफी स्वतंत्र लगती है।

क्या कार्यात्मक प्रोग्रामिंग में कुछ निहित है जो भेदभाव रहित यूनियनों को ओओ में अधिक उपयोगी बनाता है, या क्या यह है कि खुद को "बेहतर" तरीके से समस्या का विश्लेषण करने के लिए मजबूर करके, मैंने बस अपने मानकों का इस्तेमाल किया है और अब एक बेहतर मांग करता है आदर्श?


अभिव्यक्ति की समस्या en.wikipedia.org/wiki/Expression_problem प्रासंगिक हो सकती है
xji

यह वास्तव में सवाल का उचित जवाब नहीं है, इसलिए मैं इसके बजाय एक टिप्पणी के रूप में जवाब दूंगा, लेकिन सीलोन प्रोग्रामिंग भाषा में एक संघ प्रकार होते हैं और वे अन्य ओओ / मिश्रित प्रतिमान भाषाओं में टाइपिंग कर रहे हैं - टाइपस्क्रिप्ट और स्काला मेरे दिमाग में आते हैं। इसके अलावा जावा भाषा के एनमों का इस्तेमाल भेदभाव रहित संघों के कार्यान्वयन के रूप में किया जा सकता है।
रोलैंड टीप

जवाबों:


45

विभेदित संघ वास्तव में पैटर्न-मिलान के साथ चमकता है, जहां आप मामलों के आधार पर विभिन्न व्यवहार का चयन करते हैं। लेकिन यह पैटर्न मूल रूप से शुद्ध OO सिद्धांतों के प्रतिपक्षीय है।

शुद्ध OO में, व्यवहार में अंतर को स्वयं (एनकैप्सुलेटेड) प्रकारों (वस्तुओं) द्वारा परिभाषित किया जाना चाहिए। तो पैटर्न मिलान के लिए समतुल्य वस्तु पर एक ही विधि को कॉल करना होगा, जो तब अलग-अलग व्यवहार को परिभाषित करने के लिए उप-प्रकारों द्वारा अतिभारित होता है। बाहर से किसी वस्तु के प्रकार का निरीक्षण करना (जो पैटर्न मिलान करता है) को एक एंटीपैटर्न माना जाता है।

मूलभूत अंतर यह है कि कार्यात्मक प्रोग्रामिंग में डेटा और व्यवहार अलग-अलग होते हैं, जबकि डेटा और व्यवहार OO में एक साथ एनकैप्सुलेट किए जाते हैं।

यह ऐतिहासिक कारण है। C # जैसी भाषा एक क्लासिक OO भाषा से बहु-प्रतिमान भाषा को अधिक से अधिक फ़ंक्शन विशेषताओं को शामिल करके विकसित कर रही है।


6
भेदभावपूर्ण संघ / योग प्रकार एक वंशानुक्रम वृक्ष या एक इंटरफ़ेस को लागू करने वाले कई वर्गों की तरह नहीं है; यह कई प्रकार के मूल्यों के साथ एक प्रकार है। वे इनकैप्सुलेशन को भी नहीं रोकते हैं; क्लाइंट को यह जानने की आवश्यकता नहीं है कि आपके पास कई प्रकार के मूल्य हैं। एक लिंक की गई सूची पर विचार करें, जो या तो एक खाली नोड हो सकती है, या दूसरे नोड के लिए एक मान और एक संदर्भ हो सकता है। योग प्रकार के बिना, आप मान और संदर्भ के लिए चर होने से एक विभेदित संघ वैसे भी एक साथ हैकिंग समाप्त करते हैं, लेकिन किसी ऑब्जेक्ट को शून्य संदर्भ के साथ खाली नोड के रूप में मानते हैं और मान चर का अस्तित्व मौजूद नहीं है।
डोभाल

2
सामान्य तौर पर, आप एक वर्ग में सभी संभावित प्रकार के मूल्यों के लिए चर सहित अंत करते हैं, साथ ही किसी प्रकार का झंडा या एनम आपको यह बताने के लिए है कि उस प्रकार का मूल्य क्या है, और चर के आसपास नाचते हैं जो इसके अनुरूप नहीं हैं मेहरबान।
डोभाल

7
@ डोवल में एक बीजीय डेटा प्रकार का "मानक" एन्कोडिंग है, जिसमें एक इंटरफ़ेस / एब्सट्रैक्ट बेस क्लास होता है, जो कुल मिलाकर टाइप का प्रतिनिधित्व करता है और टाइप के प्रत्येक मामले के लिए एक उपवर्ग होता है। पैटर्न मिलान से निपटने के लिए, आपके पास एक तरीका है जो प्रत्येक मामले के लिए एक फ़ंक्शन लेता है, इसलिए एक सूची के लिए आपके पास शीर्ष-स्तरीय इंटरफ़ेस, List<A>विधि होगी B Match<B>(B nil, Func<A,List<A>,B> cons)। उदाहरण के लिए, यह बिल्कुल पैटर्न है जो स्मॉलटाक बुलियन के लिए उपयोग करता है। यह भी मूल रूप से है कि स्काला इसे कैसे संभालती है। कई वर्गों का उपयोग किया जाता है एक कार्यान्वयन विवरण है जिसे उजागर नहीं किया जाना चाहिए।
डेरेक एल्किंस

3
@ डोवाल: स्पष्ट रूप से अशक्त संदर्भों के लिए जाँच वास्तव में मुहावरेदार OO नहीं माना जाता है।
जैक्सबी

@JacquesB अशक्त जाँच कार्यान्वयन विस्तार है। लिंक की गई सूची के ग्राहक के लिए आमतौर पर एक isEmptyविधि होती है जो यह जांचती है कि अगले नोड का संदर्भ शून्य है या नहीं।
डोभाल

35

कार्यात्मक प्रोग्रामिंग सीखने से पहले पास्कल और एडीए में प्रोग्राम किए जाने के बाद, मैं कार्यात्मक प्रोग्रामिंग के साथ भेदभाव नहीं करता।

भेदभाव रहित यूनियनें किसी तरह विरासत की दोहरी हैं। पहला आसानी से प्रकारों के एक निश्चित सेट पर परिचालन को जोड़ने की अनुमति देता है (संघ में उन), और उत्तराधिकार आसानी से संचालन के एक निश्चित सेट के साथ प्रकार को जोड़ने की अनुमति देता है। (दोनों को आसानी से कैसे जोड़ा जाए, इसे अभिव्यक्ति समस्या कहा जाता है ; यह एक स्थिर प्रकार की प्रणाली वाली भाषाओं के लिए विशेष रूप से कठिन समस्या है।)

प्रकारों पर OO के जोर के कारण, और फ़ंक्शंस पर फ़ंक्शनल प्रोग्रामिंग के दोहरे ज़ोर के कारण, फ़ंक्शनल प्रोग्रामिंग लैंग्वेज में यूनियन प्रकारों के लिए एक प्राकृतिक संबंध है और उनके उपयोग को आसान बनाने के लिए वाक्यात्मक संरचनाएं प्रदान करता है।


7

इम्पीरियल प्रोग्रामिंग तकनीक, जैसा कि अक्सर ओओ में उपयोग किया जाता है, अक्सर दो पैटर्न पर भरोसा करते हैं:

  1. सफल या अपवाद फेंक,
  2. null"कोई मूल्य नहीं" या विफलता का संकेत करने के लिए वापस लौटें ।

कार्यात्मक प्रतिमान आम तौर पर इन दोनों से बचता है, एक यौगिक प्रकार को वापस करने के लिए पसंद करता है जो सफलता / विफलता का कारण या मूल्य / मूल्य नहीं होने का संकेत देता है।

विभक्त संघ इन यौगिक प्रकारों के लिए बिल फिट करते हैं। उदाहरण के लिए, पहले उदाहरण में, आप वापसी कर सकते हैं true, या कुछ डेटा संरचना जो विफलता का वर्णन करती है। दूसरे मामले में, एक संघ जिसमें एक मान होता है, या none, nilदूसरा मामला इतना सामान्य होता है, कि कई कार्यात्मक भाषाओं में "मान" या "विकल्प" प्रकार होता है, जो उस मूल्य / किसी भी संघ का प्रतिनिधित्व करने के लिए अंतर्निहित होता है।

उदाहरण के लिए, C # के साथ एक कार्यात्मक शैली पर स्विच करते समय, आप जल्दी से इन यौगिक प्रकारों की आवश्यकता पाएंगे। void/throwऔर nullबस ऐसे कोड के साथ सही महसूस नहीं करते। और भेदभाव वाली यूनियनें (DU) बिल को अच्छी तरह से फिट करती हैं। इस प्रकार आप अपने आप को उन्हें चाहने लगे, जैसे हममें से बहुत से लोग हैं।

अच्छी खबर यह है कि वहाँ मॉडल में बहुत सारे पुस्तकालयों हैं उदाहरण के लिए C # # (उदाहरण के लिए मेरे खुद के Succinc <T> पुस्तकालय पर एक नज़र है )।


2

मुख्य प्रकार की ओओ भाषाओं में सम प्रकार आम तौर पर कम उपयोगी होगा क्योंकि वे ओओ सबटाइपिंग के लिए एक समान प्रकार की समस्या को हल कर रहे हैं। उन्हें देखने का एक तरीका यह है कि वे दोनों सबटाइपिंग को संभालते हैं, लेकिन OO है, openयानी कोई अभिभावक प्रकार में मनमानी उपप्रकार जोड़ सकता है और योग प्रकार होते हैं, closedयानी कोई व्यक्ति यह निर्धारित करता है कि उपप्रकार क्या मान्य हैं।

अब, कई ओओ भाषाएँ अन्य अवधारणाओं जैसे विरासत में मिली संरचना, बहुरूपता, संदर्भ टाइपिंग आदि के साथ जोड़-तोड़ करती हैं, ताकि आम तौर पर उन्हें अधिक उपयोगी बनाया जा सके। एक परिणाम यह है कि वे अधिक काम करने की प्रवृत्ति रखते हैं (वर्गों और कंस्ट्रक्टरों और व्हाट्सएप के साथ) ताकि ट्रेंड Resultएस और Optionएस जैसी चीजों के लिए उपयोग नहीं किया जा सके और जब तक जेनेरिक टाइपिंग आम न हो जाए।

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

चूंकि कार्यात्मक भाषाएं खुली टाइपिंग के लिए बंद टाइपिंग को प्राथमिकता दे सकती हैं, एक संभावित कारण यह है कि वे पैटर्न मिलान को प्राथमिकता देते हैं। यह फ़ंक्शन पॉलीमोर्फिज़्म के लिए उपयोगी है, लेकिन यह बंद प्रकारों के साथ वास्तव में अच्छी तरह से काम करता है क्योंकि कंपाइलर सांख्यिकीय रूप से जांच सकता है कि मिलान सभी उपप्रकारों को कवर कर रहा है। यह भाषा को अधिक सुसंगत बना सकता है, हालांकि मुझे विश्वास नहीं है कि कोई अंतर्निहित लाभ है (मुझे गलत किया जा सकता है)।


BTW: स्काला ने विरासत को बंद कर दिया है। sealedका अर्थ है "केवल उसी संकलन इकाई में बढ़ाया जा सकता है", जो आपको डिज़ाइन समय पर उपवर्गों के सेट को बंद करने की अनुमति देता है।
जोर्ग डब्ल्यू मित्तग

-3

स्विफ्ट खुशी से विवेकशील यूनियनों का उपयोग करता है, सिवाय इसके कि उन्हें "एनम" कहते हैं। Enums स्विफ्ट में वस्तुओं की पांच मूलभूत श्रेणियों में से एक हैं, जो वर्ग, संरचना, एनम, ट्यूपल और क्लोजर हैं। स्विफ्ट अल्टरनेटिव एनम हैं जो भेदभाव रहित हैं, और वे किसी भी स्विफ्ट कोड के लिए बिल्कुल आवश्यक हैं।

तो यह आधार कि "भेदभाव रहित संघ कार्यात्मक प्रोग्रामिंग से जुड़े हैं" गलत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.