2010-12-13 15 views
8

मेरे आवेदन में मैं उपयोगकर्ता को एक छोटी पूर्ववत कार्यक्षमता प्रदान करना चाहता हूं। उपयोगकर्ता द्वारा पूर्ववत किए जा सकने से कई क्रियाएं नहीं हैं। विशेष रूप से कार्रवाई कर रहे हैं:पूर्ववत कार्यक्षमता को कैसे कार्यान्वित करें?

  • एक स्ट्रिंग

अब मैं यह कैसे लागू करने के लिए के बारे में सोचा के साथ एक वस्तु

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

    जब भी उपयोगकर्ता कुछ पूर्ववत करना चाहता है, तो सूची उपयोगकर्ता को प्रदर्शित की जाती है और वह चुन सकता है कि वह कौन सी कार्रवाई पूर्ववत करना चाहता है।

    अब मैं सोच रहा था क्या इस तरह की कार्रवाई वस्तु में संग्रहीत किया जाना है:

    • कार्रवाई
    • वास्तविक कार्रवाई है कि लिया गया था (जैसे स्ट्रिंग है जो करने के लिए जोड़ा गया है इससे पहले कि वस्तु के राज्य ऑब्जेक्ट के नोट्स)

    मुझे यकीन नहीं है कि यह पर्याप्त है या नहीं। मैंने कालक्रम के क्रम की तरह कुछ भी सोचा, लेकिन यह आवश्यक होना चाहिए क्योंकि सूची को कालक्रम के अनुसार सही रखा जा सकता है।

    क्या कोई अन्य चीजें हैं जिन पर मुझे विचार करना चाहिए?

  • +1

    GOF – pastjean

    +2

    या स्मृति आदेश – slayerIQ

    +1

    में स्मृति पैटर्न के लिए खोजें यहां देखें: http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

    उत्तर

    14

    पूर्ववत/फिर से सामान्य है I Command Pattern के साथ पूरक। Action कक्षा के लिए आधार के रूप में उपयोग किया जा सकता है, लेकिन आपको प्रत्येक आदेश के भीतर 'डू' एक्शन और 'पूर्ववत' कार्रवाई की आवश्यकता है। अभ्यास में Here is an example। आपको शायद स्टैक में निष्पादित आदेशों को संग्रहीत करना चाहिए क्योंकि यह लागू करने के लिए बहुत आसान बनाता है और उपयोगकर्ता के अनुसरण के लिए बहुत आसान है।

    2

    सभी सही लगता है, लेकिन मैं सूची की तुलना में ढेर का उपयोग करना चाहता हूं। यह क्रोनोलॉजिकल ऑर्डरिंग पहलू में उपयोगी होगा।

    2

    पूर्ववत कार्यक्षमता के लिए सही और सिद्ध implememtation के लिए कमान पैटर्न है

    9

    तुम कुछ इस तरह सरल कर सकता है:

    Stack<Action> undoStack = new Stack<Action>();  
    
    void ChangeColor(Color color) 
    { 
        var original = this.Object.Color; 
        undoStack.Push(() => this.Object.Color = original); 
        this.Object.Color = color; 
    } 
    
    +0

    मुझे यह पसंद है। कभी भी वास्तविक क्रियाओं को संग्रहित करने का विचार नहीं किया था ... बहुत अच्छा। – Crisfole

    0

    मौजूदा परियोजनाओं में पूर्ववत/पुनः कार्यक्षमता जोड़ने के दौरान इस Simple-Undo-redo-library-for-Csharp-NET को अनदेखा करना मुश्किल है।

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

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