2009-11-28 13 views
6

साथ फिर से करें मैं एक articleपूर्ववत करें/अपरिवर्तनीय वस्तुओं

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

हाउवर, लेख "पूर्ववत" संचालन को लागू करने के लिए अपरिवर्तनीय वस्तुओं का उपयोग कैसे किया जा सकता है इसका एक अच्छा व्यावहारिक उदाहरण नहीं दिखाता है। उदाहरण के लिए ... जीमेल इनबॉक्स से 10 ईमेल हटाएं। एक बार ऐसा करने के बाद, यह एक पूर्ववत विकल्प है। इस संबंध में एक अपरिवर्तनीय वस्तु कैसे मदद करेगी?

उत्तर

6

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

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

यदि आप पूर्ववत के दस स्तरों को रखना चाहते हैं, तो आप संभावित रूप से दो अपरिवर्तनीय वस्तुओं को रखने के लिए स्मृति को बचा सकते हैं - जो कि वर्तमान है, और दस "पूर्व" से पहले - और लागू किए गए कमांड की एक सूची उनके बीच।

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

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

एसवीएन और अन्य संस्करण नियंत्रण प्रणाली प्रभावी ढंग से एक डिस्क- या पूर्व-और-रेडो के नेटवर्क-आधारित रूप हैं।

+3

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

+1

यह एक उत्कृष्ट बिंदु है। मुझे लगता है कि एक जीमेल खाते के लिए, उपयुक्त अपरिवर्तनीय वस्तु टैग की सूची और प्रत्येक टैग के लिए ई-मेल ऑब्जेक्ट की संबंधित सूचियां होगी; यह पूरे संग्रह से बहुत छोटा है, लेकिन इनबॉक्स संदेशों की सूची से कहीं अधिक बड़ा है। – jprete

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