2009-03-31 5 views
38

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

उत्तर

92

यह डेटा संरचना नहीं बल्कि एक डिजाइन पैटर्न है। आप Command Pattern खोज रहे हैं।

मानक मल्टी लेवल पूर्ववत करने के लिए कमांड ऑब्जेक्ट को स्टैक में रखना है। फिर से समर्थन करने के लिए, दूसरा स्टैक आपके द्वारा पूर्ववत किए गए सभी आदेशों को रखता है। तो जब आप कमांड को पूर्ववत करने के लिए पूर्ववत स्टैक पॉप करते हैं, तो आप उसी आदेश को दबाते हैं जिसे आप फिर से स्टैक में पॉप करते हैं। जब आप कमांड को दोबारा करते हैं तो आप वही काम करते हैं। आप फिर से स्टैक पॉप करते हैं और पॉप-अप कमांड को पूर्ववत स्टैक में दबाते हैं।

+28

यदि आप एक और कमांड दबाते हैं तो भी रेडो स्टैक को हमेशा साफ़ करना महत्वपूर्ण है। – Balk

+10

डेटा संरचना "कमांड" ऑब्जेक्ट्स के उदाहरणों के साथ ढेर है। – zinovii

+1

मुझे लगता है कि कमांड पैटर्न आवश्यक नहीं है कि आप पूर्ववत कैसे कार्यान्वित करते हैं, यह केवल एक विकल्प है, न ही यह ओपी के सवाल का जवाब है। पूर्ववत/फिर से ढेर जवाब है। (हालांकि मुझे लगता है कि उन्होंने एमएसडब्ल्यूर्ड का उल्लेख किया था।) –

2

उद्देश्य-सी कोको के पास NSUndoManager नामक एक अच्छी तरह से प्रलेखित कर्मचारी है।

31

वास्तव में, यह कार्यक्षमता के लिए मानक पैटर्न (चार के गिरोह, यहां तक ​​कि) Memento है।

इसके अलावा, जबकि अधिकांश कार्यक्रमों का उपयोग पूर्ववत करें/ढेर फिर से करें, कुछ पाठ संपादक का afficionados पसंद करते हैं पूर्ववत करें/पेड़ फिर से करें ताकि वे अपने पूरे इतिहास में खोना नहीं है अगर वे कुछ आदेशों पूर्ववत, एक नया एक कोशिश है, और अपने दिमाग बदलो।

+3

आप सही हैं। यदि आप कमांड पैटर्न के साथ कैसे इंटरैक्ट करते हैं, इस बारे में अधिक जानकारी जोड़ते हैं, तो यह एक अच्छा जवाब होगा। – Kieveli

+0

Memento के उपयोग को साफ़ करने का प्रयास करें, क्या Memento अंडू/redo के लिए ऑपरेशन से पहले और बाद में वस्तुओं की स्थिति को संग्रहीत करने के लिए उपयोग किया जाता है? – NileshChauhan

+1

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

0

यह कमांड पैटर्न का क्लासिक मामला है। पाइथन में पूर्ववत सुविधा का नमूना कार्यान्वयन निम्नलिखित है:

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',))