राज्य, म्यूटेबल स्टेट और अपरिवर्तनीय राज्य क्या है?


32

यह एक नौसिखिया प्रश्न है, लेकिन मुझे Google पर एक नौसिखिया-प्रूफ पर्याप्त उत्तर नहीं मिला।

जब वे 'स्टेट' कहते हैं तो लोग क्या कहते हैं - सामान्य रूप से प्रोग्रामिंग में, और ओओ प्रोग्रामिंग में विशेष रूप से?

इसके अलावा, क्या परिवर्तनशील और अपरिवर्तनीय अवस्था है - फिर से, आमतौर पर प्रोग्रामिंग में और विशेष रूप से ओओपी में?


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

जवाबों:


46

आपके पास उस समय होता है जब आप मूल्यों (संख्याओं, तारों, जटिल डेटा संरचनाओं) को एक पहचान और एक समय में जोड़ते हैं।

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

राज्य रखने के लिए आपको एक ऐसी दुनिया पर विचार करना होगा, जिसमें ये शुद्ध मूल्य किसी तरह की संस्थाओं से जुड़े हों, जो एक पहचान रखते हों । पहचान एक आदिम विचार है: इसका मतलब है कि आप किसी भी अन्य गुण के बिना दो चीजों को अलग कर सकते हैं। उदाहरण के लिए, एक ही मॉडल की दो कारें, एक ही रंग, ... दो अलग-अलग कारें हैं।

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

("colour", "blue")

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

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

("colour", "blue")

कल मैं इसे फिर से काले रंग में बदल दूंगा और नया राज्य होगा

("colour", "black")

ध्यान दें कि एक इकाई की स्थिति बदल सकती है, लेकिन इसकी पहचान परिभाषा से नहीं बदलती है। ठीक है, जब तक इकाई मौजूद है, निश्चित रूप से: एक कार बनाई और नष्ट की जा सकती है, लेकिन यह पूरे जीवनकाल में अपनी पहचान बनाए रखेगा। किसी चीज़ की पहचान के बारे में बोलने का कोई मतलब नहीं है जो अभी तक मौजूद नहीं है / कोई और।

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

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

एक विकल्प के रूप में एक इकाई (संभवतः अनंत अनुक्रम) के रूप में एक इकाई के बाद के राज्यों (इतिहास) को देखने के लिए एक विकल्प है, उदाहरण के लिए SICP के अध्याय 3 देखें । इस स्थिति में, प्रत्येक स्नैपशॉट को एक अलग मेमोरी स्थान पर संग्रहीत किया जाता है, और प्रोग्राम एक ही समय में विभिन्न स्नैपशॉट की जांच कर सकता है। अप्रयुक्त स्नैपशॉट्स को कचरा एकत्र किया जा सकता है जब उन्हें अब आवश्यकता नहीं होती है।

दो दृष्टिकोण के लाभ / हानि

  • दृष्टिकोण 1 कम मेमोरी का उपभोग करता है और नए स्नैपशॉट को अधिक कुशलता से बनाने की अनुमति देता है क्योंकि इसमें कोई प्रतिलिपि शामिल नहीं है।
  • दृष्टिकोण 1 अनुमानित रूप से एक कार्यक्रम के सभी भागों में नए राज्य को एक संदर्भ के रूप में धकेलता है, दृष्टिकोण 2 को अपने पर्यवेक्षकों को स्नैपशॉट को पुश करने के लिए कुछ तंत्र की आवश्यकता होगी, जैसे कि एक घटना के रूप में।
  • दृष्टिकोण 2 असंगत राज्य त्रुटियों (जैसे आंशिक राज्य अद्यतन) को रोकने में मदद कर सकता है: एक स्पष्ट फ़ंक्शन को परिभाषित करके जो एक पुराने से एक नया राज्य बनाता है यह समय में विभिन्न बिंदुओं पर उत्पादित स्नैपशॉट के बीच अंतर करना आसान है।
  • दृष्टिकोण 2 अधिक मॉड्यूलर है जिसमें यह राज्य पर आसानी से विचार करने की अनुमति देता है जो राज्य से स्वतंत्र हैं, जैसे उच्च-क्रम के कार्यों जैसे कि mapऔर filter

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

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

3
निश्चित रूप से, मैं सिद्धांत रूप में सहमत हूं। मैं सिर्फ यह सुनिश्चित कर रहा हूं कि प्रोग यह समझता है कि राज्य की योग्यता OOP के लिए कुछ खास नहीं है। मुझे नहीं लगता कि "सब कुछ एक वस्तु है" विचार की रेखा स्वाभाविक रूप से आती है।
डोभाल

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

11

राज्य केवल स्मृति में रखी गई किसी चीज़ के बारे में जानकारी है।

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

म्यूटेबल अवस्था वह स्थिति है जिसे ऑब्जेक्ट (कुकी) बनाने के बाद बदला जा सकता है। अपरिवर्तनीय स्थिति वह स्थिति है जिसे बदला नहीं जा सकता है।

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

सामान्य तौर पर, किसी वस्तु की स्थिति को "निजी या सदस्य चर" में रखा जाता है, और "गुण" या गेट्टर / सेटर विधियों के माध्यम से एक्सेस किया जाता है।


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

जवाब के लिए धन्यवाद। इसलिए मूल रूप से, ओओपी में, जब कोई 'राज्य' कहता है, तो उनका आमतौर पर मतलब होता है "ऑब्जेक्ट का सदस्य चर"? यदि ऐसा है, तो 'परिवर्तनशील राज्य' सार्वजनिक चर, या OOP में अधिक सामान्य है, निजी चर जिसे सेटर विधियों के माध्यम से बदला जा सकता है - जबकि 'अपरिवर्तनीय अवस्था' केवल निजी सदस्य चर है?
अवीव कोहन

1
एक बार प्रारंभिक मूल्यों के साथ आबाद होने के बाद, किसी वस्तु के निजी सदस्यों को लिखने से कभी भी अपरिवर्तनीयता का अनुकरण नहीं किया जा सकता है । अपरिवर्तनशीलता हो सकती है कई तरीकों का उपयोग करके लागू किया : एक सेटर विधि प्रदान नहीं करना, एक रचनाकार पैरामीटर का उपयोग करके प्रारंभिक मान की आवश्यकता होती है, एक कार्यात्मक शैली में लिखना, स्थिरांक का उपयोग करना, आदि
रॉबर्ट हार्वे

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

1
कई भाषाओं में, सदस्य चर को "कॉन्स्ट" या "फाइनल" घोषित करके अपरिवर्तनीयता लागू की जा सकती है। ऐसे चरों को केवल कंस्ट्रक्टर द्वारा आरंभ किया जा सकता है। यह न समझें कि निजी चर अपरिवर्तनीय हैं - फिर भी उन्हें कक्षा के अपने सदस्य कार्यों (विधियों) द्वारा संशोधित किया जा सकता है।
सिमोन बी

7

मुझे लगता है कि शब्द "राज्य" (एक ठोस प्रकार के राज्य जैसे "सदस्य चर" के विपरीत) स्टेटफुल एपीआई की तुलना एक स्टेटलेस से करते समय सबसे उपयोगी है। एपीआई का उल्लेख किए बिना "राज्य" को परिभाषित करने की कोशिश करना थोड़ा सा है जैसे प्रोग्रामिंग भाषाओं का उल्लेख किए बिना "चर" या "फ़ंक्शन" को परिभाषित करने की कोशिश करना; अधिकांश सही उत्तर केवल उन लोगों के लिए समझ में आते हैं जो पहले से ही जानते हैं कि शब्दों का क्या अर्थ है।

स्टेटफुल बनाम स्टेटलेस

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

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

glSetCurrentVertexBufferArray(vba1);
glSetCurrentVertexBufferObject(vbo1);
glSetCurrentVertexShader(vert1);
glSetCurrentFragmentShader(frag1);
// a dozen other things
glActuallyDrawStuffWithCurrentState(GL_TRIANGLES);

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

(Oversimplified) OpenGL का एक स्टेटलेस संस्करण संभवतः इस तरह दिखाई देगा:

glActuallyDrawStuff(vba1, vbo1, vert1, frag1, /* a dozen other things */, GL_TRIANGLES);

आपने अक्सर लोगों को कहते सुना होगा कि कम राज्य वाले एपीआई के बारे में तर्क करना आसान होता है। यदि आप तर्क गणना को नियंत्रण में रख सकते हैं, तो मैं आमतौर पर इससे सहमत हूं।

म्यूटेबल बनाम अचल

जहाँ तक मुझे पता है, यह अंतर तभी सार्थक है जब आप एक प्रारंभिक अवस्था को निर्दिष्ट कर सकते हैं । उदाहरण के लिए, C ++ कंस्ट्रक्टर का उपयोग करना:

// immutable state
ImmutableWindow windowA = new ImmutableWindow(600, 400);
windowA = new ImmutableWindow(800, 600); // to change the size, I need a whole new window

// mutable state
MutableWindow windowB = new MutableWindow(600, 400);
windowB.width = 800; // to change the size, I just alter the existing object
windowB.height = 600;

एक विंडो क्लास को लागू करना कठिन होगा जो यह याद नहीं रखता है कि "यह किस आकार का है, लेकिन आप यह तय कर सकते हैं कि उपयोगकर्ता को विंडो का आकार बदलने में सक्षम होना चाहिए या नहीं।"

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


भयानक जवाब। बहुत बहुत धन्यवाद, आपने वास्तव में तेजी से इसे चुनने में मेरी मदद की। थोड़ा मुझे पता था, मैं लंबे समय से इसके साथ काम कर रहा था और यह नहीं जानता था कि इसे क्या कहा जाता है।
the_endian

2

आम शब्दों में

शब्दकोश कहता है:

ए। परिस्थितियों के संबंध में होने की अवस्था या ढंग।

  1. राज्य - जिस तरह से कुछ इसकी मुख्य विशेषताओं के संबंध में है;

किसी वस्तु की स्थिति उन मूल्यों का समुच्चय है, जिनकी विशेषताएँ किसी भी क्षण में होती हैं।

OOP में किसी वस्तु की स्थिति किसी भी क्षण में उसके गुणों के मानों का एक स्नैपशॉट है।

Thing t = new Thing();
t.setColor("blue");
t.setPrice(100)
t.setSize("small");

इसका राज्य इसका रंग नीला है, इसकी कीमत 100 बताई जा रही है और इसका आकार छोटा है।

यदि आप बाद में करते हैं:

t.setColor("red");

आप इसकी एक विशेषता को बदलते हैं, लेकिन आपने राज्य को पूर्ण रूप से बदल दिया है क्योंकि ऑब्जेक्ट अब वैसा नहीं है जैसा वह था।

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

Thing t = new Thing("red",100,"small");
t.setColor("blue") -->> ERROR, the programmer didn't provide a setter or any other way to change the properties values after initialization.

इसे एक ऐसी स्थिति कहा जाता है जिसे परिवर्तित नहीं किया जा सकता है। आप बस इतना कर सकते हैं कि वस्तु को नष्ट कर दें, एक नया बनाएं और इसे उसी संदर्भ या चर पर ले जाएं।

Thing t = new Thing("red",100,"small");
t = new Thing("blue",100,"small");
// I had to create a new Thing with another color since this thing is inmutable.
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.