आपके द्वारा उद्धृत ब्लॉग पोस्ट इसके दावे को थोड़ा बढ़ा देता है। एफपी डिजाइन पैटर्न की आवश्यकता को समाप्त नहीं करता है । शब्द "डिजाइन पैटर्न" का उपयोग केवल एफपी भाषाओं में एक ही बात का वर्णन करने के लिए नहीं किया जाता है। लेकिन वे मौजूद हैं। कार्यात्मक भाषाओं में फॉर्म के सर्वोत्तम अभ्यास नियम हैं "जब आप समस्या एक्स का सामना करते हैं, तो कोड का उपयोग करें जो वाई की तरह दिखता है", जो मूल रूप से एक डिजाइन पैटर्न है।
हालांकि, यह सही है कि अधिकांश ओओपी-विशिष्ट डिज़ाइन पैटर्न कार्यात्मक भाषाओं में बहुत अधिक अप्रासंगिक हैं।
मुझे नहीं लगता कि यह विशेष रूप से कहना है कि डिजाइन पैटर्न विवादास्पद होना चाहिए है सामान्य रूप में केवल भाषा में कमियों अप पैच करने के लिए मौजूद हैं। और यदि दूसरी भाषा तुच्छता से एक ही समस्या को हल कर सकती है, तो दूसरी भाषा को इसके लिए एक डिज़ाइन पैटर्न की आवश्यकता नहीं होगी। हो सकता है कि उस भाषा के उपयोगकर्ता यह भी न जानते हों कि समस्या मौजूद है , क्योंकि, ठीक है, यह उस भाषा की समस्या नहीं है।
इस मुद्दे पर चार गैंग का क्या कहना है:
प्रोग्रामिंग भाषा का चुनाव महत्वपूर्ण है क्योंकि यह किसी के दृष्टिकोण को प्रभावित करता है। हमारे पैटर्न स्मॉलटॉक / सी ++ - स्तरीय भाषा सुविधाओं को मानते हैं, और यह पसंद निर्धारित करती है कि क्या आसानी से लागू नहीं किया जा सकता है। यदि हमने प्रक्रियात्मक भाषाएं ग्रहण की हैं, तो हमने "वंशानुक्रम", "एनकैप्सुलेशन," और "बहुरूपता" नामक डिज़ाइन पैटर्न शामिल किए हैं। इसी तरह, हमारे कुछ पैटर्न सीधे कम सामान्य ऑब्जेक्ट-ओरिएंटेड भाषाओं द्वारा समर्थित हैं। CLOS में बहु-विधियाँ हैं, उदाहरण के लिए, जो विज़िटर जैसे पैटर्न की आवश्यकता को कम करता है। वास्तव में, स्मालटाक और सी ++ के बीच पर्याप्त अंतर हैं इसका मतलब यह है कि कुछ पैटर्न को एक भाषा में दूसरे की तुलना में अधिक आसानी से व्यक्त किया जा सकता है। (उदाहरण के लिए इटरेटर देखें।)
(उपरोक्त डिजाइन पैटर्न पुस्तक के परिचय से एक उद्धरण है, पृष्ठ 4, पैराग्राफ 3)
फ़ंक्शनल प्रोग्रामिंग की मुख्य विशेषताओं में फ़र्स्ट-क्लास वैल्यू, करी, अपरिवर्तनीय मान आदि जैसे फ़ंक्शंस शामिल हैं। मुझे यह स्पष्ट नहीं लगता है कि OO डिज़ाइन पैटर्न उन विशेषताओं में से किसी को भी अनुमानित कर रहे हैं।
यदि प्रथम श्रेणी के कार्यों का अनुमान नहीं है, तो कमांड पैटर्न क्या है? :) एक FP भाषा में, आप किसी फ़ंक्शन को दूसरे फ़ंक्शन के तर्क के रूप में पास करेंगे। एक ओओपी भाषा में, आपको एक कक्षा में फ़ंक्शन को लपेटना होगा, जिसे आप तुरंत कर सकते हैं और फिर उस ऑब्जेक्ट को दूसरे फ़ंक्शन में पास कर सकते हैं। प्रभाव समान है, लेकिन ओओपी में इसे एक डिजाइन पैटर्न कहा जाता है, और यह पूरी तरह से अधिक कोड लेता है। और अगर करी नहीं तो अमूर्त कारखाना पैटर्न क्या है? एक समय में एक फ़ंक्शन के लिए मापदंडों को पास करें, यह कॉन्फ़िगर करने के लिए कि जब आप अंततः इसे कहते हैं, तो यह किस प्रकार का मूल्य है।
तो हाँ, कई गोफ़ डिज़ाइन पैटर्न एफपी भाषाओं में निरर्थक हैं, क्योंकि अधिक शक्तिशाली और आसान विकल्प मौजूद हैं।
लेकिन निश्चित रूप से अभी भी डिजाइन पैटर्न हैं जो एफपी भाषाओं द्वारा हल नहीं किए जाते हैं। एफपी एक सिंगलटन के बराबर क्या है? (एक पल के लिए अवहेलना करना कि सिंगलटन आमतौर पर उपयोग करने के लिए एक भयानक पैटर्न हैं।)
और यह दोनों तरीकों से भी काम करता है। जैसा कि मैंने कहा, एफपी के अपने डिजाइन पैटर्न भी हैं; लोग आमतौर पर उनके बारे में ऐसा नहीं सोचते हैं।
लेकिन हो सकता है कि आप भिक्षुओं के पार चले गए हों। यदि वे "वैश्विक स्थिति से निपटने" के लिए एक डिज़ाइन पैटर्न नहीं हैं, तो वे क्या हैं? यह एक समस्या है जो OOP भाषाओं में इतनी सरल है कि कोई समान डिज़ाइन पैटर्न वहां मौजूद नहीं है।
हमें "एक स्थैतिक चर बढ़ाने", या "उस सॉकेट से पढ़ा गया" के लिए एक डिज़ाइन पैटर्न की आवश्यकता नहीं है, क्योंकि यह सिर्फ आप क्या करते हैं ।
मानद कहना एक डिज़ाइन पैटर्न है, यह उतना ही बेतुका है जितना कि इंटेगर अपने सामान्य ऑपरेशन के साथ कहते हैं और शून्य तत्व एक डिज़ाइन पैटर्न है। नहीं, एक मठ एक गणितीय पैटर्न है , न कि एक डिज़ाइन पैटर्न।
(शुद्ध) कार्यात्मक भाषाओं में, साइड इफेक्ट्स और उत्परिवर्तनीय स्थिति असंभव है, जब तक कि आप मोनड "डिज़ाइन पैटर्न", या किसी अन्य विधि के साथ काम नहीं करते हैं।
इसके अतिरिक्त, कार्यात्मक भाषाओं में जो OOP (जैसे F # और OCaml) का समर्थन करते हैं, मुझे यह स्पष्ट प्रतीत होता है कि इन भाषाओं का उपयोग करने वाले प्रोग्रामर हर दूसरी OOP भाषा में उपलब्ध समान डिज़ाइन पैटर्न का उपयोग करेंगे। वास्तव में, अभी मैं हर रोज F # और OCaml का उपयोग करता हूं, और जब मैं जावा में लिखता हूं, तो इन भाषाओं में मेरे द्वारा उपयोग किए जाने वाले पैटर्न के बीच कोई हड़ताली अंतर नहीं होता है।
शायद इसलिए कि आप अभी भी अनिवार्य रूप से सोच रहे हैं? बहुत सारे लोग, अपने पूरे जीवन में अनिवार्य भाषाओं से निपटने के बाद, एक कठिन समय उस आदत को छोड़ देते हैं जब वे एक कार्यात्मक भाषा का प्रयास करते हैं। (मैंने एफ # पर कुछ बहुत ही मजेदार प्रयास किए हैं, जहाँ सचमुच हर फ़ंक्शन 'लेट' स्टेटमेंट्स का एक स्ट्रिंग था, मूल रूप से मानो आपने सी प्रोग्राम लिया होगा, और सभी अर्धविरामों को 'लेट' से बदल दिया। :)
लेकिन एक और संभावना यह हो सकती है कि आपको एहसास ही नहीं हुआ है कि आप समस्याओं को मामूली रूप से हल कर रहे हैं जिन्हें ओओपी भाषा में डिजाइन पैटर्न की आवश्यकता होगी।
जब आप करी का उपयोग करते हैं, या किसी फ़ंक्शन को दूसरे के तर्क के रूप में पास करते हैं, तो रोकें और सोचें कि आप एक ओओपी भाषा में कैसे करेंगे।
क्या इस दावे में कोई सच्चाई है कि कार्यात्मक प्रोग्रामिंग OOP डिजाइन पैटर्न की आवश्यकता को समाप्त करता है?
हां। :) जब आप एक FP भाषा में काम करते हैं, तो आपको OOP- विशिष्ट डिज़ाइन पैटर्न की आवश्यकता नहीं होती है। लेकिन आपको अभी भी कुछ सामान्य डिजाइन पैटर्न की आवश्यकता है, जैसे कि एमवीसी या अन्य गैर-ओओपी विशिष्ट सामान, और आपको इसके बजाय कुछ नए एफपी-विशिष्ट "डिजाइन पैटर्न" की आवश्यकता है। सभी भाषाओं में उनकी कमियां हैं, और डिजाइन पैटर्न आमतौर पर हैं कि हम उनके आसपास कैसे काम करते हैं।
वैसे भी, आप "क्लीनर" एफपी भाषाओं पर अपना हाथ आज़माने में दिलचस्प लग सकते हैं, जैसे एमएल (मेरे व्यक्तिगत पसंदीदा, कम से कम सीखने के उद्देश्यों के लिए), या हास्केल , जहां आपके पास वापस आने के लिए ओओपी बैसाखी नहीं है। कुछ नए के साथ सामना किया।
जैसा कि अपेक्षित था, कुछ लोगों ने डिजाइन पैटर्न की मेरी परिभाषा पर "भाषा में कमियों को दूर करने" के रूप में आपत्ति जताई, इसलिए यहां मेरा औचित्य है:
जैसा कि पहले ही कहा गया है, अधिकांश डिज़ाइन पैटर्न एक प्रोग्रामिंग प्रतिमान या कभी-कभी एक विशिष्ट भाषा के लिए भी विशिष्ट होते हैं। अक्सर, वे उन समस्याओं को हल करते हैं जो केवल उस प्रतिमान में मौजूद हैं (एफपी के लिए भिक्षु देखें, या ओओपी के लिए अमूर्त कारखाने)।
एफपी में अमूर्त कारखाना पैटर्न क्यों नहीं है? क्योंकि जिस समस्या को हल करने की कोशिश करता है, वह वहां मौजूद नहीं है।
इसलिए, यदि OOP भाषाओं में कोई समस्या मौजूद है, जो FP भाषाओं में मौजूद नहीं है, तो स्पष्ट रूप से यह OOP भाषाओं की कमी है। समस्या को हल किया जा सकता है, लेकिन आपकी भाषा ऐसा नहीं करती है, लेकिन आपको इसके चारों ओर काम करने के लिए बॉयलरप्लेट कोड की एक गुच्छा की आवश्यकता होती है। आदर्श रूप से, हम चाहते हैं कि हमारी प्रोग्रामिंग भाषा जादुई रूप से सभी समस्याओं को दूर कर दे। कोई भी समस्या जो अभी भी है, सिद्धांत में भाषा की कमी है। ;)