शुद्ध कार्यात्मक बनाम बताओ, मत पूछो?


14

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

( स्रोत: इस साइट पर एक और सवाल के तहत @ डेविड अरनो द्वारा टिप्पणी )

टिप्पणी ने 133 अपवर्जन की शानदार राशि प्राप्त की है, यही वजह है कि मैं इसकी योग्यता पर कुछ ध्यान देना चाहूंगा।

जहां तक ​​मुझे जानकारी है, प्रोग्रामिंग में दो अलग-अलग तरीके हैं: शुद्ध कार्यात्मक प्रोग्रामिंग (यह टिप्पणी क्या उत्साहजनक है) और बताएं, इस वेबसाइट पर भी समय-समय पर (जो समय-समय पर अनुशंसित नहीं किया जा रहा है) पूछें। AFAIK ये दोनों सिद्धांत मौलिक रूप से असंगत हैं, एक-दूसरे के विरोधी होने के करीब: शुद्ध कार्यात्मक को "केवल रिटर्न मान के रूप में संक्षेपित किया जा सकता है, कोई साइड इफेक्ट नहीं है", जबकि पूछें, संक्षेप में नहीं कहा जा सकता है क्योंकि "कुछ भी वापस न करें," केवल साइड इफेक्ट्स हैं ”। इसके अलावा, मैं हैरान हूँ क्योंकि मैंने सोचा था कि बताओ, मत पूछो कि ओओ प्रतिमान का मूल माना जाता था जबकि शुद्ध कवक को कार्यात्मक प्रतिमान का मूल माना जाता था - अब मुझे OO में अनुशंसित शुद्ध कार्य दिखाई देते हैं!

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

हालांकि, इन 133 अपवोट्स से मैं तर्क दे रहा हूं कि वर्तमान में शुद्ध कार्यात्मक प्रोग्रामिंग "जीत" है क्योंकि यह एक आम सहमति बन जाती है कि यह बताने के लिए बेहतर है, मत पूछो। क्या ये सही है?

इसलिए, इस एंटीपैर्टन-राइडेड गेम के उदाहरण पर मैं बनाने की कोशिश कर रहा हूं : अगर मैं इसे शुद्ध कार्यात्मक प्रतिमान के साथ लाना चाहता था - कैसे ?!

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

ठीक है - अगर मैं वास्तव में चाहता था तो मैं इसे संशोधित करने के बजाय एक विधि RETURN को एक युद्ध राज्य बना सकता था। परंतु! क्या मुझे इसके बाद युद्ध की स्थिति में जरूरत की हर चीज को कॉपी करना होगा, ताकि राज्य में इसे संशोधित करने के बजाय पूरी तरह से नया राज्य लौटाया जा सके?

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

यह मेरे लिए बहुत आसान है कि मैं राज्य को केवल स्थान पर संशोधित करूं और अपडेट लौटाऊं ...

लेकिन एक अनुभवी इंजीनियर इससे कैसे निपटेगा?


9
किसी भी प्रतिमान के बाद विफलता का एक निश्चित तरीका है। नीति को कभी बुद्धिमत्ता को नहीं लांघना चाहिए। किसी समस्या का समाधान समस्या पर निर्भर होना चाहिए, न कि समस्या के समाधान के बारे में आपकी धार्मिक आस्थाओं पर।
जॉन डौमा

1
मैंने पहले कभी यहां कोई सवाल नहीं पूछा जो मैंने पहले कहा हो। मैं गौरवान्वित महसूस कर रहा हूं। :)
डेविड अरनो

जवाबों:


14

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

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

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


"सही ढंग से समझाने, मत पूछो" के लिए धन्यवाद।
user949300

13

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

पहला: अंकल बॉब का पाठ

अंकल बॉब यह बात बता रहे हैं कि आपके फ़ंक्शन / पद्धति में जितने अधिक तर्क हैं, उतने अधिक डेवलपर्स जो इसका उपयोग करते हैं, उन्हें समझना होगा। यह संज्ञानात्मक भार मुफ्त में नहीं आता है, और यदि आप तर्कों के क्रम के अनुरूप नहीं हैं, आदि संज्ञानात्मक भार केवल बढ़ता है।

यह मानव होने का एक तथ्य है। मुझे लगता है कि अंकल बॉब की क्लीन कोड बुक में मुख्य गलती "एक फ़ंक्शन के लिए तर्क की आदर्श संख्या शून्य है" है । जब तक यह नहीं होता है तब तक न्यूनतमवाद महान होता है। जैसे आप कैलकुलस में अपनी सीमा तक कभी नहीं पहुँचते, वैसे ही आप कभी भी "आदर्श" कोड तक नहीं पहुँचेंगे - और न ही आपको।

जैसा कि अल्बर्ट आइंस्टीन ने कहा, "सब कुछ उतना ही सरल होना चाहिए जितना कि यह हो सकता है, लेकिन सरल नहीं"।

दूसरा: डेविड अर्नो का पाठ

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

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

विकास व्यापार-श्रृंखला की एक श्रृंखला है

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

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

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

कौन सही है? वैसे डेविड इस मामले में अंकल बॉब से ज्यादा सही हैं। हालाँकि, यहाँ जो अंतर्निहित बात मैं रेखांकित करना चाहता हूँ वह यह है कि एक विधि में उतने ही तर्क होने चाहिए जितने कि समझ में आते हैं।


वहाँ परवलवाद है। विभिन्न लड़ाइयों को समानांतर में संसाधित किया जा सकता है। हालाँकि, हाँ: एक एकल लड़ाई, जबकि इसे संसाधित किया जा रहा है, लॉक करने की आवश्यकता है।
गजकम

हां, मेरा मतलब यह था कि पाठक (आपके सादृश्य में रहने वाले) उनके (बोने वाले) लेखन से चमकेंगे। उस ने कहा, मैं अतीत में लिखी गई कुछ चीजों को देखने के लिए वापस चला गया हूं और या तो किसी चीज को त्याग दिया हूं या अपने पूर्व स्व से असहमत हूं। हम सभी सीख रहे हैं और विकसित कर रहे हैं, और यह कारण नंबर एक है कि आपको हमेशा कैसे और यदि आप कुछ सीखा है, तो आप कैसे और क्यों लागू करते हैं।
बेरिन लोरिट्श

8

ठीक है - अगर मैं वास्तव में चाहता था तो मैं इसे संशोधित करने के बजाय एक विधि RETURN को एक युद्ध राज्य बना सकता था।

हां, यही विचार है।

क्या मुझे इसके स्थान पर संशोधन करने के बजाय पूर्ण राज्य को वापस करने के लिए युद्ध की स्थिति में सब कुछ कॉपी करना होगा?

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

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

Google "कुशल अपरिवर्तनीय डेटा संरचनाएं" के लिए, और आप निश्चित रूप से कुछ संदर्भ पाएंगे कि यह सामान्य रूप से कैसे काम करता है।

यह मेरे लिए बहुत आसान है कि मैं राज्य को केवल संशोधित करूं और अपडेट लौटा सकूं।

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


8

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

AFAIK ये दोनों सिद्धांत मौलिक रूप से असंगत हैं, एक-दूसरे के विरोधी होने के करीब: शुद्ध कार्यात्मक को "केवल रिटर्न मान के रूप में संक्षेपित किया जा सकता है, कोई साइड इफेक्ट नहीं है", जबकि पूछें, संक्षेप में नहीं कहा जा सकता है क्योंकि "कुछ भी वापस न करें," केवल साइड इफेक्ट्स हैं ”।

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

लेकिन ऐसा प्रतीत होता है कि मैं जिस अर्थ को "बताने के लिए नहीं कहता हूं" लागू होता है, वह फाउलर की OO- केंद्रित परिभाषा को लेने और इसे अधिक प्रतिमान अज्ञेय बनाने से आता है। इस प्रक्रिया में, मेरा मानना ​​है कि यह अवधारणा को उसके तार्किक निष्कर्ष पर ले जाता है।

चलो सरल शुरुआत के लिए वापस हवा। हमारे पास "तर्क की गांठ" (प्रक्रियाएं) हैं और हमारे पास वैश्विक आंकड़े हैं। प्रक्रियाएँ उस डेटा को सीधे एक्सेस करने के लिए पढ़ती हैं। हमारे पास एक सरल "पूछ" परिदृश्य है।

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

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

इसलिए मैं "शुद्ध कार्यात्मक" और "बताओ, मत पूछो" एक दूसरे के विपरीत है। पूर्व का एकमात्र पूर्ण कार्यान्वयन है जहां तक ​​मेरा संबंध है। फाउलर का दृष्टिकोण पूर्ण नहीं है "बताओ, मत पूछो"।

लेकिन यह याद रखना महत्वपूर्ण है कि "पूर्ण रूप से लागू न करें" पूछना वास्तव में एक आदर्श है, अर्थात व्यावहारिकता को कम खेलने में आना चाहिए, हम आदर्शवादी बन जाते हैं और इस तरह इसे गलत तरीके से केवल संभवतः सही दृष्टिकोण के रूप में मानते हैं। बहुत कम ऐप साधारण कारण के लिए 100% साइड इफ़ेक्ट फ्री होने के करीब भी पहुँच सकते हैं, अगर वे वास्तव में साइड इफ़ेक्ट फ्री हैं तो वे कुछ भी उपयोगी नहीं करेंगे। ऐप को उपयोगी बनाने के लिए हमें बदलते राज्य की आवश्यकता है, हमें आईओ आदि की आवश्यकता है। और ऐसे मामलों में, तरीकों से साइड इफेक्ट का कारण होना चाहिए और इसलिए यह शुद्ध नहीं हो सकता है। लेकिन यहाँ अंगूठे का नियम इन "अशुद्ध" तरीकों को न्यूनतम रखना है; केवल उनके पास साइड इफेक्ट्स हैं क्योंकि उन्हें आदर्श के रूप में, बल्कि इसकी आवश्यकता है।

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

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

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

और एक अंतिम बिंदु के रूप में, बस फिर से दोहराने के लिए: शुद्ध कार्य और "बताओ, मत पूछो" बिल्कुल विपरीत नहीं हैं।


5

किसी भी चीज़ के लिए, कभी भी, एक संदर्भ मौजूद होता है, जिसमें आप उस कथन को रख सकते हैं, जो उसे बेतुका बना देगा।

यहाँ छवि विवरण दर्ज करें

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

उदाहरण के लिए pi()यह बिल्कुल ठीक कार्य है। क्यों? क्योंकि मुझे परवाह नहीं है कि कैसे, या भले ही, इसकी गणना की गई थी। या यदि यह ई, या पाप () का उपयोग करता है, तो उस संख्या पर पहुंचने के लिए जो यह रिटर्न करता है। मैं इसके साथ ठीक हूं क्योंकि नाम मुझे वह सब बताता है जो मुझे जानना चाहिए।

हालांकि, हर नाम मुझे नहीं बताता है जो मुझे जानना चाहिए। कुछ नाम महत्वपूर्ण जानकारी को समझने के लिए प्रकट नहीं होते हैं जो फ़ंक्शन के व्यवहार को नियंत्रित करते हैं और साथ ही उजागर तर्क करते हैं। यह वही है जो प्रोग्रामिंग की कार्यात्मक शैली को आसान बनाता है।

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

इसलिए कृपया यह दावा न करें कि कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग "मौलिक रूप से असंगत" हैं। मैं अपने कार्यात्मक कार्यक्रमों में वस्तुओं का उपयोग कर सकता हूं और मैं अपने OO कार्यक्रमों में शुद्ध कार्यों का उपयोग कर सकता हूं।

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

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

यह कोई नया मुद्दा नहीं है। सालों से लोगों ने "OO भाषाओं" में प्रक्रियात्मक रूप से कोडिंग की है, यह सोचकर कि वे OO कर रहे हैं क्योंकि वे "OO भाषा" का उपयोग करते हैं। कुछ भाषाओं में आप अपने आप को पैर में शूटिंग से दूर रखने में अच्छे हैं। इन विचारों को काम करने के लिए उन्हें आप में रहना होगा।

दोनों अच्छी सुविधाएँ प्रदान करते हैं। आप दोनों कर सकते हैं। यदि आप उन्हें मिश्रण करने के लिए पर्याप्त बहादुर हैं तो कृपया उन्हें स्पष्ट रूप से लेबल करें।


0

मैं विभिन्न प्रतिमानों के सभी नियमों को समझने के लिए कई बार संघर्ष करता हूं। वे कई बार एक-दूसरे के साथ इस स्थिति में होते हैं।

ओओपी एक अनिवार्य प्रतिमान है जो दुनिया में कैंची से चलने के बारे में है जहां खतरनाक चीजें होती हैं।

एफपी एक कार्यात्मक प्रतिमान है जिसमें कोई शुद्ध गणना में पूर्ण सुरक्षा पाता है। यहां कुछ नहीं होता है।

हालांकि, सभी कार्यक्रमों को उपयोगी होने के लिए आवश्यक दुनिया में पुल होना चाहिए। इस प्रकार, कार्यात्मक कोर, अनिवार्य खोल

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

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

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

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