क्या कार्यात्मक प्रोग्रामिंग GoF डिज़ाइन पैटर्न को प्रतिस्थापित करता है?


1046

चूँकि मैंने पिछले साल F # और OCaml सीखना शुरू किया था, इसलिए मैंने बहुत सारे लेख पढ़े हैं जो इस बात पर ज़ोर देते हैं कि डिज़ाइन पैटर्न (विशेष रूप से जावा में) अनिवार्य भाषाओं में गायब सुविधाओं के लिए वर्कअराउंड हैं। मेरे द्वारा पाया गया एक लेख काफी मजबूत दावा करता है :

गैंग ऑफ़ फोर (GoF) द्वारा डिज़ाइन किए गए अधिकांश लोगों को मैंने पढ़ा है । कोई भी स्वाभिमानी प्रोग्रामर आपको बताएगा कि पुस्तक भाषा अज्ञेय है और पैटर्न सामान्य रूप से सॉफ्टवेयर इंजीनियरिंग पर लागू होते हैं, भले ही भाषा किस भाषा का उपयोग करती हो। यह एक नेक दावा है। दुर्भाग्य से यह सच्चाई से बहुत दूर है।

कार्यात्मक भाषाएं अत्यंत अभिव्यंजक हैं। एक कार्यात्मक भाषा में किसी को डिजाइन पैटर्न की आवश्यकता नहीं होती है क्योंकि भाषा की संभावना इतनी अधिक होती है, आप उन अवधारणाओं में प्रोग्रामिंग को समाप्त कर देते हैं जो डिजाइन पैटर्न को एक साथ खत्म करते हैं।

कार्यात्मक प्रोग्रामिंग (एफपी) की मुख्य विशेषताओं में प्रथम श्रेणी के मूल्यों, करी, अपरिवर्तनीय मूल्यों आदि के रूप में कार्य शामिल हैं, यह मुझे स्पष्ट नहीं लगता है कि OO डिजाइन पैटर्न उन विशेषताओं में से किसी को भी अनुमानित कर रहे हैं।

इसके अतिरिक्त, कार्यात्मक भाषाओं में जो OOP (जैसे F # और OCaml) का समर्थन करते हैं, मुझे यह स्पष्ट प्रतीत होता है कि इन भाषाओं का उपयोग करने वाले प्रोग्रामर हर दूसरी OOP भाषा में उपलब्ध समान डिज़ाइन पैटर्न का उपयोग करेंगे। वास्तव में, अभी मैं हर दिन F # और OCaml का उपयोग करता हूं, और जब मैं जावा में लिखता हूं तो इन भाषाओं में मेरे द्वारा उपयोग किए जाने वाले पैटर्न के बीच कोई हड़ताली अंतर नहीं होता है।

क्या इस दावे में कोई सच्चाई है कि कार्यात्मक प्रोग्रामिंग OOP डिजाइन पैटर्न की आवश्यकता को समाप्त करता है? यदि हां, तो क्या आप एक विशिष्ट ओओपी डिजाइन पैटर्न और इसके कार्यात्मक समकक्ष के उदाहरण के लिए पोस्ट या लिंक कर सकते हैं?


18
आप स्टीव येज ( लेखे- .gge.blogspot.com/ 2006/ 03/… ) के लेख को देख सकते हैं
राल्फ

27
"पुस्तक भाषा अज्ञेय है और पैटर्न सामान्य रूप से सॉफ्टवेयर इंजीनियरिंग पर लागू होते हैं" - यह ध्यान दिया जाना चाहिए कि पुस्तक इस दावे से असहमत है, इस अर्थ में कि कुछ भाषाओं को डिजाइन पैटर्न जैसी कुछ चीजों को व्यक्त करने की आवश्यकता नहीं है: "हमारे पैटर्न स्मॉलटॉक / सी ++ - स्तरीय भाषा सुविधाओं को मानें, और यह विकल्प निर्धारित करता है कि क्या आसानी से लागू नहीं किया जा सकता [...] CLOS में बहु-विधियाँ हैं, उदाहरण के लिए, जो विज़िटर (पृष्ठ 331) जैसे पैटर्न की आवश्यकता को कम करता है। " (पृष्ठ 4)
गिल्डनस्टर्न

6
यह भी ध्यान रखें कि पर्याप्त उच्च स्तरीय अनिवार्य भाषाओं में कई डिज़ाइन पैटर्न आवश्यक नहीं हैं।
आर। बार्जेल

3
@ R.Barzell "पर्याप्त रूप से उच्च स्तरीय अनिवार्य भाषाएं" क्या हैं? धन्यवाद।
cibercitizen1

5
@ cibercitizen1 उच्च क्रम फ़ंक्शंस और अनाम फ़ंक्शंस के लिए समर्थन के साथ बतख-टाइप की गई भाषाएं। इन विशेषताओं से बहुत अधिक बिजली की आपूर्ति होती है जो बहुत सारे डिजाइन पैटर्न प्रदान करने के लिए थी।
आर। बारजेल

जवाबों:


1075

आपके द्वारा उद्धृत ब्लॉग पोस्ट इसके दावे को थोड़ा बढ़ा देता है। एफपी डिजाइन पैटर्न की आवश्यकता को समाप्त नहीं करता है । शब्द "डिजाइन पैटर्न" का उपयोग केवल एफपी भाषाओं में एक ही बात का वर्णन करने के लिए नहीं किया जाता है। लेकिन वे मौजूद हैं। कार्यात्मक भाषाओं में फॉर्म के सर्वोत्तम अभ्यास नियम हैं "जब आप समस्या एक्स का सामना करते हैं, तो कोड का उपयोग करें जो वाई की तरह दिखता है", जो मूल रूप से एक डिजाइन पैटर्न है।

हालांकि, यह सही है कि अधिकांश ओओपी-विशिष्ट डिज़ाइन पैटर्न कार्यात्मक भाषाओं में बहुत अधिक अप्रासंगिक हैं।

मुझे नहीं लगता कि यह विशेष रूप से कहना है कि डिजाइन पैटर्न विवादास्पद होना चाहिए है सामान्य रूप में केवल भाषा में कमियों अप पैच करने के लिए मौजूद हैं। और यदि दूसरी भाषा तुच्छता से एक ही समस्या को हल कर सकती है, तो दूसरी भाषा को इसके लिए एक डिज़ाइन पैटर्न की आवश्यकता नहीं होगी। हो सकता है कि उस भाषा के उपयोगकर्ता यह भी न जानते हों कि समस्या मौजूद है , क्योंकि, ठीक है, यह उस भाषा की समस्या नहीं है।

इस मुद्दे पर चार गैंग का क्या कहना है:

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

(उपरोक्त डिजाइन पैटर्न पुस्तक के परिचय से एक उद्धरण है, पृष्ठ 4, पैराग्राफ 3)

फ़ंक्शनल प्रोग्रामिंग की मुख्य विशेषताओं में फ़र्स्ट-क्लास वैल्यू, करी, अपरिवर्तनीय मान आदि जैसे फ़ंक्शंस शामिल हैं। मुझे यह स्पष्ट नहीं लगता है कि OO डिज़ाइन पैटर्न उन विशेषताओं में से किसी को भी अनुमानित कर रहे हैं।

यदि प्रथम श्रेणी के कार्यों का अनुमान नहीं है, तो कमांड पैटर्न क्या है? :) एक FP भाषा में, आप किसी फ़ंक्शन को दूसरे फ़ंक्शन के तर्क के रूप में पास करेंगे। एक ओओपी भाषा में, आपको एक कक्षा में फ़ंक्शन को लपेटना होगा, जिसे आप तुरंत कर सकते हैं और फिर उस ऑब्जेक्ट को दूसरे फ़ंक्शन में पास कर सकते हैं। प्रभाव समान है, लेकिन ओओपी में इसे एक डिजाइन पैटर्न कहा जाता है, और यह पूरी तरह से अधिक कोड लेता है। और अगर करी नहीं तो अमूर्त कारखाना पैटर्न क्या है? एक समय में एक फ़ंक्शन के लिए मापदंडों को पास करें, यह कॉन्फ़िगर करने के लिए कि जब आप अंततः इसे कहते हैं, तो यह किस प्रकार का मूल्य है।

तो हाँ, कई गोफ़ डिज़ाइन पैटर्न एफपी भाषाओं में निरर्थक हैं, क्योंकि अधिक शक्तिशाली और आसान विकल्प मौजूद हैं।

लेकिन निश्चित रूप से अभी भी डिजाइन पैटर्न हैं जो एफपी भाषाओं द्वारा हल नहीं किए जाते हैं। एफपी एक सिंगलटन के बराबर क्या है? (एक पल के लिए अवहेलना करना कि सिंगलटन आमतौर पर उपयोग करने के लिए एक भयानक पैटर्न हैं।)

और यह दोनों तरीकों से भी काम करता है। जैसा कि मैंने कहा, एफपी के अपने डिजाइन पैटर्न भी हैं; लोग आमतौर पर उनके बारे में ऐसा नहीं सोचते हैं।

लेकिन हो सकता है कि आप भिक्षुओं के पार चले गए हों। यदि वे "वैश्विक स्थिति से निपटने" के लिए एक डिज़ाइन पैटर्न नहीं हैं, तो वे क्या हैं? यह एक समस्या है जो OOP भाषाओं में इतनी सरल है कि कोई समान डिज़ाइन पैटर्न वहां मौजूद नहीं है।

हमें "एक स्थैतिक चर बढ़ाने", या "उस सॉकेट से पढ़ा गया" के लिए एक डिज़ाइन पैटर्न की आवश्यकता नहीं है, क्योंकि यह सिर्फ आप क्या करते हैं

मानद कहना एक डिज़ाइन पैटर्न है, यह उतना ही बेतुका है जितना कि इंटेगर अपने सामान्य ऑपरेशन के साथ कहते हैं और शून्य तत्व एक डिज़ाइन पैटर्न है। नहीं, एक मठ एक गणितीय पैटर्न है , न कि एक डिज़ाइन पैटर्न।

(शुद्ध) कार्यात्मक भाषाओं में, साइड इफेक्ट्स और उत्परिवर्तनीय स्थिति असंभव है, जब तक कि आप मोनड "डिज़ाइन पैटर्न", या किसी अन्य विधि के साथ काम नहीं करते हैं।

इसके अतिरिक्त, कार्यात्मक भाषाओं में जो OOP (जैसे F # और OCaml) का समर्थन करते हैं, मुझे यह स्पष्ट प्रतीत होता है कि इन भाषाओं का उपयोग करने वाले प्रोग्रामर हर दूसरी OOP भाषा में उपलब्ध समान डिज़ाइन पैटर्न का उपयोग करेंगे। वास्तव में, अभी मैं हर रोज F # और OCaml का उपयोग करता हूं, और जब मैं जावा में लिखता हूं, तो इन भाषाओं में मेरे द्वारा उपयोग किए जाने वाले पैटर्न के बीच कोई हड़ताली अंतर नहीं होता है।

शायद इसलिए कि आप अभी भी अनिवार्य रूप से सोच रहे हैं? बहुत सारे लोग, अपने पूरे जीवन में अनिवार्य भाषाओं से निपटने के बाद, एक कठिन समय उस आदत को छोड़ देते हैं जब वे एक कार्यात्मक भाषा का प्रयास करते हैं। (मैंने एफ # पर कुछ बहुत ही मजेदार प्रयास किए हैं, जहाँ सचमुच हर फ़ंक्शन 'लेट' स्टेटमेंट्स का एक स्ट्रिंग था, मूल रूप से मानो आपने सी प्रोग्राम लिया होगा, और सभी अर्धविरामों को 'लेट' से बदल दिया। :)

लेकिन एक और संभावना यह हो सकती है कि आपको एहसास ही नहीं हुआ है कि आप समस्याओं को मामूली रूप से हल कर रहे हैं जिन्हें ओओपी भाषा में डिजाइन पैटर्न की आवश्यकता होगी।

जब आप करी का उपयोग करते हैं, या किसी फ़ंक्शन को दूसरे के तर्क के रूप में पास करते हैं, तो रोकें और सोचें कि आप एक ओओपी भाषा में कैसे करेंगे।

क्या इस दावे में कोई सच्चाई है कि कार्यात्मक प्रोग्रामिंग OOP डिजाइन पैटर्न की आवश्यकता को समाप्त करता है?

हां। :) जब आप एक FP भाषा में काम करते हैं, तो आपको OOP- विशिष्ट डिज़ाइन पैटर्न की आवश्यकता नहीं होती है। लेकिन आपको अभी भी कुछ सामान्य डिजाइन पैटर्न की आवश्यकता है, जैसे कि एमवीसी या अन्य गैर-ओओपी विशिष्ट सामान, और आपको इसके बजाय कुछ नए एफपी-विशिष्ट "डिजाइन पैटर्न" की आवश्यकता है। सभी भाषाओं में उनकी कमियां हैं, और डिजाइन पैटर्न आमतौर पर हैं कि हम उनके आसपास कैसे काम करते हैं।

वैसे भी, आप "क्लीनर" एफपी भाषाओं पर अपना हाथ आज़माने में दिलचस्प लग सकते हैं, जैसे एमएल (मेरे व्यक्तिगत पसंदीदा, कम से कम सीखने के उद्देश्यों के लिए), या हास्केल , जहां आपके पास वापस आने के लिए ओओपी बैसाखी नहीं है। कुछ नए के साथ सामना किया।


जैसा कि अपेक्षित था, कुछ लोगों ने डिजाइन पैटर्न की मेरी परिभाषा पर "भाषा में कमियों को दूर करने" के रूप में आपत्ति जताई, इसलिए यहां मेरा औचित्य है:

जैसा कि पहले ही कहा गया है, अधिकांश डिज़ाइन पैटर्न एक प्रोग्रामिंग प्रतिमान या कभी-कभी एक विशिष्ट भाषा के लिए भी विशिष्ट होते हैं। अक्सर, वे उन समस्याओं को हल करते हैं जो केवल उस प्रतिमान में मौजूद हैं (एफपी के लिए भिक्षु देखें, या ओओपी के लिए अमूर्त कारखाने)।

एफपी में अमूर्त कारखाना पैटर्न क्यों नहीं है? क्योंकि जिस समस्या को हल करने की कोशिश करता है, वह वहां मौजूद नहीं है।

इसलिए, यदि OOP भाषाओं में कोई समस्या मौजूद है, जो FP भाषाओं में मौजूद नहीं है, तो स्पष्ट रूप से यह OOP भाषाओं की कमी है। समस्या को हल किया जा सकता है, लेकिन आपकी भाषा ऐसा नहीं करती है, लेकिन आपको इसके चारों ओर काम करने के लिए बॉयलरप्लेट कोड की एक गुच्छा की आवश्यकता होती है। आदर्श रूप से, हम चाहते हैं कि हमारी प्रोग्रामिंग भाषा जादुई रूप से सभी समस्याओं को दूर कर दे। कोई भी समस्या जो अभी भी है, सिद्धांत में भाषा की कमी है। ;)


73
डिज़ाइन पैटर्न बुनियादी समस्याओं के सामान्य समाधानों का वर्णन करते हैं। लेकिन यह भी प्रोग्रामिंग भाषाओं और प्लेटफार्मों क्या है। इसलिए आप डिज़ाइन पैटर्न का उपयोग करते हैं जब आप जिन भाषाओं और प्लेटफार्मों का उपयोग कर रहे हैं, वे पर्याप्त नहीं होते हैं।
yfeldblum

135
एस.लॉट: वे उन समस्याओं के समाधान का वर्णन करते हैं जो किसी दिए गए भाषा में मौजूद हैं, हाँ। एफपी भाषाओं में कोई कमांड डिज़ाइन पैटर्न नहीं है, क्योंकि इसे हल करने की कोशिश करने वाली समस्या मौजूद नहीं है। जिसका अर्थ है कि वे उन समस्याओं को हल करते हैं जिन्हें भाषा स्वयं हल नहीं कर सकती है। यही है, भाषा में कमियां
जलफ

38
सन्यासी एक गणितीय अवधारणा है, और आप इसे अपने वर्गीकरण के साथ बढ़ा रहे हैं। ज़रूर, आप फ़ंक्शंस, मोनॉयड्स, मोनड्स, मेट्रिसेस या अन्य गणितीय अवधारणाओं को डिज़ाइन पैटर्न के रूप में देख सकते हैं, लेकिन वे एल्गोरिदम और डेटा संरचनाओं की तरह अधिक हैं ... मौलिक अवधारणाएं, भाषा स्वतंत्र।
अलेक्जेंड्रू नेडेल्चु

41
ज़रूर, भिक्षुओं एक गणित अवधारणा है, लेकिन वे भी एक पैटर्न हैं। भिक्षुओं का "एफपी पैटर्न" मठों की गणित अवधारणा से कुछ अलग है। पूर्व एक पैटर्न है जिसका उपयोग शुद्ध एफपी भाषाओं में कुछ निश्चित "सीमाओं" के आसपास किया जाता है। उत्तरार्द्ध एक सार्वभौमिक गणितीय अवधारणा है।
jalf

69
ध्यान दें कि हास्केल में मठों का उपयोग उत्परिवर्तनीय स्थिति के अलावा अन्य चीजों के लिए किया जाता है, उदाहरण के लिए अपवाद, निरंतरता, सूची समझ, पार्सिंग, अतुल्यकालिक प्रोग्रामिंग और इतने पर। लेकिन इन सभी साधुओं के आवेदन को शायद पैटर्न कहा जा सकता है।
जैक्सबी

151

क्या इस दावे में कोई सच्चाई है कि कार्यात्मक प्रोग्रामिंग OOP डिजाइन पैटर्न की आवश्यकता को समाप्त करता है?

कार्यात्मक प्रोग्रामिंग ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के समान नहीं है। ऑब्जेक्ट-ओरिएंटेड डिज़ाइन पैटर्न कार्यात्मक प्रोग्रामिंग पर लागू नहीं होते हैं। इसके बजाय, आपके पास कार्यात्मक प्रोग्रामिंग डिज़ाइन पैटर्न हैं।

कार्यात्मक प्रोग्रामिंग के लिए, आप OO डिजाइन पैटर्न की किताबें नहीं पढ़ेंगे; आप एफपी डिजाइन पैटर्न पर अन्य पुस्तकें पढ़ेंगे।

भाषा अज्ञेय

पूरी तरह से नहीं। ओओ भाषाओं के संबंध में केवल भाषा-अज्ञेय। डिजाइन पैटर्न बिल्कुल भी प्रक्रियात्मक भाषाओं पर लागू नहीं होते हैं। वे संबंधपरक डेटाबेस डिज़ाइन संदर्भ में मुश्किल से समझ में आते हैं। स्प्रेडशीट डिज़ाइन करते समय वे लागू नहीं होते हैं।

एक विशिष्ट OOP डिजाइन पैटर्न और इसके कार्यात्मक समकक्ष?

ऊपर मौजूद नहीं होना चाहिए। यह OO कोड के रूप में फिर से लिखे गए प्रक्रियात्मक कोड के एक टुकड़े के लिए पूछने जैसा है। उम्म ... अगर मैं मूल फोरट्रान (या सी) का जावा में अनुवाद करता हूं, तो मैंने अनुवाद से ज्यादा कुछ नहीं किया है। अगर मैं इसे एक OO प्रतिमान में पूरी तरह से फिर से लिखता हूं, तो यह अब मूल फोरट्रान या C की तरह कुछ भी नहीं दिखेगा - यह पहचानने योग्य नहीं होगा।

वहाँ कोई साधारण मानचित्रण OO डिजाइन से कार्यात्मक डिजाइन करने के लिए है। वे समस्या को देखने के बहुत अलग तरीके हैं।

फ़ंक्शनल प्रोग्रामिंग (प्रोग्रामिंग की सभी शैलियों की तरह ) में डिज़ाइन पैटर्न होते हैं। संबंधपरक डेटाबेस में डिज़ाइन पैटर्न होते हैं, OO में डिज़ाइन पैटर्न होते हैं, और प्रक्रियात्मक प्रोग्रामिंग में डिज़ाइन पैटर्न होते हैं। सब कुछ डिजाइन पैटर्न है, यहां तक ​​कि इमारतों की वास्तुकला।

डिजाइन पैटर्न - एक अवधारणा के रूप में - भवन का एक कालातीत तरीका है, भले ही प्रौद्योगिकी या समस्या डोमेन के बावजूद। हालाँकि, विशिष्ट डिज़ाइन पैटर्न विशिष्ट समस्या डोमेन और तकनीकों पर लागू होते हैं।

हर कोई जो सोच रहा है कि वे क्या कर रहे हैं डिजाइन पैटर्न को उजागर करेंगे।


12
MVC OO डिज़ाइन नहीं है। यह वास्तुशिल्प डिजाइन है - यह पैटर्न बहुत व्यापक रूप से लागू होता है।
S.Lott

1
@Princess: कार्यात्मक प्रोग्रामिंग जरूरी सरल नहीं है। आपके उदाहरण में, हाँ। अन्य बातों के लिए, जूरी अभी भी बाहर है। लेकिन आपने जावा ओओ डिज़ाइन पैटर्न को त्याग दिया है और एफपी डिज़ाइन पैटर्न को अपनाया है।
S.Lott

1
+1: मैं जलफ के उत्तर के ऊपर इस उत्तर को पसंद करता हूं। हालांकि कुछ डिज़ाइन पैटर्न भाषा में कमियों को संबोधित करते हैं, सभी नहीं करते हैं। उदाहरण के लिए, मैं शायद ही कहूंगा कि "पुनरावर्ती गाँठ को एकजुट करना" डिज़ाइन पैटर्न भाषा में कमी को संबोधित करता है, यह निर्भरता को ढीला करने के लिए एक उपयोगी मुहावरा है।
जॉन हैरोप

9
Java 8 में क्लोजर उर्फ ​​अनाम फंक्शंस उर्फ ​​लंबो एक्सप्रेशन शामिल होंगे। यह जावा के लिए कमांड डिज़ाइन पैटर्न को अप्रचलित बना देगा। यह भाषा की कमी का एक उदाहरण है, नहीं? उन्होंने एक लापता सुविधा जोड़ी और अब आपको डिज़ाइन पैटर्न की आवश्यकता नहीं है।
टोड चाफी

2
समापन वाक्य के लिए +1। डिजाइन पैटर्न प्रोग्रामिंग को सरल बनाने और परिणामी कार्यक्रमों को और अधिक कुशल बनाने के लिए होते हैं, जो वे करने का इरादा रखते हैं।
सॉर्टर

46

भाषा और पैटर्न के बीच कड़ी जुड़ाव पर ब्रायन की टिप्पणी है,

इस चर्चा का गायब हिस्सा मुहावरे की अवधारणा है। जेम्स ओ। कोपलियन की पुस्तक, "एडवांस्ड सी ++" का यहाँ बहुत बड़ा प्रभाव था। बहुत समय पहले उन्होंने क्रिस्टोफर अलेक्जेंडर और कॉलम विदाउट ए नेम की खोज की थी (और आप अलेक्जेंडर को पढ़े बिना पैटर्न के बारे में समझदारी से बात नहीं कर सकते हैं), उन्होंने सही मायने में एक भाषा सीखने में महारत हासिल करने के महत्व के बारे में बात की। उन्होंने एक उदाहरण के रूप में सी में स्ट्रिंग कॉपी का उपयोग किया, while(*from++ = *to++);आप इसे एक लापता भाषा सुविधा (या पुस्तकालय सुविधा) के लिए एक बंद के रूप में देख सकते हैं, लेकिन इसके बारे में वास्तव में क्या मायने रखता है कि यह किसी भी विचार की तुलना में, या अभिव्यक्ति की एक बड़ी इकाई है। इसके हिस्से हैं।

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

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


8
धन्यवाद! यह वह पैटर्न है जो संज्ञानात्मक बोझ को कम करने के लिए "वैचारिक मंथन" के बारे में है।
रान्डेल शुल्ज़

और फंक्शनल मोनाड्स निश्चित रूप से इस चर्चा में हैं।
ग्रेग

@RandallSchulz: भाषा की विशेषताएं (और उनके मुहावरेदार उपयोग, निश्चित रूप से) "वैचारिक मंथन से कम संज्ञानात्मक बोझ" की श्रेणी में भी अच्छी तरह से फिट होंगे।
रॉय टिंकर

39

GoF पुस्तक स्पष्ट रूप से खुद को OOP से जोड़ती है - शीर्षक है डिजाइन पैटर्न - पुन: प्रयोज्य वस्तु-उन्मुख सॉफ्टवेयर के तत्व (जोर)।


34

पीटर नोरविग द्वारा डायनेमिक प्रोग्रामिंग में डिज़ाइन पैटर्न में इस सामान्य विषय का विचारशील कवरेज है, हालांकि 'फ़ंक्शनल' के बजाय 'डायनेमिक' भाषाओं के बारे में है (इसमें ओवरलैप है)।


26

इस विषय पर चर्चा करते हुए एक और लिंक यहां दिया गया है: http://blog.ezyang.com/2010/05/design-patterns-in-bsksk/

अपने ब्लॉग पोस्ट में एडवर्ड ने हास्केल के संदर्भ में सभी 23 मूल GoF पैटर्न का वर्णन किया है।


4
लेख वास्तव में हास्केल में डिजाइन पैटर्न दिखाने के लिए प्रतीत नहीं होता है, लेकिन यह दिखाते हैं कि हास्केल ने बिना किसी पैटर्न के उन आवश्यकताओं को कैसे संबोधित किया।
फ्रेशेयबेल

3
@Fresheyball: पैटर्न की आपकी परिभाषा पर निर्भर करता है। क्या किसी फ़ंक्शन को विज़िटर के पैटर्न के एक संस्करण पर मैप करना है? मैंने आमतौर पर सोचा था कि उत्तर "हाँ" था। पैटर्न को एक विशेष सिंटैक्स से परे जाना चाहिए। लागू किए जा रहे फ़ंक्शन को ऑब्जेक्ट के रूप में लपेटा जा सकता है या फ़ंक्शन पॉइंटर के रूप में पारित किया जा सकता है, लेकिन अवधारणा एक ही है, मेरे लिए। क्या आप असहमत हैं?
srm

20

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

हालांकि, दोनों अक्षों पर गहराई से जाएं, और विशिष्ट डिजाइन पैटर्न और विशिष्ट भाषा सुविधाओं पर विचार करें और चीजें स्पष्ट हो जाएं।

इसलिए, उदाहरण के लिए, कुछ विशिष्ट पैटर्न, जैसे विज़िटर , रणनीति , कमांड और ऑब्जर्वर बीजगणितीय डेटा प्रकारों और पैटर्न मिलान , क्लोजर , प्रथम श्रेणी के कार्यों के साथ भाषा का उपयोग करते समय निश्चित रूप से बदलते या गायब हो जाते हैं। , आदि के , GoF पुस्तक से कुछ अन्य पैटर्न आज भी हैं। 'आसपास रहना', यद्यपि।

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

(एक तरफ: यहां एक हालिया ब्लॉग मैंने लिखा है, जिसमें एफपी और डिजाइन पैटर्न पर अधिक चर्चा के अन्य लिंक हैं।)


आप विज़िटर पैटर्न को "गायब कैसे" कह सकते हैं? क्या यह "संघ के प्रकार और पैटर्न मिलान" का उपयोग करके "एक गुच्छा के साथ एक विज़िटर का दौरा करें" विधियों से बस बारी नहीं करता है?
गाबे

22
हां, लेकिन यह एक पैटर्न से बदल गया है जो एक डिजाइन विचार है जिसे आप एक किताब में पढ़ते हैं और अपने कोड पर लागू होते हैं, "बस कोड" के लिए। यही है, "यूनियन प्रकार और पैटर्न मिलान का उपयोग करें" बस यही है कि आप सामान्य रूप से ऐसी भाषा में सामान कैसे कोड करते हैं। (सादृश्य: यदि किसी भी भाषा में forलूप नहीं थे और उन सभी के पास केवल whileलूप थे, तो "फॉर" एक पुनरावृति पैटर्न हो सकता है। लेकिन जब forभाषा द्वारा समर्थित केवल एक निर्माण होता है और लोग सामान्य रूप से कैसे कोड करते हैं, तो यह एक पैटर्न नहीं है - आप डॉन ' t को एक पैटर्न की आवश्यकता है, यह सिर्फ कोड है, आदमी।)
ब्रायन

4
एक और तरीका रखो, शायद "यह एक पैटर्न है" के लिए एक खराब नहीं लिटमस टेस्ट है: वर्तमान कोड इस तरह से लिखा गया है कि सीएस में स्नातक करने वाले दूसरे वर्ष के छात्र को आपकी भाषा में एक साल का अनुभव प्रोग्रामिंग के साथ पढ़ाई करना। यदि आप उन्हें कोड दिखाते हैं, और वे "यह एक चतुर डिजाइन है", तो यह एक पैटर्न है। यदि आप उन्हें कोड दिखाते हैं, और वे "अच्छी तरह से, डुह!" जाते हैं, तो यह एक पैटर्न नहीं है। (और यदि आप एक वर्ष के लिए एमएल / एफ # / हास्केल कर चुके किसी व्यक्ति को यह "आगंतुक" दिखाते हैं, तो वे "अच्छी तरह से, डुह!" जाएंगे
ब्रायन

1
ब्रायन: मुझे लगता है कि हमारे पास "पैटर्न" की अलग-अलग परिभाषाएं हैं। मैं किसी भी पहचान योग्य डिजाइन अमूर्त को एक पैटर्न मानता हूं, जबकि आप केवल गैर-स्पष्ट सार को एक पैटर्न मानते हैं । सिर्फ इसलिए कि C # है foreachऔर Haskell का mapMमतलब यह नहीं है कि उनके पास Iterator पैटर्न नहीं है। मुझे यह कहने में कोई समस्या नहीं है कि Iterator पैटर्न IEnumerable<T>C # में जेनेरिक इंटरफ़ेस और TraversableHaskell में टाइपकास्ट के रूप में लागू किया गया है ।
गाबे

यह हो सकता है कि गैर-स्पष्ट पैटर्न सॉफ्टवेयर इंजीनियरों के लिए उपयोग किए जाते हैं, लेकिन सभी पैटर्न भाषा डिजाइनरों के लिए उपयोग किए जाते हैं। Ie "यदि आप एक नई भाषा बना रहे हैं, तो इटरेटर पैटर्न को व्यक्त करने के लिए एक साफ तरीका शामिल करना सुनिश्चित करें।" यहां तक ​​कि स्पष्ट पैटर्न ब्याज के हैं जब हम सवाल पूछना शुरू करते हैं, "क्या इस विचार को व्यक्त करने के लिए एक बेहतर वाक्यविन्यास है?" आखिरकार, यही वह है जो किसी को आगे बढ़ने के लिए प्रेरित करता है।
srm

16

नॉर्विग की प्रस्तुति ने सभी GoF पैटर्न के विश्लेषण का विश्लेषण किया, और वे कहते हैं कि 23 में से 16 पैटर्न में कार्यात्मक भाषाओं में सरल कार्यान्वयन थे, या बस भाषा का हिस्सा थे। इसलिए संभवतः उनमें से कम से कम सात या तो एक) भाषा में मौजूद नहीं थे। दुर्भाग्य से, वे हमारे लिए नहीं हैं!

मुझे लगता है कि यह स्पष्ट है कि GoF में "रचनात्मक" या "संरचनात्मक" पैटर्न में से अधिकांश जावा या सी ++ में आदिम प्रकार के सिस्टम को प्राप्त करने के लिए केवल चालें हैं जो आप चाहते हैं। लेकिन बाकी इस बात पर विचार करने के योग्य हैं कि आप किस भाषा में कार्यक्रम करते हैं।

एक प्रोटोटाइप हो सकता है; जबकि यह जावास्क्रिप्ट की एक मौलिक धारणा है, इसे अन्य भाषाओं में खरोंच से लागू किया जाना है।

मेरे पसंदीदा पैटर्न में से एक अशक्त वस्तु पैटर्न है: एक वस्तु के रूप में किसी चीज की अनुपस्थिति का प्रतिनिधित्व करना जो एक उपयुक्त प्रकार का कुछ भी नहीं करता है। यह एक कार्यात्मक भाषा में मॉडल करना आसान हो सकता है। हालांकि, वास्तविक उपलब्धि परिप्रेक्ष्य में बदलाव है।


2
GoF पैटर्न विशेष रूप से वर्ग-आधारित OOP भाषाओं के लिए डिज़ाइन किए जाने के बाद से एक अजीब विश्लेषण क्या करना है। ऐसा लगता है कि पाइप रिंच विद्युत कार्य करने के लिए अच्छे हैं या नहीं।
उदार

@ शानदार: वास्तव में नहीं। ऑब्जेक्ट-ओरिएंटेशन बहुरूपता प्रदान करता है; कार्यात्मक प्रोग्रामिंग आम तौर पर बहुरूपता प्रदान करता है।
Marcin

@Marcin एक OO प्रोग्रामर का अर्थ है बहुआयामी प्रोग्रामर की तुलना में बहुरूपता द्वारा कुछ अलग करना।
एंड्रयूज

@AndrewC मैं असहमत हूं। OO प्रोग्रामर सोच सकते हैं कि उनका मतलब कुछ अलग है, लेकिन वे ऐसा नहीं करते हैं।
मार्सिन

3
@Marcin मेरे अनुभव में, एक OO प्रोग्रामर आमतौर पर पॉलीमॉर्फिज्म (अक्सर सिर्फ ऑब्जेक्ट का उपयोग करते हुए) को उपप्रकार करने के लिए संदर्भित करता है, इसे प्राप्त करने के लिए कास्ट्स का उपयोग कर रहा है, या तदर्थ पॉलीमोर्फिज्म (ओवरलोडिंग आदि)। जब एक कार्यात्मक प्रोग्रामर पॉलीमॉर्फिज्म कहता है, तो उनका मतलब पैरामीट्रिक पॉलीमॉर्फिज्म होता है (यानी किसी भी प्रकार के डेटा के लिए काम करता है - इंट, फंक्शन, लिस्ट), जो ओओ के जेनेरिक प्रोग्रामिंग की तुलना में शायद अधिक है जैसे कि ओओ प्रोग्रामर को पॉलीमोर्फिज्म कहते हैं।
एंड्रयूज

15

मैं कहूंगा कि जब आपके पास मैक्रोज़ के समर्थन के साथ लिस्प जैसी भाषा होती है, तो आप अपने डोमेन-विशिष्ट अमूर्त, अमूर्त का निर्माण कर सकते हैं जो अक्सर सामान्य मुहावरों के समाधानों से बहुत बेहतर होते हैं।


मैं पूरी तरह से खो गया हूं। अमूर्तता के साथ कुछ करने के लिए ... इसका क्या मतलब है?
21 अगस्त को tuinstoel

2
आप मैक्रोज़ के बिना डोमेन विशिष्ट सार (यहां तक ​​कि एम्बेडेड वाले) का निर्माण कर सकते हैं। मैक्रोज़ ने आपको कस्टम सिंटैक्स जोड़कर उन्हें बहुत सुंदर बना दिया।
जॉन हैरोप

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

9

और यहां तक ​​कि OO डिजाइन पैटर्न समाधान भाषा विशिष्ट हैं।

डिज़ाइन पैटर्न सामान्य समस्याओं का समाधान है जो आपकी प्रोग्रामिंग भाषा आपके लिए हल नहीं करती है। जावा में, सिंगलटन पैटर्न एक-कुछ (सरलीकृत) समस्या को हल करता है।

स्काला में, आपके पास क्लास के अलावा ऑब्जेक्ट नामक एक शीर्ष स्तर का निर्माण है। यह बहुत ही त्वरित है और केवल एक ही है। आपको सिंगलटन प्राप्त करने के लिए सिंगलटन पैटर्न का उपयोग करने की आवश्यकता नहीं है। यह भाषा का हिस्सा है।


8

पैटर्न समान समस्याओं को हल करने के तरीके हैं जो बार-बार देखने को मिलते हैं, और फिर वर्णित और प्रलेखित होते हैं। तो नहीं, एफपी पैटर्न को बदलने के लिए नहीं जा रहा है; हालांकि, एफपी नए पैटर्न बना सकता है, और कुछ मौजूदा "सर्वोत्तम प्रथाओं" पैटर्न "अप्रचलित" बना सकता है।


4
GoP पैटर्न अपने तरीके से हो रही एक विशेष प्रकार की प्रोग्रामिंग भाषा की सीमाओं की समस्या को हल करने के तरीके हैं। उदाहरण के लिए "मैं कक्षाओं पर अप्रत्यक्ष करना चाहता हूं, और उन्हें ऑब्जेक्ट बनाने के लिए कहता हूं" -> "आप नहीं कर सकते हैं, लेकिन आप मेटाक्लास जैसी वस्तुओं को एक फैक्ट्री कह सकते हैं"। "मुझे कई प्रेषण चाहिए" -> "आप नहीं कर सकते हैं, लेकिन वहाँ भूलभुलैया है जिसे आप विज़िटर पैटर्न कह सकते हैं"। आदि में से कोई भी पैटर्न समझ में नहीं आता है यदि आप विशिष्ट सीमाओं के साथ ओओपी भाषा में नहीं हैं।
काज़

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

1
मैं दूसरा काज़: पैटर्न "समान समस्याओं को हल करने का तरीका नहीं है जो बार-बार देखने को मिलते हैं" लेकिन "समान समस्याओं को हल करने का तरीका जो बार-बार देखने को मिलता है और बार-बार फिर से लिखना पड़ता है क्योंकि भाषा एक को अनुमति नहीं देती है" इसे केवल एक बार लिखें ”। दूसरे शब्दों में, अगर भाषा ने पैटर्न को लाइब्रेरी / क्लास / मॉड्यूल आदि में निकालने / सार करने की अनुमति दी तो यह एक पैटर्न होना बंद हो जाता है लेकिन लाइब्रेरी / क्लास / मॉड्यूल बन जाता है। एफपी में, फ़ंक्शन के लिए बिट कोड को निकालना / निकालना बहुत आसान है, इसलिए "पैटर्न" को पुन: प्रयोज्य कोड में आसानी से परिवर्तित किया जाता है, जिससे वे एक पैटर्न नहीं बनते हैं।
mb14

1
आपकी व्याख्या का स्वागत है, लेकिन GoF पुस्तक एक पैटर्न को परिभाषित करने के लिए स्पष्ट थी, और यदि आपका परिचयात्मक अध्याय पढ़ता है, तो यह भाषाओं के बारे में, या भाषा की कमजोरियों के बारे में कुछ नहीं कहती है। निश्चित रूप से कुछ भाषाओं में ऐसे क्षेत्र होते हैं जो उन्हें कुछ पैटर्न का अधिक बार लाभ उठाने देंगे, लेकिन चाहे आप इसे दस बार (कट और पेस्ट) लिखें या इसे एक बार दस अहसासों (उप-वर्गीकरण) के साथ लागू करें, या इसे दस से थोड़ा करने के लिए एक फ्रेमवर्क कॉन्फ़िगर किया गया है अलग-अलग तरीके, केवल पैटर्न के कार्यान्वयन का विवरण है।
एडविन बक

1
वर्षों के बाद इस बातचीत में पीछे घूमते हुए, मुझे लगता है कि बहुत सारे लोग एक विशिष्ट प्रोग्रामिंग भाषा या एक विशिष्ट प्रोग्रामिंग प्रतिमान के साथ पैटर्न को जोड़ते हैं। उनका उपयोग ऐसे संदर्भ में किया जा सकता है, लेकिन वे प्रोग्रामिंग से पहले मौजूद थे। "इमारत का एक कालातीत तरीका" वास्तुकला और सामुदायिक योजना के निर्माण में पेटेंट पर चर्चा करता है। इसका मतलब यह है कि पैटर्न ओरिएंटेड तकनीकों का उपयोग "किसी भाषा की सीमाओं" के बाहर किया जा सकता है, जब तक कि आप भवन निर्माण को प्रोग्रामिंग भाषा नहीं कहना चाहते हों :)
एडविन बक

8

जैसा कि दूसरों ने कहा है, कार्यात्मक प्रोग्रामिंग के लिए विशिष्ट पैटर्न हैं। मुझे लगता है कि डिज़ाइन पैटर्न से छुटकारा पाने का मुद्दा इतना अधिक कार्यात्मक पर स्विच करने का नहीं है, बल्कि भाषा सुविधाओं का मामला है

इस पर एक नज़र डालें कि स्काला "सिंगलटन पैटर्न" से कैसे दूर होती है: आप बस एक वर्ग के बजाय एक वस्तु की घोषणा करते हैं । एक अन्य विशेषता, पैटर्न मिलान, आगंतुक पैटर्न की अव्यवस्था से बचने में मदद करता है। यहां तुलना देखें: स्काला के पैटर्न मिलान = स्टेरॉयड पर विज़िटर पैटर्न

और Scala, जैसे F #, OO-functional का एक संलयन है। मैं F # के बारे में नहीं जानता, लेकिन इसमें शायद इस तरह की खूबियाँ हैं।

क्लोज़र कार्यात्मक भाषा में मौजूद हैं, लेकिन उन्हें उनके लिए प्रतिबंधित करने की आवश्यकता नहीं है। वे प्रतिनिधि पैटर्न के साथ मदद करते हैं।

एक और अवलोकन। कोड का यह टुकड़ा एक पैटर्न को लागू करता है: यह इतना क्लासिक है और यह इतना मौलिक है कि हम आमतौर पर इसे "पैटर्न" के रूप में नहीं सोचते हैं, लेकिन यह सुनिश्चित है:

for(int i = 0; i < myList.size(); i++) { doWhatever(myList.get(i)); }

जावा और सी # जैसी इंपीरियल भाषाओं ने इस से निपटने के लिए अनिवार्य रूप से एक कार्यात्मक निर्माण अपनाया है: "फॉरचेट"।


मैं कहूंगा कि स्काला में सिंगलटन पैटर्न के लिए प्रथम श्रेणी का समर्थन शामिल है। पैटर्न अभी भी है, लेकिन पैटर्न को लागू करने के लिए आवश्यक बॉयलरप्लेट कोड जावा की तुलना में बहुत कम है।
जैक्सबी

यदि राय ******* की तरह होती, तो ठीक है ... बाकी उत्तरों को देखें। "आप बस एक वर्ग के बजाय एक वस्तु घोषित करते हैं" इतना सच है, मैं स्पष्ट रूप से इसे एक वस्तु शाब्दिक कहूंगा, हालांकि (अर्थात var सिंगलटन = {};)। मुझे फ़ॉरचैट पैटर्न के बारे में उल्लेख भी पसंद है। दुर्भाग्य से, यह उन अधिकांश लोगों की तरह दिखता है जिन्होंने इस प्रश्न का उत्तर दिया / टिप्पणी की, वे कार्यात्मक प्रोग्रामिंग को नहीं समझते हैं और ओओपी पैटर्न के उपयोग को उचित ठहराएंगे। +1 ठोस उदाहरण प्रदान करने के लिए, यदि मैं कर सकता था तो मैं और अधिक दे दूँगा।
इवान प्लैस

@JacquesB मैं स्काला / हास्केल पर टिप्पणी नहीं कर सकता, लेकिन जावास्क्रिप्ट में (यानी हाइब्रिड फंक्शनल / इंपिरेटिव) वहाँ बिल्कुल कोई बॉयलरप्लेट नहीं है, जिस तरह से आप ऑब्जेक्ट शाब्दिक वाक्यविन्यास, अनाम फ़ंक्शंस के संयोजन का उपयोग करके वस्तुओं को घोषित करने का तरीका समायोजित करते हैं। वर्ग के सदस्य, और एकाधिक वंशानुक्रम (इंटरफ़ेस अनुबंध की आवश्यकता को समाप्त करने) की अनुमति देते हैं।
इवान प्लाइस

8

GoF डिज़ाइन पैटर्न OO भाषाओं के लिए वर्कअराउंड रेसिपी कोडिंग कर रहा है जो जावा और C ++ की तरह सिमूला 67 के वंशज हैं ।

डिज़ाइन पैटर्न द्वारा व्यवहार किए जाने वाले अधिकांश "आईल्स" इसके कारण होते हैं:

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

इन डिज़ाइन पैटर्नों में से एक भी ऐसा नहीं है, जो कॉमन लिस्प ऑब्जेक्ट सिस्टम में गायब नहीं होता है, भले ही समाधान अनिवार्य रूप से उसी तरीके से संरचित हो जैसा कि संबंधित डिज़ाइन पैटर्न में होता है। (इसके अलावा, वह वस्तु प्रणाली एक दशक से अधिक समय तक GoF पुस्तक से पहले है। आम लिस्प उसी वर्ष एक ANSI मानक बन गया, जो उस पुस्तक को पहली बार प्रकाशित किया गया था।)

जहाँ तक फ़ंक्शनल प्रोग्रामिंग का सवाल है, चाहे पैटर्न लागू हों या न हों, यह इस बात पर निर्भर करता है कि दी गई फ़ंक्शनल प्रोग्रामिंग लैंग्वेज में किसी प्रकार की ऑब्जेक्ट सिस्टम है या नहीं, और क्या यह ऑब्जेक्ट सिस्टम के बाद मॉडलिंग करता है जो पैटर्न से लाभान्वित होता है। उस प्रकार का ऑब्जेक्ट-ओरिएंटेशन कार्यात्मक प्रोग्रामिंग के साथ अच्छी तरह से मिश्रण नहीं करता है, क्योंकि राज्य का उत्परिवर्तन सामने और केंद्र में है।

निर्माण और गैर-परिवर्तनकारी पहुंच कार्यात्मक प्रोग्रामिंग के साथ संगत है, और इसलिए पैटर्न जो कि अमूर्त पहुंच या निर्माण के साथ करना है लागू हो सकता है: कारखाने, मुखौटा, प्रॉक्सी, डेकोरेटर और आगंतुक जैसे पैटर्न।

दूसरी ओर, राज्य और रणनीति जैसे व्यवहार पैटर्न संभवतः कार्यात्मक OOP में सीधे लागू नहीं होते हैं क्योंकि राज्य का उत्परिवर्तन उनके मूल में है। इसका मतलब यह नहीं है कि वे लागू नहीं होते हैं; शायद वे किसी भी तरह से पारस्परिक अवस्था के अनुकरण के लिए जो भी तरकीबें उपलब्ध हैं, उन्हें मिलाकर लागू करते हैं।


2
"GoF डिज़ाइन पैटर्न कोडिंग वर्कअराउंड रेसिपी हैं" बस एक गलत बयान है।
जॉन पीटर्स

7

मैं जेरेमी गिबन्स द्वारा उत्कृष्ट लेकिन कुछ हद तक घने कागजों के एक जोड़े को प्लग करना चाहता हूं: "उच्च-क्रम डेटाटाइप-जेनेरिक कार्यक्रमों के रूप में डिजाइन पैटर्न" और "इटरेटर पैटर्न का सार" (दोनों यहां उपलब्ध हैं: http: // www। comlab.ox.ac.uk/jeremy.gibbons/publications/ )।

ये दोनों वर्णन करते हैं कि कैसे मुहावरेदार कार्यात्मक निर्माण इलाके को कवर करते हैं जो अन्य (ऑब्जेक्ट-ओरिएंटेड) सेटिंग्स में विशिष्ट डिजाइन पैटर्न द्वारा कवर किया जाता है।


6

टाइप सिस्टम लाए बिना आपकी यह चर्चा नहीं हो सकती।

फ़ंक्शनल प्रोग्रामिंग की मुख्य विशेषताओं में फ़र्स्ट-क्लास वैल्यू, करी, अपरिवर्तनीय मान आदि जैसे फ़ंक्शंस शामिल हैं। मुझे यह स्पष्ट नहीं लगता है कि OO डिज़ाइन पैटर्न उन विशेषताओं में से किसी को भी अनुमानित कर रहे हैं।

ऐसा इसलिए है क्योंकि ये विशेषताएँ OOP के समान मुद्दों को संबोधित नहीं करती हैं ... वे अनिवार्य प्रोग्रामिंग के विकल्प हैं। OOP का FP उत्तर ML और हास्केल के प्रकार की प्रणालियों में निहित है ... विशेष रूप से योग के प्रकार, सार डेटा प्रकार, ML मॉड्यूल, और Haskell typeclasses।

लेकिन निश्चित रूप से अभी भी डिजाइन पैटर्न हैं जो एफपी भाषाओं द्वारा हल नहीं किए जाते हैं। एफपी एक सिंगलटन के बराबर क्या है? (एक पल के लिए उपेक्षा करना कि सिंगलटन आमतौर पर उपयोग करने के लिए एक भयानक पैटर्न हैं)

पहली चीज़ जो टाइपकालेज़ करती है वह सिंगलटन की आवश्यकता को समाप्त करती है।

आप 23 की सूची के माध्यम से जा सकते हैं और अधिक को समाप्त कर सकते हैं, लेकिन मेरे पास अभी समय नहीं है।


6
टाइपरेकल (ओओपी इंटरफेस के एफपी समकक्ष) एकल (ग्लोबल स्टेट के एफपी समकक्ष) की आवश्यकता को कैसे समाप्त करते हैं?
गाबे

4

मुझे लगता है कि केवल दो GoF डिज़ाइन पैटर्न को कार्यात्मक प्रोग्रामिंग तर्क को प्राकृतिक OO भाषा में पेश करने के लिए डिज़ाइन किया गया है। मैं रणनीति और कमान के बारे में सोचता हूं। अन्य GoF डिज़ाइन पैटर्न में से कुछ को कार्यात्मक प्रोग्रामिंग द्वारा डिज़ाइन को सरल बनाने और उद्देश्य को बनाए रखने के लिए संशोधित किया जा सकता है।


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

4

अनिवार्य रूप से, हाँ !

  • जब कोई पैटर्न अनुपलब्ध सुविधाओं (उच्च क्रम के कार्य, स्ट्रीम हैंडलिंग ...) की परिधि करता है, जो कि अल्टीमेटली रचना की सुविधा देता है
  • पैटर्न के कार्यान्वयन को फिर से लिखने और फिर से भाषा की गंध के रूप में खुद को देखा जा सकता है ।

इसके अलावा, यदि आप खुदाई करने के इच्छुक हैं तो यह पृष्ठ (AreDesignPatternsMissingLanguageFeatures) एक "पैटर्न / फ़ीचर" अनुवाद तालिका और कुछ अच्छी चर्चाएँ प्रदान करता है।


3

फ़ंक्शनल प्रोग्रामिंग डिज़ाइन पैटर्न को प्रतिस्थापित नहीं करता है। डिज़ाइन पैटर्न को प्रतिस्थापित नहीं किया जा सकता है।

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


1
डिजाइन पैटर्न को प्रतिस्थापित नहीं किया जा सकता है? मुझे लगता है कि थोड़ा बंद दिमाग है। हम शायद सभी सहमत हैं कि डिज़ाइन पैटर्न प्रोग्रामिंग की समस्याओं को हल करने के लिए हैं, और मैं कम से कम यह आशा करना चाहता हूं कि किसी दिन हम डिजाइन पैटर्न के बिना उन समस्याओं को हल कर सकते हैं।
महानगर

3
कोई विशेष पैटर्न बदली जा सकती है, लेकिन पैटर्न की अवधारणा नहीं हो सकती है। याद रखें कि शब्द "पैटर्न" वास्तुकला के क्षेत्र में उत्पन्न हुआ था ।
फ्रैंक शीयर

1
पैटर्न प्रोग्रामिंग की समस्याओं को हल करने के लिए नहीं हैं। पैटर्न वे तरीके हैं जो हम प्रोग्राम करते हैं। पैटर्न का प्रलेखन प्रोग्रामिंग समस्याओं को हल करने में मदद करने के लिए है।
Torbjørn

3
@ Torbjørn: पैटर्न वे तरीके हैं जिनसे हम प्रोग्राम करते हैं जब भाषा रास्ते में आती है । वे कार्यक्रम के वांछित व्यवहार और भाषा की अंतर्निहित क्षमताओं के बीच कुछ बेमेल होने के कारण मौजूद हैं, जहां आवश्यकताओं और क्षमताओं को अच्छी तरह से मैप नहीं किया जाता है या अस्पष्ट रूप से मैप किया जाता है। यदि यह उस के लिए नहीं थे, तो कोई पैटर्न नहीं होगा; आपके पास एक कार्यान्वयन होगा कि बस कैसे काम किया जाता है , और अन्य कार्यान्वयन प्रभावी रूप से विचार करने के लायक नहीं होंगे।
cHao

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

3

2013 की नई किताब में "कार्यात्मक प्रोग्रामिंग पैटर्न- स्काला और क्लीजुर में" में लेखक माइकल.बी। लिन गोफ पैटर्न के लिए कई मामलों में प्रतिस्थापन की तुलना और प्रदान करने के लिए एक अच्छा काम करता है और नए कार्यात्मक पैटर्न जैसे 'पूंछ पुनरावृत्ति', 'संस्मरण', 'आलसी अनुक्रम' आदि पर भी चर्चा करता है।

यह पुस्तक अमेज़न पर उपलब्ध है। कुछ दशकों के OO बैकग्राउंड से आने पर मुझे यह बहुत जानकारीपूर्ण और उत्साहजनक लगा।


3

OOP और GoF पैटर्न राज्यों के साथ सौदा करते हैं। OOP वास्तविकता की दी गई आवश्यकताओं को कोड बेस को यथासंभव रखने के लिए वास्तविकता को मॉडल करता है। GoF डिज़ाइन पैटर्न वे पैटर्न हैं जिनकी पहचान परमाणु वास्तविक दुनिया की समस्याओं को हल करने के लिए की गई थी। वे राज्य की समस्या को एक अर्थपूर्ण तरीके से संभालते हैं।

जैसा कि वास्तविक कार्यात्मक प्रोग्रामिंग में कोई राज्य मौजूद नहीं है, यह GoF पैटर्न लागू करने के लिए कोई मतलब नहीं है। उसी तरह कार्यात्मक डिज़ाइन पैटर्न नहीं हैं जिस तरह से GoF डिज़ाइन पैटर्न हैं। प्रत्येक कार्यात्मक डिजाइन पैटर्न वास्तविकता के विपरीत कलात्मक है क्योंकि फ़ंक्शन गणित के निर्माण हैं और वास्तविकता नहीं।

फ़ंक्शंस में समय की अवधारणा का अभाव होता है क्योंकि वे हमेशा उसी मान को लौटाते हैं जो मौजूदा समय है जब तक कि फ़ंक्शन पैरामीटर का हिस्सा नहीं है, जो "भविष्य के अनुरोध" को पूरा करने के लिए वास्तव में कठिन बनाता है। हाइब्रिड भाषाएं उन अवधारणाओं को मिश्रित करती हैं जो भाषाओं को वास्तविक कार्यात्मक प्रोग्रामिंग भाषा नहीं बनाती हैं।

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

GoF पैटर्न अप्रचलित नहीं हैं। वे वास्तविक दुनिया की आवश्यकताओं को पूरा करने के लिए कम से कम आवश्यक हैं। लेकिन अगर आप एक कार्यात्मक प्रोग्रामिंग भाषा का उपयोग करते हैं तो आपको उन्हें अपने हाइब्रिड समकक्षों में बदलना होगा। अंत में आपके पास केवल कार्यात्मक कार्यक्रम बनाने का कोई मौका नहीं है यदि आप दृढ़ता का उपयोग करते हैं। आपके प्रोग्राम के हाइब्रिड तत्वों के लिए GoF पैटर्न का उपयोग करने की आवश्यकता बनी हुई है। किसी भी अन्य तत्व के लिए जो विशुद्ध रूप से कार्यात्मक है, क्योंकि राज्य नहीं है, क्योंकि GoF पैटर्न का उपयोग करने की कोई आवश्यकता नहीं है।

क्योंकि GoF पैटर्न वास्तविक कार्यात्मक प्रोग्रामिंग के लिए आवश्यक नहीं है, इसका मतलब यह नहीं है कि SOLID सिद्धांतों को लागू नहीं किया जाना चाहिए। SOLID सिद्धांत किसी भी भाषा के प्रतिमान से परे हैं।


2
एफपी में राज्य हो सकता है - सिर्फ कोई वैश्विक, साझा या परस्पर राज्य नहीं।
vt5491

2

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

एक HOF के सिद्धांत का अर्थ है कि कार्यों को अन्य कार्यों के तर्क के रूप में पारित किया जा सकता है। और फ़ंक्शन मान वापस कर सकते हैं।


1

जैसा कि स्वीकृत उत्तर में कहा गया है, OOP और FP सभी के अपने विशिष्ट पैटर्न हैं।

हालांकि, कुछ पैटर्न हैं जो इतने सामान्य हैं कि सभी प्रोग्रामिंग प्लेटफॉर्म जो मेरे पास हो सकते हैं। यहाँ एक (अपूर्ण) सूची है:

  • एडाप्टर। मैं शायद ही एक उपयोगी प्रोग्रामिंग प्लेटफ़ॉर्म के बारे में सोच सकता हूं जो इतना व्यापक (और आत्म-पूर्ण) है कि इसे दुनिया से बात करने की आवश्यकता नहीं है। यदि यह ऐसा करने जा रहा है, तो निश्चित रूप से एक एडेप्टर की आवश्यकता होती है।

  • बहाना। कोई भी प्रोग्रामिंग प्लेटफ़ॉर्म जो बड़े स्रोत कोड को संभाल सकता है, को संशोधित करने में सक्षम होना चाहिए। यदि आप कार्यक्रम के अन्य भागों के लिए एक मॉड्यूल बनाने के लिए थे, तो आप कोड के "गंदे" भागों को छुपाना चाहेंगे और इसे एक अच्छा इंटरफ़ेस देंगे।

  • दुभाषिया। सामान्य तौर पर, कोई भी कार्यक्रम सिर्फ दो काम कर रहा है: पार्स इनपुट और प्रिंट आउटपुट। माउस इनपुट को पार्स करने की आवश्यकता है, और विंडो विजेट को प्रिंट आउट करने की आवश्यकता है। इसलिए, एक एम्बेडेड दुभाषिया होने से कार्यक्रम को चीजों को अनुकूलित करने की अतिरिक्त शक्ति मिलती है।

इसके अलावा, मैंने एक विशिष्ट FP भाषा में देखा, हास्केल, GoF पैटर्न के समान कुछ है, लेकिन विभिन्न नामों के साथ। मेरी राय में यह सुझाव है कि वे वहां थे क्योंकि एफपी और ओओपी दोनों भाषाओं में हल करने के लिए कुछ सामान्य समस्याएं हैं।

  • मोनाड ट्रांसफार्मर और डेकोरेटर। पहले एक मौजूदा संन्यासी में अतिरिक्त क्षमता जोड़ने के लिए उपयोग किया जाता था, बाद में एक मौजूदा वस्तु में अतिरिक्त क्षमता जोड़ते थे।

1

मुझे लगता है कि प्रत्येक प्रतिमान एक अलग उद्देश्य प्रदान करता है और इस तरह इस तरह की तुलना नहीं की जा सकती।

मैंने यह नहीं सुना है कि GoF डिज़ाइन पैटर्न हर भाषा पर लागू होते हैं। मैंने सुना है कि वे सभी ओओपी भाषाओं पर लागू होते हैं । यदि आप कार्यात्मक प्रोग्रामिंग का उपयोग करते हैं तो आपके द्वारा हल की जाने वाली समस्याओं का डोमेन ओओ भाषाओं से अलग है।

मैं उपयोगकर्ता इंटरफ़ेस लिखने के लिए कार्यात्मक भाषा का उपयोग नहीं करूंगा, लेकिन O # भाषाओं में से एक जैसे C # या Java इस काम को आसान बना देगा। अगर मैं एक कार्यात्मक भाषा लिख ​​रहा था, तो मैं OO डिजाइन पैटर्न का उपयोग करने पर विचार नहीं करूंगा।


1

OOP और FP के अलग-अलग लक्ष्य हैं। OOP का उद्देश्य सॉफ़्टवेयर घटकों की जटिलताओं / गतिमान भागों को घेरना है और FP का उद्देश्य सॉफ़्टवेयर घटकों की जटिलता और निर्भरता को कम करना है।

हालाँकि ये दोनों प्रतिमान आवश्यक रूप से 100% विरोधाभासी नहीं हैं और दोनों दुनियाओं से लाभ प्राप्त करने के लिए इसे एक साथ लागू किया जा सकता है।

यहां तक ​​कि एक भाषा के साथ जो C # जैसी कार्यात्मक प्रोग्रामिंग का मूल रूप से समर्थन नहीं करता है, आप एफपी सिद्धांतों को समझने पर कार्यात्मक कोड लिख सकते हैं। इसी तरह यदि आप ओओपी सिद्धांतों, पैटर्न और सर्वोत्तम प्रथाओं को समझते हैं तो आप एफ # का उपयोग करके ओओपी सिद्धांतों को लागू कर सकते हैं। आप उस स्थिति और समस्या के आधार पर सही विकल्प बना सकते हैं जिसे आप हल करने की कोशिश करते हैं, चाहे आप जिस प्रोग्रामिंग भाषा का उपयोग करते हों।


1

एफपी का समर्थन करने वाली भाषा में कुछ पैटर्न लागू करना आसान है। उदाहरण के लिए, क्लोजर का उपयोग करके अच्छी तरह से उपयोग करके रणनीति को लागू किया जा सकता है। हालाँकि, संदर्भ के आधार पर, आप क्लास-आधारित दृष्टिकोण का उपयोग करके रणनीति को लागू करना पसंद कर सकते हैं, यह कहें कि जहां रणनीतियाँ स्वयं काफी जटिल हैं और / या साझा संरचना जो आप टेम्पलेट विधि का उपयोग करके मॉडल करना चाहते हैं।

बहु-प्रतिमान भाषा (रूबी) में विकसित होने वाले मेरे अनुभव में, एफपी कार्यान्वयन सरल मामलों में अच्छी तरह से काम करता है, लेकिन जहां संदर्भ अधिक जटिल है, वहां गोफ ओओपी आधारित दृष्टिकोण एक बेहतर फिट है।

एफपी दृष्टिकोण ओओपी दृष्टिकोण को प्रतिस्थापित नहीं करता है, यह इसे पूरक करता है।


0

कार्यात्मक प्रोग्रामिंग, IMHO की सर्वोपरि विशेषता यह है कि आप कुछ और नहीं बल्कि अभिव्यक्तियों के साथ प्रोग्रामिंग कर रहे हैं - अभिव्यक्ति के भीतर के भाव जो सभी अंतिम, अंतिम अभिव्यक्ति का मूल्यांकन करते हैं जो "मशीन का मूल्यांकन करते समय गर्म करता है"।

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

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


हम्म, मुझे ध्यान देना चाहिए कि उत्तर देने से पहले यह प्रश्न ग्यारह साल पुराना था। :-)
जिम फ्लड

0

अपने आप को संभालो।

यह मुझे कई सुनकर उत्तेजित कर देगा कि मैंने डिज़ाइन पैटर्न को बदलने का दावा किया है और SOLID और DRY को हटा दिया है। मै कोई नहीं हु। फिर भी, मैंने सहयोगी (निर्माण) वास्तुकला को सही ढंग से चित्रित किया है और अपनी वेबसाइट http://www.powersemantics.com/ पर कोड और विज्ञान के साथ निर्माण प्रक्रियाओं के लिए नियमों को ऑनलाइन प्रकाशित किया है

मेरा तर्क यह है कि डिज़ाइन पैटर्न यह सुनिश्चित करने का प्रयास करता है कि निर्माण "जन अनुकूलन" को क्या कहता है, एक प्रक्रिया का रूप है जिसमें हर कदम को नया आकार दिया जा सकता है, फिर से लगाया और बढ़ाया जा सकता है। आप ऐसी प्रक्रियाओं के बारे में सोच सकते हैं जो बिना स्क्रिप्ट के हैं। मैं यहाँ अपना (ऑनलाइन) तर्क दोहराने नहीं जा रहा हूँ। संक्षेप में, मेरा द्रव्यमान अनुकूलन आर्किटेक्चर बिना किसी गन्दे शब्दार्थ के उस लचीलेपन को प्राप्त करके डिज़ाइन पैटर्न को बदल देता है। मुझे आश्चर्य था कि मेरे मॉडल ने इतनी अच्छी तरह से काम किया, लेकिन जिस तरह से प्रोग्रामर कोड लिखते हैं, वह एक मोमबत्ती नहीं पकड़ता है कि कैसे विनिर्माण सहयोगी काम को व्यवस्थित करता है।

  • विनिर्माण = प्रत्येक चरण एक उत्पाद के साथ सहभागिता करता है
  • ओओपी = प्रत्येक चरण स्वयं और अन्य मॉड्यूल के साथ बातचीत करता है, उत्पाद को बेकार कार्यालय कर्मचारियों की तरह बिंदु से चारों ओर से गुजरता है

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

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

कितना भ्रामक है कि पाठक, हार्डकोड जो स्क्रिप्ट का प्रतिनिधित्व करता है? बिल्कुल नहीं अगर आपको लगता है कि आपके संकलक के उपभोक्ता ऐसी सुविधाओं के लिए भुगतान करते हैं, लेकिन मेरे लिए इस तरह की सुविधाएँ अर्थ-व्यर्थ हैं। वे व्यर्थ हैं, क्योंकि बड़े पैमाने पर अनुकूलन की प्रक्रिया खुद को गतिशील बनाने के लिए है , न कि केवल प्रोग्रामर के लिए विजुअल स्टूडियो को गतिशील बनाने के लिए।


0

यह, उच्च स्तरीय कार्यात्मक PL (जैसे कि OCaml, कक्षाओं, मॉड्यूल आदि के साथ) निश्चित रूप से OOP अनिवार्य भाषाओं को बहुमुखीता और अभिव्यक्ति की शक्ति में टाइप करता है। अमूर्त रिसाव नहीं होता है, आप अपने अधिकांश विचारों को सीधे कार्यक्रम में व्यक्त कर सकते हैं। इसलिए, हाँ, यह डिज़ाइन पैटर्न को प्रतिस्थापित करता है, जिनमें से अधिकांश कार्यात्मक पैटर्न की तुलना में हास्यास्पद रूप से सरल हैं।

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