2015-12-19 10 views
47

आधिकारिक दस्तावेज से हिस्सा:रेडक्स: रेड्यूक्स नामक राज्य कार्य क्यों हैं?

यह एक कम करने कहा जाता है क्योंकि यह समारोह के प्रकार है है आप से होकर गुजरेगा Array.prototype.reduce करने के लिए (? कम करने, initialValue)

यह नहीं करता है ' मेरे लिए ज्यादा समझ नहीं है। क्या कोई मुझे समझा सकता है कि उन्हें वास्तव में रेड्यूसर क्यों कहा जाता है? तथ्य यह है कि वे एक डिफ़ॉल्ट मान वापस करते हैं (या उनके पास एक डिफ़ॉल्ट तर्क मान है) उन्हें IMUO reducers नहीं बनाता है।

+3

वे रेड्यूसर बिल्कुल ठीक हैं क्योंकि वे आपके द्वारा 'कम' करने के लिए गुजरने वाले फ़ंक्शन की तरह व्यवहार करते हैं, जिसके पास डिफ़ॉल्ट मान और अन्य मान तक पहुंच है, और आपको अपना संभावित रूप से परिवर्तित डिफ़ॉल्ट मान वापस देता है।'राज्य -> ​​कार्रवाई -> राज्य ' – azium

+1

किसी भी अन्य नाम से गुलाब ... शायद विपणन; नक्शा/कमी अब एक buzzword है ... – dandavis

उत्तर

39

तथ्य यह है कि वे एक डिफ़ॉल्ट मान लौटाते हैं (या उनके पास डिफ़ॉल्ट तर्क मान है) उन्हें IMHO को reducers नहीं बनाता है।

Reducers नहीं डिफ़ॉल्ट मान लौटाते हैं। वे हमेशा राज्य के संचय (पिछले और वर्तमान कार्यों के आधार पर) वापस लौटते हैं।

इसलिए, वे राज्य के reducer के रूप में कार्य करते हैं। प्रत्येक बार एक रेडक्स रेड्यूसर कहा जाता है, राज्य (state, action) कार्रवाई के साथ पारित किया जाता है। यह स्थिति तब कार्रवाई के आधार पर (या संचित) कम हो गई है, और फिर अगला राज्य वापस आ गया है। यह क्लासिक fold या reduce फ़ंक्शन का एक चक्र है।

जैसा @azium state -> action -> state के साथ सम्मिलित हुआ।

+0

धन्यवाद, अब यह मेरे लिए समझ में आता है, मैं थोड़ी देर के लिए खो गया है –

+3

हम इस तर्क से हम्स को reducers के बजाय increasers कहा जाना चाहिए? कोई भी डेटा कभी भी जोड़ा जा रहा है:/lol –

+6

@ जैमी हूबर मुझे लगता है कि आप इस संदर्भ में reducer के अर्थ को थोड़ा याद करते हैं। reducer वस्तुओं का एक धारा (या संग्रह) ले रहा है और उन्हें एक ही आइटम में जोड़ रहा है। इस मामले में, सभी क्रियाएं (समय के माध्यम से) वस्तुओं का संग्रह होती हैं, और राज्य एक ही वस्तु है। सही बात? –

17

यदि आप अपने ऐप में कार्यों की श्रृंखला को एक सूची की तरह मानते हैं, या शायद एक स्ट्रीम की तरह, तो यह अधिक समझ में आ सकता है।

इस काल्पनिक उदाहरण लें:

['apple', 'banana', 'cherry'].reduce((acc, item) => acc + item.length, 0) 

पहला तर्क प्रपत्र (Int, String) => Int के एक समारोह है। शुरुआती मूल्य के साथ, आप reduce पास करते हैं जिसे "रेड्यूसर फ़ंक्शन" कहा जा सकता है, और आपको आइटमों की श्रृंखला को संसाधित करने का नतीजा मिलता है। तो आप कह सकते हैं, रेड्यूसर फ़ंक्शन बताता है कि परिणाम बदलने के लिए प्रत्येक क्रमिक व्यक्तिगत आइटम के साथ क्या किया जाता है। दूसरे शब्दों में, reducer फ़ंक्शन पहले आउटपुट और अगले मान लेता है, और यह अगले आउटपुट की गणना करता है।

यह रेडक्स रेड्यूसर के समान है: यह पिछले राज्य और वर्तमान कार्रवाई को लेता है, और यह अगले राज्य की गणना करता है।

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

अभ्यास में, Redux reducers आम तौर पर ओर्थोगोनल, इस अर्थ में कि किसी दिए गए कार्रवाई के लिए, वे करते हैं में नहीं सभी एक ही गुण में परिवर्तन कर, जो यह आसान अपनी जिम्मेदारियों को विभाजित है और combineReducers साथ उत्पादन एकत्र करने के लिए बनाता है कर रहे हैं।

+0

हां, आप सही हैं, जब मैं एक धारा के बारे में अधिक क्रियाओं के बारे में सोच रहा हूं तो यह अधिक समझ में आता है। कूल, अपमानित है कि! –

+0

इस तरह मैंने शुरुआत में इसे समझ लिया था, लेकिन ऐसा प्रतीत नहीं होता कि मैंने अब तक कितने स्टोर कार्यान्वयन को देखा है ... –

2

लेखक सोचते हैं कि कार्य कम करने के संचयक के रूप में राज्य को लगता है। पूर्व:

Final State = [Action1, Action2, ..., ActionN].reduce(reducer, Initial State); 

फ़ंक्शनल प्रोग्रामिंग से कम फ़ंक्शन आ रहा है, नाम "reducer" भी एफपी से आ रहा है।

मुझे उस नाम का उपयोग करना पसंद नहीं है। क्योंकि मैं कार्रवाई के बाद एक मूल्य के परिणाम के रूप में दुनिया को नहीं देखता हूं। यहां राज्य एक वस्तु है। उदाहरण के लिए:

['eat', 'sleep'] === [addTodo('eat'), addTodo('sleep')].reduce(reducer, []); 

यह प्रसारण कुछ भी नहीं कम करता है। और मुझे परवाह नहीं है कि यह कुछ भी कम करता है या नहीं। ट्रांसड्यूसर के रूप में नामकरण अधिक समझ में आएगा।

3

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

5

जैसा कि पहले से ही उल्लेख किया गया है कि कार्यात्मक प्रोग्रामिंग में एक reducer की अवधारणा से संबंधित है। आपको रेड्यूसर सहायक की मेरियम-वेबस्टर शब्दकोश परिभाषा भी मिल सकती है:

1 ए। एक साथ आकर्षित करने या अभिसरण करने का कारण बनता है: समेकित (सभी प्रश्नों को एक से कम करें)

रेड्यूसर क्रिया को एक ही ऑब्जेक्ट में अनुप्रयोग स्थिति का प्रतिनिधित्व करता है।

+0

मैंने इस स्पष्टीकरण के पक्ष में अपनी टिप्पणी हटा दी, विशेष रूप से अंतिम पंक्ति – PrimeLens

2

कारण है कि यह एक reducer कहा जाता है, क्योंकि आप एक collection of actions और जिस पर इन कार्यों जिसके परिणामस्वरूप final state प्राप्त करने के लिए प्रदर्शन करने के लिए एक initial state (दुकान के) "को कम करने" कर सकता है।

कैसे? कि जवाब देने के लिए, मुझे फिर से एक कम करने को परिभाषित करते हैं:

को कम() विधि एक accumulator के खिलाफ एक function और सरणी के प्रत्येक मूल्य लागू होता है (से बाएँ से दाएं) एक भी करने के लिए इसे कम करने के लिए मूल्य।

और रेडक्स रेड्यूसर क्या करता है?

कम करने के लिए एक शुद्ध function कि वर्तमान स्थिति और एक कार्रवाई की जाती है, और अगले राज्य रिटर्न है। ध्यान दें कि राज्य accumulated है क्योंकि इस स्थिति को बदलने के लिए संग्रह पर प्रत्येक कार्रवाई लागू की जाती है।

तो collection of actions दिया गया है, संग्रह के प्रत्येक मूल्य (बाएं से दाएं) पर reducer लागू किया जाता है। पहली बार, यह initial value देता है। अब इस प्रारंभिक स्थिति पर फिर से reducer लागू किया जाता है और अगले राज्य को वापस करने के लिए पहली कार्रवाई। और अगली संग्रह वस्तु (क्रिया) प्रत्येक बार current state पर next state प्राप्त करने के लिए लागू होती है जब तक यह सरणी के अंत तक नहीं पहुंच जाती। और फिर, आपको the final state मिलता है। कितना मजेदार था वो!

संबंधित मुद्दे