लागू करने के लिए उपयोग की जाने वाली डेटा संरचना मैं यूएनडीओ और रेडो विकल्प को लागू करना चाहता हूं (जैसा कि हम एमएस शब्द आदि में देखते हैं)। क्या आप मुझे इसके लिए एक डेटा संरचना सुझा सकते हैं, और मैं इसे कैसे कार्यान्वित कर सकता हूं।यूएनडीओ और रेडओ विकल्प
उत्तर
यह डेटा संरचना नहीं बल्कि एक डिजाइन पैटर्न है। आप Command Pattern खोज रहे हैं।
मानक मल्टी लेवल पूर्ववत करने के लिए कमांड ऑब्जेक्ट को स्टैक में रखना है। फिर से समर्थन करने के लिए, दूसरा स्टैक आपके द्वारा पूर्ववत किए गए सभी आदेशों को रखता है। तो जब आप कमांड को पूर्ववत करने के लिए पूर्ववत स्टैक पॉप करते हैं, तो आप उसी आदेश को दबाते हैं जिसे आप फिर से स्टैक में पॉप करते हैं। जब आप कमांड को दोबारा करते हैं तो आप वही काम करते हैं। आप फिर से स्टैक पॉप करते हैं और पॉप-अप कमांड को पूर्ववत स्टैक में दबाते हैं।
उद्देश्य-सी कोको के पास NSUndoManager नामक एक अच्छी तरह से प्रलेखित कर्मचारी है।
आप कमान पैटर्न का उपयोग कर सकते हासिल करने के लिए पूर्ववत करें/फिर
चेक इन नमूनों:
वास्तव में, यह कार्यक्षमता के लिए मानक पैटर्न (चार के गिरोह, यहां तक कि) Memento है।
इसके अलावा, जबकि अधिकांश कार्यक्रमों का उपयोग पूर्ववत करें/ढेर फिर से करें, कुछ पाठ संपादक का afficionados पसंद करते हैं पूर्ववत करें/पेड़ फिर से करें ताकि वे अपने पूरे इतिहास में खोना नहीं है अगर वे कुछ आदेशों पूर्ववत, एक नया एक कोशिश है, और अपने दिमाग बदलो।
आप सही हैं। यदि आप कमांड पैटर्न के साथ कैसे इंटरैक्ट करते हैं, इस बारे में अधिक जानकारी जोड़ते हैं, तो यह एक अच्छा जवाब होगा। – Kieveli
Memento के उपयोग को साफ़ करने का प्रयास करें, क्या Memento अंडू/redo के लिए ऑपरेशन से पहले और बाद में वस्तुओं की स्थिति को संग्रहीत करने के लिए उपयोग किया जाता है? – NileshChauhan
ऑब्जेक्ट जो मेमेंटो का उत्पादन करता है वह इसे उस राज्य में वापस करने के लिए उपयोग करता है। Memento खुद को माना जाना चाहिए जैसे यह अपारदर्शी था। पूरे राज्य को Memento में भरना एक स्पष्ट कार्यान्वयन विकल्प की तरह लगता है, लेकिन यह आसानी से एक diff, या एक बैकिंग स्टोर में एक आईडी, या कुछ और हो सकता है। –
यह कमांड पैटर्न का क्लासिक मामला है। पाइथन में पूर्ववत सुविधा का नमूना कार्यान्वयन निम्नलिखित है:
from os import rename
class RenameFileCommand(object):
def __init__(self, src_file, target_file):
self.src_file=src_file
self.target_file=target_file
def execute(self):
rename(self.src_file, self.target_file)
def undo(self):
rename(self.target_file,self.src_file)
class History(object):
def __init__(self):
self.commands=list()
def execute(self, command):
command.execute()
self.commands.append(command)
def undo(self):
self.commands.pop().undo()
if __name__=='__main__':
hist=History()
hist.execute(RenameFileCommand('test1.txt', 'tmp.txt',))
hist.undo()
hist.execute(RenameFileCommand('tmp2.txt', 'test2.txt',))
यदि आप एक और कमांड दबाते हैं तो भी रेडो स्टैक को हमेशा साफ़ करना महत्वपूर्ण है। – Balk
डेटा संरचना "कमांड" ऑब्जेक्ट्स के उदाहरणों के साथ ढेर है। – zinovii
मुझे लगता है कि कमांड पैटर्न आवश्यक नहीं है कि आप पूर्ववत कैसे कार्यान्वित करते हैं, यह केवल एक विकल्प है, न ही यह ओपी के सवाल का जवाब है। पूर्ववत/फिर से ढेर जवाब है। (हालांकि मुझे लगता है कि उन्होंने एमएसडब्ल्यूर्ड का उल्लेख किया था।) –