"रचना नहीं करता" का अर्थ क्या है?


35

मैं बहुत सारे ग्रंथों को देखता हूं, विशेष रूप से कार्यात्मक प्रोग्रामिंग ग्रंथों का दावा है कि कुछ सीएस अवधारणाएं "रचना नहीं" करती हैं । उदाहरण हैं: ताले रचना नहीं करते, मठ रचना नहीं करते।

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

क्या कोई यह समझा सकता है कि इस वाक्यांश का क्या अर्थ है जब ऊपर दिए गए दो उदाहरणों (जैसे, ताले और मोनड) में अभिव्यक्तियों का उपयोग किया जाता है?


यह ऑब्जेक्ट एग्रीगेशन की तुलना में फंक्शन कंपोजिशन के करीब है।
एंड्रेस एफ।

मोटे तौर पर और अनौपचारिक रूप से, यदि आपके पास दो अलग-अलग चीजें हैं जो ताले का उपयोग करती हैं, तो उन्हें एक साथ रखना मुश्किल है। (तालों के मामले में,
गतिरोधों

जवाबों:


35

जब लोग कहते हैं कि "X कोई रचना नहीं करता है", तो उनका क्या मतलब होता है "रचना" का अर्थ वास्तव में "एक साथ रखा जाता है", और क्या और कैसे आप उन्हें एक साथ रखते हैं, यह बहुत अलग हो सकता है, जो वास्तव में "X" पर निर्भर करता है।

इसके अलावा, जब वे कहते हैं "रचना नहीं करता है", तो उनका मतलब कुछ अलग चीजें हो सकती हैं:

  1. आप एक साथ दो एक्स को एक साथ नहीं रख सकते हैं, अवधि।
  2. आप दो Xs एक साथ रख सकते हैं, लेकिन परिणाम एक X (IOW: X संरचना के तहत बंद नहीं है ) हो सकता है।
  3. आप दो एक्स को एक साथ रख सकते हैं, लेकिन परिणामस्वरूप एक्स उस तरह से काम नहीं कर सकता है जिस तरह से आप इसकी उम्मीद करते हैं।

# 1 के लिए एक उदाहरण स्कैनर / लेकर्स के साथ पार्सर्स है। आप वाक्यांश "स्कैनर / लेक्सर्स की रचना नहीं करते" सुन सकते हैं। यह वास्तव में सच नहीं है। उनका मतलब है "पार्सर जो एक अलग लेक्सिंग चरण का उपयोग करते हैं वे रचना नहीं करते हैं"।

आप पार्सर्स की रचना क्यों करना चाहेंगे? ठीक है, कल्पना कीजिए कि आप एक IDE विक्रेता हैं जैसे JetBrains, Eclipse Foundation, Microsoft, या Embarcadero, और आप एक वेब फ्रेमवर्क के लिए IDE बनाना चाहते हैं। विशिष्ट वेब विकास में, हम अक्सर भाषाओं का मिश्रण करते हैं। आपके पास <script>ECMAScript वाले तत्वों के साथ HTML फाइलें हैं और<style>सीएसएस युक्त तत्व। आपके पास HTML, कुछ प्रोग्रामिंग भाषा और कुछ टेम्पलेट भाषा मेटासिनटैक्स युक्त टेम्पलेट फाइलें हैं। आप "पायथन", "टेम्पलेट में एम्बेडेड पायथन", "सीएसएस", "HTML के भीतर सीएसएस", "ECMASCript", "HTML के भीतर ECMAScript", "HTML", "HTML" के लिए अलग-अलग वाक्यविन्यास हाइपर लिखना नहीं चाहते। एक टेम्पलेट ", और इतने पर और आगे। आप पायथन के लिए एक सिंटैक्स हाइलाइटर लिखना चाहते हैं, एक HTML के लिए, एक टेम्प्लेट लैंग्वेज के लिए, और फिर तीनों को एक टेम्पलेट फाइल के लिए सिंटैक्स हाइलाइटर में लिखें।

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

एक स्केनरलेस पार्सर, हालांकि, जो केवल पात्रों को पढ़ता है, एक अलग पार्सर के लिए चरित्र धारा को पारित कर सकता है, जो तब इसे वापस सौंप सकता है, इस प्रकार उन्हें रचना करना बहुत आसान हो जाता है।

# 2 के लिए एक उदाहरण उनमें एसक्यूएल प्रश्नों के साथ तार है। आपके पास दो तार हो सकते हैं, जिनमें से प्रत्येक में एक वाक्यात्मक रूप से सही एसक्यूएल क्वेरी है, लेकिन यदि आप दो तारों को मिलाते हैं, तो परिणाम एक वाक्यात्मक सही एसक्यूएल क्वेरी नहीं हो सकता है। इसलिए हमारे पास क्वेरी अल्जेब्रा जैसी है ARel, जो रचना करते हैं।

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


1
दूसरे शब्दों में, "रचना नहीं करता है" का अर्थ है "एक अर्धवृत्त नहीं बनता है" (या, थोड़ा और अधिक दृढ़ता से, एक मोनोइड)।
जॉन पुरडी

मुझे विश्वास नहीं हो रहा है कि अस्मिता की आवश्यकता है, इसलिए मैगमा की तरह (जिसे मैंने लगभग 3 सेकंड पहले सीखा था :
जोर्ग डब्ल्यू मित्तग

हालाँकि, यदि आप किसी से पूछते हैं कि वे क्या कहते हैं जब वे कहते हैं कि "ताले रचना नहीं करते हैं", मुझे पूरा यकीन है कि वे जवाब नहीं देंगे "मेरा मतलब है कि ताले के साथ सही समवर्ती कार्यक्रमों का सेट और रचना ऑपरेशन एक मैग्मा" ।
जोर्ग डब्ल्यू मित्तग

हां, बिल्कुल नहीं। बस एक वैकल्पिक वाक्यांश। मेरे पास यह समझ है कि रचना की "सपाट" भावना को बनाए रखने के लिए सहानुभूति की आवश्यकता है, लेकिन इसे वापस करने के लिए कोई मजबूत तर्क नहीं है।
जॉन पूर्डी

20

संगतता का मतलब है कि आप बड़े घटकों और अधिक जटिल कार्यक्षमता का उत्पादन करने के लिए आसानी से और मज़बूती से प्रोग्राम घटकों को एक साथ जोड़ सकते हैं।

कुछ चीजें जो घटकों को अधिक संयोजक बनाने में मदद करती हैं:

  1. Idempotence। अगर कोई एक ही पैरामीटर मान के साथ कई बार कहा जाता है, तो एक निष्पाद्य फ़ंक्शन हमेशा एक ही आउटपुट या साइड इफेक्ट का उत्पादन करेगा। यह संयोजकता में सुधार करता है क्योंकि फ़ंक्शन कॉल का परिणाम अनुमानित है।

  2. रेफरेंशियल ट्रांसपेरेंसी। एक संदर्भित-पारदर्शी अभिव्यक्ति हमेशा एक ही परिणाम का मूल्यांकन करेगी। यह समान अभिव्यक्ति को एक-दूसरे के लिए प्रतिस्थापित करने की अनुमति देकर, और ताले का उपयोग किए बिना अभिव्यक्ति को एक-दूसरे (यानी अलग-अलग धागे पर) की स्वतंत्र रूप से गणना करने की अनुमति देकर संयोजकता में सुधार करता है

  3. अचल स्थिति। निर्मित होने के बाद एक अपरिवर्तनीय वस्तु की स्थिति को नहीं बदला जा सकता है। यह कंपोज़िबिलिटी को बेहतर बनाता है क्योंकि आप किसी स्थिर फ़ंक्शन या ऑब्जेक्ट पर भरोसा कर सकते हैं, अगर किसी फ़ंक्शन या ऑब्जेक्ट ने ऑब्जेक्ट के निर्माण के बाद कहीं स्थिति बदल दी है।

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

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

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


4
मुझे लगता है कि stackoverflow.com/questions/7040844/… एक अच्छा काम यह समझाता है कि "सन्यासी रचना नहीं करते हैं" शायद इसका मतलब है, हालांकि मैं मानता हूं कि भिक्षु ताले की तुलना में बहुत अधिक योग्य हैं।
Ixrec

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

1
एक मोनाड एक बीजीय संरचना है जिसमें कुछ ऑपरेशन होते हैं। आपने अपने अंतिम पैराग्राफ में IOजो वर्णन किया है वह वह प्रकार है जो कीबोर्ड इनपुट की तरह "स्टेटफुल एक्शन" को पकड़ता है। IOप्रकार के मान , वास्तव में, रचना करते हैं, लेकिन यह संपूर्ण प्रकार IO है जो एक सन्यासी है। यह प्रकार अन्य प्रकारों के साथ रचना नहीं करता है, जैसे कि भिक्षु, कहते हैं, सूची प्रकार। अर्थात्, हम व्यवस्थित रूप से एक प्रकार का उत्पादन नहीं कर सकते हैं IO . Listजो दोनों की तरह IOऔर Listसाथ ही व्यवहार करता है । क्या इसका कोई मतलब है? मुझे यकीन नहीं है कि मैंने इसे अच्छी तरह से समझाया।
तिखन जेल्विस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.