हानिकारक माना गया रिटर्न? क्या इसके बिना कोड कार्यात्मक हो सकता है?


45

ठीक है, इसलिए शीर्षक थोड़ा clickbaity है, लेकिन गंभीरता से मैं एक बता रहा हूं, कुछ समय के लिए किक मत पूछो । मुझे यह पसंद है कि कैसे यह सही वस्तु उन्मुख फैशन में संदेशों के रूप में उपयोग किए जाने वाले तरीकों को प्रोत्साहित करता है । लेकिन यह एक मुश्किल समस्या है जो मेरे सिर के बारे में तेजस्वी है।

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

एक शुद्ध कार्य के दो गुण होते हैं:

  1. एक ही इनपुट के साथ इसे बार-बार कॉल करना हमेशा एक ही परिणाम देता है। इसका तात्पर्य है कि यह अपरिवर्तनीय है। इसका राज्य केवल एक बार निर्धारित होता है।

  2. यह कोई साइड इफेक्ट नहीं पैदा करता है। इसे कॉल करने के कारण होने वाला एकमात्र परिवर्तन परिणाम उत्पन्न कर रहा है।

इसलिए, यदि आप returnपरिणामों को संप्रेषित करने के तरीके के रूप में उपयोग करके शपथ लेते हैं, तो शुद्ध रूप से कार्यात्मक होने के बारे में कैसे जाना जाता है?

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

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

दिन में वापस जाएं, जब डिस्क ड्राइव वास्तव में उनके पास डिस्क थी और एक अंगूठे ड्राइव था जो आपने कार में किया था जब आपकी उंगलियों के साथ स्पर्श करने के लिए पहिया बहुत ठंडा था, तो मुझे सिखाया गया था कि कैसे कष्टप्रद लोग उन कार्यों पर विचार करते हैं जिनके पास पैरामीटर हैं। void swap(int *first, int *second)इतना आसान लग रहा था लेकिन हमें उन कार्यों को लिखने के लिए प्रोत्साहित किया गया था जो परिणाम लौटाते थे। इसलिए मैंने इसे विश्वास में लिया और इसका अनुसरण करना शुरू किया।

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

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

मैं वास्तव में क्या पूछना चाहता हूँ:

क्या returnयह सब साइड इफेक्ट दुख से बचने और ताले के बिना धागा सुरक्षा प्राप्त करने का एकमात्र तरीका है, या क्या मैं बता सकता हूं, विशुद्ध रूप से कार्यात्मक तरीके से नहीं पूछें ?


3
यदि आप कमांड क्वेरी पृथक्करण को अनदेखा नहीं करने का चयन करते हैं, तो क्या आप अपनी समस्या को हल करने पर विचार करेंगे?
फेरी

30
इस बात पर विचार करें कि किक पर खुद को ढूंढना एक संकेत हो सकता है कि आप प्रत्येक विशिष्ट स्थिति के पेशेवरों और विपक्षों के तर्क के बजाय हठधर्मिता से प्रेरित डिजाइन में संलग्न हैं।
ब्लर एफएल

3
सामान्य तौर पर जब लोग "वापसी" के बारे में बात करते हैं, तो हानिकारक होने के कारण वे कहते हैं कि यह संरचित प्रोग्रामिंग के खिलाफ है, कार्यात्मक नहीं है, और दिनचर्या के अंत में एक भी वापसी बयान (और शायद दोनों के अंत में अगर / अन्यथा ब्लॉक है कि अपने आप में अंतिम तत्व है) इसमें शामिल नहीं है।
रैंडम 832

16
@jameslarge: मिथ्या द्वंद्ववाद। अपने आप को हठधर्मी सोच द्वारा डिजाइन करने के लिए प्रेरित करने की अनुमति नहीं देना वाइल्ड वेस्ट के रूप में एक ही बात नहीं है / सब कुछ आप के बारे में बात कर रहे हैं दृष्टिकोण जाता है। मुद्दा यह है कि हठधर्मिता को अच्छे, सरल, स्पष्ट कोड के रास्ते में नहीं आने दिया जाए। सार्वभौमिक कानून अभावों के लिए है; संदर्भ राजाओं के लिए है।
निकोल बोलस

4
मेरे लिए एक बात है जो आपके प्रश्न में अस्पष्ट है: आप कहते हैं कि आपने 'वापसी' का उपयोग करके शपथ ली है, लेकिन जहां तक ​​मैं आपको बता सकता हूं कि यह स्पष्ट रूप से आपके अन्य अवधारणाओं से संबंधित नहीं है या कहें कि आपने ऐसा क्यों किया है। जब परिणाम उत्पन्न करने सहित एक शुद्ध कार्य की परिभाषा के साथ संयुक्त, आप कुछ ऐसा बनाते हैं जो हल करना असंभव है।
दानिकोव

जवाबों:


96

यदि किसी फ़ंक्शन का कोई साइड इफेक्ट नहीं है और यह कुछ भी वापस नहीं करता है, तो फ़ंक्शन बेकार है। यह बहुत ही सरल है।

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

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

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

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

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


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

12
@LightnessRacesinOrbit: शांत मोड में grep में एक प्रक्रिया वापसी कोड है जिसका उपयोग किया जाएगा। अगर ऐसा नहीं होता, तो यह वास्तव में बेकार होगा
unperson325680

10
@progo: एक रिटर्न कोड एक साइड इफेक्ट नहीं है; यह प्रभाव। जिसे हम साइड इफ़ेक्ट कहते हैं उसे साइड इफ़ेक्ट कहा जाता है क्योंकि यह रिटर्न कोड नहीं है;)
मोनिका के साथ लाइटनेस दौड़

8
@ ऐसी बात है। दुष्प्रभावों के बिना एक कार्यक्रम बेकार है।
जेन्स स्काउडर

5
@ मैथ्रेडलर यह एक साइड इफेक्ट है :)
एंड्रेस एफ।

32

बताओ, मत पूछो कुछ मौलिक मान्यताओं के साथ आता है:

  1. आप वस्तुओं का उपयोग कर रहे हैं।
  2. आपकी वस्तुओं में राज्य है।
  3. आपकी वस्तुओं की स्थिति उनके व्यवहार को प्रभावित करती है।

इनमें से कोई भी चीज शुद्ध कार्यों पर लागू नहीं होती है।

तो चलो समीक्षा करते हैं कि हमारे पास नियम क्यों है "बताओ, मत पूछो।" यह नियम एक चेतावनी और अनुस्मारक है। इसे इस तरह संक्षेप में प्रस्तुत किया जा सकता है:

अपनी कक्षा को अपनी स्थिति का प्रबंधन करने दें। इसे अपने राज्य के लिए न कहें, और फिर उस स्थिति के आधार पर कार्रवाई करें। कक्षा को बताएं कि आप क्या चाहते हैं, और यह तय करने दें कि उसके अपने राज्य के आधार पर क्या करना है।

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

से फाउलर :

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

पुनरावृत्ति करने के लिए, इसमें से किसी का भी शुद्ध कार्यों से कोई लेना-देना नहीं है, या यहां तक ​​कि अशुद्ध भी हैं जब तक कि आप बाहरी दुनिया के लिए एक वर्ग की स्थिति को उजागर नहीं कर रहे हैं। उदाहरण:

TDA उल्लंघन

var color = trafficLight.Color;
var elapsed = trafficLight.Elapsed;
If (color == Color.Red && elapsed > 2.Minutes)
    trafficLight.ChangeColor(green);

TDA उल्लंघन नहीं

var result = trafficLight.ChangeColor(Color.Green);

या

var result = await trafficLight.ChangeColorWhenReady(Color.Green);     

बाद के दोनों उदाहरणों में, ट्रैफ़िक लाइट अपने राज्य और इसके कार्यों पर नियंत्रण बनाए रखती है।


एक सेकंड रुको, क्लोजर शुद्ध हो सकता है। उनके पास राज्य है (वे इसे शाब्दिक गुंजाइश कहते हैं)। और यह शाब्दिक गुंजाइश उनके व्यवहार को प्रभावित कर सकती है। क्या आप सुनिश्चित हैं कि वस्तुओं के शामिल होने पर TDA केवल प्रासंगिक है?
कैंडिड_ऑरेंज

7
यदि आप बंद-ओवर बाइंडिंग को संशोधित नहीं करते हैं तो @CiediedOrange क्लोजर केवल शुद्ध हैं। अन्यथा आप क्लोजर से लौटाए गए फ़ंक्शन को कॉल करते समय संदर्भात्मक पारदर्शिता खो देते हैं।
जारेड स्मिथ

1
जब आप ऑब्जेक्ट्स के बारे में बात कर रहे हों तो @JaredSmith और वही सच नहीं है? क्या यह केवल अपरिहार्यता का मुद्दा नहीं है?
कैंडिड_ओरेंज

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

1
"सिली", जैसा कि "अन्य वस्तुओं को न खोलें और उनकी हिम्मत न देखें, बल्कि अपनी खुद की हिम्मत (यदि आपके पास कोई है) को अन्य वस्तुओं के तरीकों में फैलाएं; यही तरीका है" -silly।
जोकर_vD

30

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

आप केवल इसकी आंतरिक स्थिति के लिए नहीं पूछते हैं, आप यह नहीं पूछते हैं कि इसकी आंतरिक स्थिति या तो है।

यह भी बताओ, मत पूछो! रिटर्न वैल्यू के रूप में परिणाम प्राप्त नहीं करता है ( returnविधि के अंदर एक बयान द्वारा प्रदान किया गया है)। इसका मतलब यह है कि मुझे परवाह नहीं है कि आप इसे कैसे करते हैं, लेकिन उस प्रसंस्करण को करें! । और कभी-कभी आप तुरंत कार्यवाही का परिणाम चाहते हैं ...


1
CQS हालांकि इसका मतलब यह होगा कि राज्य को संशोधित करना और परिणाम प्राप्त करना अलग होना चाहिए
jk।

7
@jk। हमेशा की तरह: आम तौर पर आपको राज्य परिवर्तन को अलग करना चाहिए और परिणाम लौटाना चाहिए लेकिन दुर्लभ मामलों में इसे संयोजित करने के लिए वैध कारण हैं। उदाहरण: एक पुनरावृत्तियों next()विधि को केवल वर्तमान ऑब्जेक्ट को वापस नहीं करना चाहिए, बल्कि पुनरावृत्तियों को आंतरिक स्थिति में भी बदलना चाहिए ताकि अगली कॉल अगली वस्तु लौटाए ...
टिमोथी ट्रॉपल

4
ठीक ठीक। मुझे लगता है कि ओपी की समस्या केवल गलतफहमी / गलतफहमी के कारण है "बताओ, मत पूछो"। और उस गलतफहमी को ठीक करने से समस्या दूर हो जाती है।
कोनराड रुडोल्फ

@KonradRudolph Plus, मुझे नहीं लगता कि यहां केवल गलतफहमी है। एक "शुद्ध कार्य" के उनके विवरण में "इसका राज्य केवल एक बार सेट किया गया है" शामिल है। एक और टिप्पणी यह ​​इंगित करती है कि इसका मतलब बंद होने का संदर्भ हो सकता है, लेकिन यह वाक्यांश मुझे अजीब लगता है।
इज़काता

17

यदि आप return"हानिकारक" (अपनी तस्वीर में रहने के लिए) के रूप में मानते हैं , तो इसके बजाय एक फ़ंक्शन बनाने की तरह

ResultType f(InputType inputValue)
{
     // ...
     return result;
}

इसे संदेश-पास करने के तरीके से बनाएँ:

void f(InputType inputValue, Action<ResultType> g)
{
     // ...
     g(result);
}

जब तक fऔर gसाइड-इफ़ेक्ट फ्री होते हैं, तब तक साथ में उनका पीछा करना साइड-इफ़ेक्ट फ्री होगा। मुझे लगता है कि इस शैली को कंटिन्यू-पासिंग स्टाइल भी कहा जाता है

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

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


24
If this really leads to "better" programs is debatableहमें केवल इस शताब्दी के पहले दशक के दौरान जावास्क्रिप्ट में लिखे गए कोड को देखना है। Jquery और इसके प्लगइन्स इस प्रतिमान कॉलबैक ... कॉलबैक हर जगह थे । एक निश्चित बिंदु पर, बहुत से नेस्टेड कॉलबैक ने एक बुरे सपने को खत्म कर दिया। सॉफ्टवेयर इंजीनियरिंग और उसके "सिद्धांतों" की विलक्षणताओं की परवाह किए बिना कोड अभी भी मनुष्यों द्वारा पढ़ा जाना है
Laiv

1
फिर भी कुछ बिंदु पर आपको एक कार्रवाई प्रदान करने की आवश्यकता होती है जो एक साइड इफेक्ट करती है या आपको सीपीएस भाग
पीके से

12
@Laiv CPS को संकलक के लिए एक अनुकूलन तकनीक के रूप में आविष्कार किया गया था, किसी को भी वास्तव में प्रोग्रामर को इस तरह से कोड को हाथ से लिखने की उम्मीद नहीं थी।
जोकर_vD

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

2
Hypothetically, निश्चित रूप से, आप अपने पूरे एप्लिकेशन को फ़ंक्शन कॉल की एक श्रृंखला के रूप में लिख सकते हैं जो कुछ भी वापस नहीं करते हैं। यदि आप इसे कसकर युग्मित होने का बुरा नहीं मानते हैं, तो आपको बंदरगाहों की भी आवश्यकता नहीं है। लेकिन अधिकांश समझदार अनुप्रयोग ऐसे कार्यों का उपयोग करते हैं जो चीजों को वापस करते हैं, क्योंकि ... ठीक है, वे समझदार हैं। और जैसा कि मुझे लगता है कि मैंने अपने उत्तर में पर्याप्त रूप से प्रदर्शन किया है, आप returnकार्यों से डेटा ले सकते हैं और फिर भी टेल डोन्ट आस्क का पालन नहीं कर सकते हैं, इसलिए जब तक आप किसी वस्तु की स्थिति का आदेश नहीं देते हैं।
रॉबर्ट हार्वे

7

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

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

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


5

यह पूरा प्रश्न मुझे 'स्तर के उल्लंघन' के रूप में बताता है।

आपके पास एक प्रमुख परियोजना में निम्न स्तर (कम से कम) हैं:

  • ई-कॉमर्स प्लेटफॉर्म जैसे सिस्टम स्तर
  • उप-सिस्टम स्तर जैसे उपयोगकर्ता सत्यापन: सर्वर, AD, फ्रंट-एंड
  • व्यक्तिगत कार्यक्रम स्तर उदाहरण के लिए उपरोक्त घटकों में से एक
  • अभिनेता / मॉड्यूल स्तर [यह भाषा के आधार पर मुखर हो जाता है]
  • विधि / कार्य स्तर।

और इसलिए नीचे व्यक्तिगत टोकन के लिए।

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


2

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

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

इस दृष्टिकोण का एक उदाहरण पायथन बिल्डिन tupleऔर frozensetडेटा प्रकारों में है। यहाँ एक फ्रोज़ेनसेट का विशिष्ट उपयोग है:

small_digits = frozenset([0, 1, 2, 3, 4])
big_digits = frozenset([5, 6, 7, 8, 9])
all_digits = small_digits.union(big_digits)

print("small:", small_digits)
print("big:", big_digits)
print("all:", all_digits)

जो निम्नलिखित को प्रिंट करेगा, यह दर्शाता है कि संघ पद्धति पुरानी वस्तुओं को प्रभावित किए बिना अपने स्वयं के राज्य के साथ एक नया फ्रेज़ेनसेट बनाती है:

छोटा: फ्रोज़ेनसेट ({0, 1, 2, 3, 4})

बड़ा: फ्रोज़ेनसेट ({5, 6, 7, 8, 9})

सभी: फ्रोज़ेनसेट ({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

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


1

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

मैं अपनी पूरी कोशिश कर रहा हूं कि कुछ लाभों का सामंजस्य बिठाऊं, अधिक विशेष रूप से, जरूरी और कार्यात्मक प्रोग्रामिंग (स्वाभाविक रूप से जो भी लाभ नहीं मिल रहा है, लेकिन दोनों के शेर का हिस्सा पाने की कोशिश कर रहा है), हालांकि returnवास्तव में ऐसा करने के लिए मौलिक है कई मामलों में मेरे लिए एक सीधा फैशन।

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

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

नोडल पाइपलाइन

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

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

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

यह काम किस प्रकार करता है

तो स्पष्ट करने के लिए मैं कल्पना कर रहा था कि आप वास्तव में यह कैसे कार्यक्रम करते हैं। जिस तरह से मैं इसे काम कर रहा था वह वास्तव में उपयोगकर्ता-अंत (प्रोग्रामर के) वर्कफ़्लो को कैप्चर करने के ऊपर आरेख था। आप दुनिया में एक ट्रैफिक लाइट को खींच सकते हैं, एक टाइमर को खींच सकते हैं, इसे एक लम्बी अवधि ("निर्माण" करने पर) दे सकते हैं। टाइमर में एक On Intervalईवेंट (आउटपुट पोर्ट) होता है, आप उसे ट्रैफ़िक लाइट से कनेक्ट कर सकते हैं ताकि इस तरह की घटनाओं पर वह अपने रंगों के माध्यम से प्रकाश को साइकिल से बता सके।

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

और वे पूरी तरह से अपने राज्य को घेर लेते हैं और इसके बारे में कुछ भी नहीं बताते हैं (जब तक कि इन "घटनाओं" को टीएमआई नहीं माना जाता है, जिस बिंदु पर मुझे चीजों को बहुत पुनर्विचार करना होगा), वे एक-दूसरे को अप्रत्यक्ष रूप से करने के लिए कहते हैं, वे नहीं पूछते हैं। और वे डिग गए। इस सामान्यीकृत इनपुट / आउटपुट पोर्ट अमूर्त को छोड़कर कुछ के बारे में कुछ भी नहीं पता है।

व्यावहारिक उपयोग के मामले?

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

सिग्नल और स्लॉट

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


0

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

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


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