2010-10-19 24 views
9

हाय में बड़े बदलावों के बिना पूर्ववत/पुनः संचालन को कार्यान्वित करने के लिए कैसे करें मैं वर्तमान में लिखने वाले एप्लिकेशन में नई कार्यक्षमता जोड़ने जा रहा हूं। मुझे एक पूर्ववत/फिर से fnctionality लिखने की जरूरत है। हालांकि हमारे आवेदन का 9 0% तैयार है और मुझे नहीं पता कि इस कार्यक्षमता को बिना किसी प्रभाव (बहुत अधिक) कोड के कार्यान्वित करने का सबसे अच्छा तरीका क्या है जो पहले से ही बनाया गया है।प्रोग्राम

+0

हम कुछ कोड देखने में सक्षम होना करने के लिए होता है या आप का वर्णन करने के लिए क्या आपके प्रोग्राम क्रम में था हमारी मदद करने के लिए होगा। –

+2

ध्यान में रखते हुए आपने हमें यह भी नहीं बताया कि यह किस प्रकार का एप्लिकेशन है (वेब, सिल्वरलाइट, डेस्कटॉप इत्यादि) या यह कौन सी शैली है (गेम, सीआरयूडी, सोशल नेटवर्किंग इत्यादि) वास्तव में हमारे लिए आगे बढ़ने के लिए कुछ भी नहीं है । – tster

+0

यह एक WPF एप्लिकेशन है जो उपयोगकर्ता को चित्र खींचने की अनुमति देता है। उपयोगकर्ता विभिन्न ब्लॉक प्रकार जोड़ सकते हैं, उन्हें स्थानांतरित और आकार बदल सकते हैं। वह कुछ गुणों को ब्लॉक करने के लिए भी कर सकता है - नाम, तिथियां इत्यादि। – pieere

उत्तर

0

प्रश्नों के युगल: पूर्ववत क्या करता है? क्या यह सभी परिवर्तनों को पूर्ववत करता है या केवल आखिरी वाला है?

किसी भी मामले में, आप पहले इनपुट फ़ील्ड (प्रारंभिक स्थिति, या अंतिम वांछित स्थिति) की स्थिति को स्टोर करेंगे, फिर पूर्ववत बटन उस राज्य को ले जाएगा और इसे क्षेत्र में लागू करेगा।

रेडो एक ही अवधारणा होगी, लेकिन यह राज्य को पूर्ववत करने के लिए पहले स्टोर करेगा।

+1

पूर्ववत ओपेरियन कदम से सभी परिचालनों को पूर्ववत करने में सक्षम होना चाहिए। – pieere

8

यहां कई विवरण नहीं हैं। हालांकि, पूर्ववत/फिर से कार्यक्षमता को आमतौर पर Command Pattern के कुछ भिन्नता के माध्यम से संभाला जाता है। आपके आर्किटेक्चर के आधार पर, यह "कमांड" या एक प्रमुख ओवरहाल में आपकी मूल कार्यक्षमता का एक सरल पुनर्विक्रय हो सकता है।

+1

यह है कि आप इसे कैसे करते हैं। एक बार जब आपका प्रोग्राम "कमांड" के उदाहरणों के माध्यम से फंस जाता है तो आप 80% हैं। – Detmar

+3

यदि मूल आर्किटेक्ट्स/डेवलपर्स के पास यह उनके दिमाग में नहीं था जब उन्होंने पहली बार सिस्टम को डिजाइन करना शुरू किया, तो मैं इस पर एक बड़ा ओवरहाल होने की ओर झुका रहा हूं! – tster

+0

@tster: यह आम तौर पर एक सुंदर प्रमुख पुनर्विक्रय है - हालांकि यह इस बात पर निर्भर करता है कि ऐप किस तरह से आर्किटेक्ट किया गया है। –

0

आप एक पूर्ववत करें/फिर ढेर आवश्यकता होगी, और बड़े बदलाव सब कुछ इस ढेर के बारे में पता करने के लिए .. मैं माफी चाहता हूँ, लेकिन जादू मौजूद नहीं है:/

0

एक free library रॉकफोर्ड Lhotka द्वारा लिखित नहीं है व्यवसाय ऑब्जेक्ट्स के लिए जिसमें पूर्ववत/पुन: कार्यक्षमता में बनाया गया है। मुझे लगता है कि वह इसे एक इंटरफ़ेस के माध्यम से भी लागू करता है, इसलिए इसे "न्यूनतम आक्रमणकारी" होना चाहिए।

7

के रूप में रीड Copsey कहते हैं/फिर से करना लागू करने के सबसे आम पैटर्न Command Pattern है। मूल विचार है कि implemets आदेशों के रूप में कार्रवाई को लागू करने की है इस तरह की कुछ इंटरफ़ेस:

public interface ICommand { public void Execute(); public void Undo(); } 

तो आप एक वर्ग (नियंत्रण) है कि एक पूरे के रूप में सभी आदेशों को निष्पादित करता है, इस तरह के वर्ग आदेशों के एक समूह द्वारा रचित किया जाना चाहिए है , जब आप कमांड निष्पादित करते हैं तो प्रत्येक कमांड को स्टैक के अंदर धक्का दिया जाता है (push() विधि से), यदि आप क्रियाओं को पूर्ववत करना चाहते हैं तो आप प्रत्येक तत्व को स्टैक से (pop() के माध्यम से) Undo() विधि निष्पादित करते हैं ।

public class Control { 
    private ArrayList<ICommand> commands = new ArrayList<ICommand>(); 
    private Stack<ICommand> stack = new Stack<ICommand>(); 

    public Control() {  
     commands.add(new Command1()); 
     commands.add(new Command2());  
     commands.add(new Command3());  
    } 

    public void Execute() { 
     for(int index=0; index<=command.size(); index++) { command.Execute(); stack.push(command);} 
    } 
    public void Undo() 
    { 
     while (!stack.empty()) { 
      ICommand command = (ICommand)stack.pop(); 
      if (command != null) { command.Undo(); }   
     }  
    } 
} 

नोट: यह केवल कमान पैटर्न के पीछे एक विचार को स्पष्ट करने की कोशिश कर के लिए एक बहुत ही सरल कोड है।

link text

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

  • कोई संबंधित समस्या नहीं^_^