जब हम साइड इफेक्ट से अलग गणना करते हैं तो हम "दुनिया से पूछ" कोड कहां डालते हैं?


10

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

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


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

1
@MarjanVenema, यह एकमात्र विकल्प है जो मेरे दिमाग में भी आता है। केवल सैद्धांतिक दृष्टिकोण से: यदि विधि, अन्यथा साइड-इफ़ेक्ट-फ्री, साइड-इफ़ेक्टिव कॉलबैक को आमंत्रित करती है, तो यह साइड-इफ़ेक्ट हो जाता है। संभवतः मेरा मुद्दा यह है कि मैं मानता हूं कि साइड इफेक्ट्स से अलग होने की गणना के लिए कम्प्यूटेशन को पारदर्शी रूप से पारदर्शी होना आवश्यक है। हालांकि यह आवश्यक नहीं है।
एलेक्सी

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

जवाबों:


1

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

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

एक उच्च-क्रम फ़ंक्शन जिसका शरीर शुद्ध है, उसमें अपरिचित शुद्धता है: http://books.google.com/books?id=Yb8azEfnDYgC&pg=PA143#v=onepage&q&f=false

मैंने इस बारे में लिखा है, इस प्रकार के फंक्शन को संभावित-शुद्ध फंक्शन कहते हैं: http://adamjonrichardson.com/2014/01/13/potentially-pure-functions/

यदि आप फॉल-थ्रू फ़ंक्शंस के साथ संभावित शुद्ध फ़ंक्शन को जोड़ते हैं (जिसमें ब्रांचिंग कंस्ट्रक्शन की कमी होती है और जितना संभव हो उतना कम होता है), एक संयोजन जिसे मैं आइसोलेशन सेट कहता हूं, आप साइड इफेक्ट्स को काफी प्रभावी ढंग से अलग कर सकते हैं और बहुत ही परीक्षण योग्य कोड बना सकते हैं: http: // adamjonrichardson.com/2014/01/15/isolating-side-effects-using-isolation-sets/


0

आप कक्षा में परिणाम को संग्रहीत करते हैं, यह पहली बार में थोड़ा अजीब लगता है, लेकिन परिणाम सरल कोड में होता है। उदाहरण के लिए कॉलर में कोई अस्थायी चर नहीं।

class database_querier
    feature -- queries
        was_previous_query_ok : boolean is
            do
                Result = …
            end

        previous_query_result : string is 
            requires
                was_previous_query_ok
            do
                Result = query_result
            end

    feature -- commands
        query_db (…) is
            do
                …
                query_result = bla
            end

    feature {none} --data
        query_result : string

1
जंगल में एफिल को देखकर प्यार।
एसबीआई

@ एसएसबी यह सिर्फ छद्म कोड है। :-)
ctrl-alt-delor

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