अपरिवर्तनीयता का एक विपरीत दृष्टिकोण
TL / DR: अपरिवर्तनशीलता जावास्क्रिप्ट में एक आवश्यकता से अधिक एक फैशन प्रवृत्ति है। यदि आप प्रतिक्रिया का उपयोग कर रहे हैं, तो यह राज्य प्रबंधन में कुछ भ्रमित डिजाइन विकल्पों के लिए एक साफ-सुथरा काम प्रदान करता है । हालांकि अधिकांश अन्य स्थितियों में यह उस जटिलता का पर्याप्त मूल्य नहीं जोड़ सकता है जो इसे पेश करता है, एक वास्तविक ग्राहक की आवश्यकता को पूरा करने के लिए एक फिर से शुरू करने के लिए अधिक सेवा प्रदान करता है।
लंबे उत्तर: नीचे पढ़ें।
जावास्क्रिप्ट में अपरिवर्तनशीलता इतनी महत्वपूर्ण (या आवश्यक) क्यों है?
खैर, मुझे खुशी है कि आपने पूछा है!
पहले एक बहुत प्रतिभाशाली बुलाया पुरुष कुछ समय दान अब्रामोव लिखा नामक एक जावास्क्रिप्ट राज्य प्रबंधन पुस्तकालय Redux जो शुद्ध कार्य करता है और अचल स्थिति का उपयोग करता है। उन्होंने कुछ बहुत अच्छे वीडियो बनाए, जिन्होंने इस विचार को समझना (और बेचना) को वास्तव में आसान बना दिया।
समय एकदम सही था। एंगुलर की नवीनता फीकी पड़ रही थी, और जावास्क्रिप्ट दुनिया नवीनतम चीज़ को ठीक करने के लिए तैयार थी जिसमें ठंड की सही डिग्री थी, और यह लाइब्रेरी न केवल अभिनव थी, बल्कि रिएक्ट के साथ पूरी तरह से स्लेटेड थी जिसे एक अन्य सिलिकॉन वैली पावरहाउस द्वारा पेडेड किया जा रहा था ।
दुःख की बात यह है कि, जावास्क्रिप्ट की दुनिया में शासन चलता है। अब अब्रामोव को एक लोकतंत्र के रूप में प्रतिष्ठित किया जा रहा है और हम सभी लोगों को नश्वरता के प्रति अपने आप को अधीन करना होगा ... वेदर यह समझ में आता है या नहीं।
वस्तुओं को बदलने में क्या गलत है?
कुछ भी तो नहीं!
वास्तव में प्रोग्रामर एर के लिए वस्तुओं को म्यूट करते रहे हैं ... जब तक कि वस्तुओं को म्यूट करना है। दूसरे शब्दों में आवेदन के विकास के 50+ वर्ष ।
और चीजों को जटिल क्यों? जब आपके पास वस्तु है cat
और यह मर जाता है, तो क्या आपको वास्तव cat
में परिवर्तन को ट्रैक करने के लिए दूसरे की आवश्यकता है ? ज्यादातर लोग बस कहते हैं cat.isDead = true
और इसके साथ किया जाएगा।
चीजों को सरल नहीं बनाता है?
हाँ! .. बिलकुल यह करता है!
विशेष रूप से जावास्क्रिप्ट में, जो व्यवहार में सबसे उपयोगी है कुछ राज्य के दृश्य को प्रस्तुत करने के लिए उपयोग किया जाता है जो कहीं और (जैसे डेटाबेस में) बनाए रखा जाता है।
क्या होगा यदि मेरे पास एक नया समाचार ऑब्जेक्ट है जिसे अपडेट किया जाना है? ... मैं इस मामले में कैसे हासिल करूं? दुकान हटाएं और इसे फिर से बनाएँ? सरणी के लिए एक वस्तु को जोड़ना एक कम महंगा ऑपरेशन नहीं है?
ठीक है, आप पारंपरिक दृष्टिकोण पर जा सकते हैं और News
ऑब्जेक्ट को अपडेट कर सकते हैं , इसलिए आपका उस ऑब्जेक्ट का इन-मेमोरी प्रतिनिधित्व बदल जाता है (और उपयोगकर्ता को प्रदर्शित किया गया दृश्य, या ऐसा करने की उम्मीद है) ...
या वैकल्पिक रूप से ...
आप सेक्सी FP / Immutability दृष्टिकोण की कोशिश कर सकते हैं और हर ऐतिहासिक परिवर्तन को ट्रैक करने वाली एक सरणी में News
ऑब्जेक्ट में अपने परिवर्तनों को जोड़ सकते हैं ताकि आप सरणी के माध्यम से पुनरावृति कर सकें और यह पता लगा सकें कि सही राज्य प्रतिनिधित्व क्या होना चाहिए (phew!)।
मैं सीखने की कोशिश कर रहा हूं कि यहां क्या है। कृपया मुझे बताएं :)
दोस्त आते हैं और जाते हैं। एक बिल्ली की त्वचा के कई तरीके हैं।
मुझे खेद है कि आपको प्रोग्रामिंग प्रतिमानों के लगातार बदलते सेट का भ्रम सहना पड़ता है। लेकिन अरे, क्लब में आपका स्वागत है !!
अब महत्वपूर्ण बिंदुओं की एक जोड़ी के साथ याद रखने की क्षमता, और आप इन पर आप को बुखार की तीव्रता के साथ फेंक दिया जाएगा कि केवल भोलेपन ही कर सकते हैं।
1) बहु-थ्रेडेड वातावरणों में दौड़ की स्थिति से बचने के लिए इम्युनिटी कमाल की है ।
बहु-थ्रेडेड वातावरण (जैसे C ++, जावा और C #) वस्तुओं को लॉक करने के अभ्यास के लिए दोषी हैं जब एक से अधिक धागा उन्हें बदलना चाहते हैं। यह प्रदर्शन के लिए बुरा है, लेकिन डेटा भ्रष्टाचार के विकल्प से बेहतर है। और फिर भी सब कुछ अपरिवर्तनीय बनाने में उतना अच्छा नहीं है (प्रभु स्तुति हास्केल!)।
लेकिन अफसोस! जावास्क्रिप्ट में आप हमेशा एक ही धागे पर काम करते हैं । यहां तक कि वेब कर्मचारी (प्रत्येक एक अलग संदर्भ के अंदर चलता है )। इसलिए जब से आप अपने निष्पादन संदर्भ (उन सभी प्यारे वैश्विक चर और करीबी) के अंदर एक थ्रेड से संबंधित दौड़ की स्थिति नहीं रख सकते हैं, तो Immutability के पक्ष में मुख्य बिंदु खिड़की से बाहर चला जाता है।
(करने के बाद ही कहा, वहाँ है वेब श्रमिकों, जो है कि आप मुख्य थ्रेड पर वस्तुओं के साथ नगण्य के बारे में कोई उम्मीदों होगा में शुद्ध फ़ंक्शन का उपयोग करने के लिए एक लाभ।)
2) अपरिहार्यता (किसी तरह) आपके ऐप की स्थिति में दौड़ की स्थिति से बच सकती है।
और यहां इस मामले का असली क्रैक्स है, अधिकांश (रिएक्ट) डेवलपर्स आपको बताएंगे कि Immutability और FP किसी भी तरह से इस जादू को काम कर सकते हैं जो आपके एप्लिकेशन की स्थिति को पूर्वानुमेय बनने की अनुमति देता है।
बेशक इसका मतलब यह नहीं है कि आप डेटाबेस में दौड़ की स्थिति से बच सकते हैं , इसे खींचने के लिए आपको सभी ब्राउज़रों में सभी उपयोगकर्ताओं को समन्वित करना होगा , और इसके लिए आपको वेब- पॉकेट जैसी बैक-एंड पुश तकनीक की आवश्यकता होगी ( नीचे इस पर अधिक) जो ऐप चलाने वाले सभी लोगों के लिए परिवर्तनों को प्रसारित करेगा।
न ही इसका मतलब यह है कि जावास्क्रिप्ट में कुछ अंतर्निहित समस्या है जहां आपके एप्लिकेशन की स्थिति को पूर्वानुमेयता की आवश्यकता है, ताकि कोई भी डेवलपर जो प्रतिक्रिया से पहले फ्रंट-एंड एप्लिकेशन को कोड कर रहा हो, आपको यह बताएगा।
इसके बजाय भ्रमित करने वाले दावे का सीधा सा अर्थ है कि प्रतिक्रिया के साथ आपकी एप्लिकेशन स्थिति दौड़ की स्थिति के लिए अधिक प्रवण हो जाएगी , लेकिन यह अपरिवर्तनीयता आपको उस दर्द को दूर ले जाने की अनुमति देती है। क्यों? क्योंकि प्रतिक्रिया विशेष है .. इसका एक अत्यधिक अनुकूलित रेंडरिंग लाइब्रेरी के रूप में डिज़ाइन किया गया है जिसमें सुसंगत राज्य प्रबंधन दूसरे स्थान पर है, और इस तरह घटक राज्य को घटनाओं की एक अतुल्यकालिक श्रृंखला (उर्फ "वन-वे डेटा बाइंडिंग") के माध्यम से प्रबंधित किया जाता है, जिसका आपके पास कोई नियंत्रण नहीं है। खत्म हो और आप पर निर्भर करते हुए याद रखें कि सीधे राज्य को म्यूट न करें ...
इस संदर्भ को देखते हुए, यह देखना आसान है कि कैसे अपरिवर्तनीयता की आवश्यकता जावास्क्रिप्ट के साथ बहुत कम है और प्रतिक्रिया में दौड़ की स्थिति के साथ बहुत कुछ करना है: यदि आपके आवेदन में अंतर-निर्भर परिवर्तनों का एक गुच्छा है और यह पता लगाने का कोई आसान तरीका नहीं है। आपका राज्य वर्तमान में है, आप भ्रमित हो रहे हैं , और इस प्रकार यह हर ऐतिहासिक परिवर्तन को ट्रैक करने के लिए अपरिवर्तनीयता का उपयोग करने के लिए सही समझ में आता है ।
3) दौड़ की स्थिति स्पष्ट रूप से खराब है।
ठीक है, वे हो सकता है अगर आप प्रतिक्रिया का उपयोग कर रहे हैं। लेकिन वे दुर्लभ हैं यदि आप एक अलग रूपरेखा उठाते हैं।
इसके अलावा, आप आम तौर पर ... से निपटने के लिए बड़ी समस्याएं हैं। निर्भरता नरक जैसी समस्याएं। एक फूला हुआ कोड-आधार की तरह। जैसे आपका CSS लोड नहीं हो रहा है। एक धीमी निर्माण प्रक्रिया की तरह या एक अखंड बैक-एंड से चिपके रहना जो कि लगभग असंभव बनाता है। जैसे अनुभवहीन देवता समझ नहीं पाते हैं कि क्या हो रहा है और कुछ गड़बड़ कर रहा है।
तुम्हे पता हैं। वास्तविकता। लेकिन हे, कौन परवाह करता है?
4) हर राज्य परिवर्तन पर नज़र रखने के प्रदर्शन प्रभाव को कम करने के लिए अपरिवर्तनीयता संदर्भ प्रकारों का उपयोग करती है ।
क्योंकि गंभीरता से, यदि आप हर बार अपने राज्य में परिवर्तन करने वाले सामान की प्रतिलिपि बनाने जा रहे हैं, तो आप बेहतर तरीके से सुनिश्चित करते हैं कि आप इसके बारे में स्मार्ट हैं।
5) अपरिवर्तनीयता आपको UNDO सामान की अनुमति देती है ।
क्योंकि एर .. यह नंबर एक फीचर है जो आपके प्रोजेक्ट मैनेजर के लिए पूछने जा रहा है, है ना?
6) अपरिवर्तनीय स्थिति में वेबसॉकेट के साथ संयोजन में बहुत सारी संभावनाएं हैं
अंतिम लेकिन कम से कम, राज्य डेल्टास का संचय वेबस्केट के साथ संयोजन में एक बहुत ही सम्मोहक मामला बनाता है, जो अपरिवर्तनीय घटनाओं के प्रवाह के रूप में राज्य के एक आसान उपभोग के लिए अनुमति देता है ...
एक बार पेनी इस अवधारणा पर चला जाता है ( घटनाओं का एक प्रवाह होने के नाते राज्य - नवीनतम दृश्य का प्रतिनिधित्व करने वाले रिकॉर्ड के एक कच्चे सेट के बजाय), अपरिवर्तनीय दुनिया में रहने के लिए एक जादुई जगह बन जाती है। घटना-रहित आश्चर्य और संभावना की एक भूमि जो समय को पार करती है । और जब किया सही यह निश्चित वास्तविक समय एप्लिकेशन easi कर सकते हैं एर पूरा करने के लिए, तो आप सिर्फ इसलिए वे कर सकते हैं रुचि हर किसी के लिए घटनाओं के प्रवाह को प्रसारित अपने स्वयं के प्रतिनिधित्व के निर्माण की और सांप्रदायिक प्रवाह में अपने स्वयं के परिवर्तन वापस लिखें।
लेकिन कुछ बिंदु पर आप जागते हैं और महसूस करते हैं कि सभी आश्चर्य और जादू मुफ्त में नहीं आते हैं। अपने उत्सुक सहयोगियों के विपरीत, आपके हितधारकों (हाँ, जो लोग आपको भुगतान करते हैं) दर्शन या फैशन के बारे में बहुत कम ध्यान रखते हैं और बहुत सारे पैसे वे एक उत्पाद बनाने के लिए भुगतान करते हैं जो वे बेच सकते हैं। और लब्बोलुआब यह है कि अपरिवर्तनीय कोड को लिखना कठिन है और इसे तोड़ने के लिए आसान है, इसके अलावा अगर आपके पास समर्थन करने के लिए बैक-एंड नहीं है तो एक अपरिवर्तनीय फ्रंट-एंड होने की बहुत कम बात है। कब और कब!) आप अंत में अपने हितधारकों को समझाते हैं कि आपको वेबसॉक जैसी पुश टेक्नॉलॉजी के माध्यम से घटनाओं को प्रकाशित और उपभोग करना चाहिए , आपको पता चलता है कि उत्पादन में पैमाने पर क्या दर्द है ।
अब कुछ सलाह के लिए, क्या आपको इसे स्वीकार करना चाहिए।
एफपी / इम्यूटेबिलिटी का उपयोग करके जावास्क्रिप्ट लिखने का विकल्प आपके आवेदन कोड-बेस को बड़ा, अधिक जटिल और प्रबंधन करने के लिए कठिन बनाने के लिए भी एक विकल्प है। मैं आपके Redux रिड्यूसर्स तक इस दृष्टिकोण को सीमित करने के लिए दृढ़ता से तर्क दूंगा, जब तक कि आप नहीं जानते कि आप क्या कर रहे हैं ... और यदि आप आगे बढ़ने वाले हैं और बिना किसी परवाह के उपयोग करते हैं, तो अपने पूरे आवेदन स्टैक में अपरिवर्तनीय स्थिति लागू करें , और न केवल क्लाइंट-साइड, जैसा कि आप इसका वास्तविक मूल्य याद कर रहे हैं अन्यथा।
अब, यदि आप भाग्यशाली हैं कि आप अपने काम में विकल्प बनाने में सक्षम हैं, तो कोशिश करें और अपनी बुद्धि का उपयोग करें (या नहीं) और उस व्यक्ति द्वारा सही करें जो आपको भुगतान कर रहा है । आप इसे अपने अनुभव पर, अपने पेट पर, या अपने आस-पास चल रहे व्हाट्सएप पर आधार बना सकते हैं (बेशक अगर हर कोई रिएक्ट / रिडक्स का उपयोग कर रहा है तो एक वैध तर्क है कि आपके काम को जारी रखने के लिए संसाधन खोजना आसान होगा) .. वैकल्पिक रूप से, आप या तो कोशिश कर सकते हैं फिर से शुरू प्रेरित विकास या प्रचार प्रेरित विकास दृष्टिकोण। वे आपकी तरह की चीज हो सकती हैं।
संक्षेप में, बात अचल स्थिति के लिए कहा जा सकता है कि यह है जाएगा जिसके द्वारा इंगित आप आगे बढ़ने के लिए खुशी होगी यदि आप अपने साथियों के साथ फैशनेबल बनाने के लिए, कम से कम जब तक अगले सनक के आसपास आता है,।
अब स्व-चिकित्सा के इस सत्र के बाद मैं यह बताना चाहूंगा कि मैंने इसे अपने ब्लॉग में एक लेख = = जावास्क्रिप्ट में अपरिवर्तनीयता: एक कंट्रेरियन व्यू के रूप में जोड़ा है । अगर आप अपनी छाती को भी बंद करना चाहते हैं, तो मजबूत भावनाओं को महसूस करने के लिए बेझिझक जवाब दें।