2011-11-23 14 views
6

लागू करने पर आर्किटेक्चरल टिप्स तो मैं एक ऐसे अनुप्रयोग पर एक svg-editor-like GUI को कार्यान्वित कर रहा हूं जो मैं यहां काम कर रहा हूं। ये तर्क है कि उस पर की जरूरत होगी के कुछ उदाहरण हैं:GUI तर्क

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

और इसी तरह।

मैं पहले से ही इन सभी वस्तुओं के क्रियान्वित किया है, लेकिन मैं अंतिम परिणाम पसंद आया नहीं था, मुख्य रूप से, क्योंकि मैं झंडे का एक बहुत उपयोग करने के लिए राज्यों में हेरफेर करने के लिए किया था (माउस & & बाएं बटन & & चलती क्लिक नहीं किया गया? ऐसा यह), और निश्चित रूप से यह कोड अधिक सुरुचिपूर्ण हो सकता है। तो मैं एक छोटे से शोध किया और इन विकल्पों के लिए आया था की है:

  • पाइपलाइन पैटर्न: मैं वर्गों है कि प्रत्येक तार्किक घटना अलग से संभाल करेगे, और एक प्राथमिकता क्रम क्या करना है प्रदान करने के लिए उपयोग करें/क्या होगा पहले सौंपें, और घटना बाद के पाइपलाइन वस्तुओं को कैसे प्रसारित करेगी।

  • एमवीसी: यह सबसे आम प्रतिक्रिया है, लेकिन इस समय मैं कोड को और अधिक साफ करने के लिए इसका उपयोग कैसे कर सकता हूं।

  • राज्य मशीन: तो मैं S.O. पूछ रहा हूँ यह अच्छा है, लेकिन राज्य मशीन की ग्रैन्युलरिटी प्रबंध

जटिल हो जाएगा एक बेहतर और खुश कोड बनाने के तरीकों पर गुरुओं पर गुरु।

उत्तर

6

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

OperationSensor 
+ OnKeyDown 
+ OnKeyPress 
+ OnKeyUp 
+ OnLeftMouseDown 
+ OnLeftMouseUp 
+ OnNodeSelect 
+ OnNodeDeselect 
+ OnDragStart 
+ OnDragStop 

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

UiInputManager 
// event listeners 
+ keyboard_keydownHandler 
+ keyboard_keyupHandler 
+ mouse_leftdownHandler 
+ mouse_rightdownHandler 
// active sensor list, can be added to or removed from 
+ Sensors 

UiInputManager यह जानने के लिए ज़िम्मेदार नहीं है कि उन इनपुट का संचालन किस प्रकार हो रहा है। यह बस एक भाषा विशिष्ट तरीके से अपने सेंसर को सूचित करता है।

foreach sensor in Sensors 
    sensor.OnDragStarted 

या, यदि सेंसर UiInputManager

RaiseEvent DragStarted 

द्वारा जारी किए गए तार्किक घटनाओं के लिए सुनने OperationSensor उपवर्गों मार्ग इनपुट करने के लिए पाइपलाइन क्या आप अभी उपयोग कर रहा है। प्रत्येक ऑपरेशन सेंसर में केवल एक ही ऑपरेशन से संबंधित तर्क होता है। यदि यह पता चलता है कि ऑपरेशन के मानदंडों को पूरा किया गया है तो यह उपयुक्त कमांड ऑब्जेक्ट बनाता है और इसे बैक अप पास करता है।

// Ctrl + zooms in, Ctrl - zooms out 
ZoomSensor : OperationSensor 

    override OnKeyDown 
    { 
     if keyDown.Char = '+' && keyDown.IsCtrlDepressed 
     base.IssueCommand(new ZoomCommand(changeZoomBy:=10) 
     elseif keyDown.Char = '-' && keyDown.IsCtrlDepressed 
     base.IssueCommand(new ZoomCommand(changeZoomBy:=-10)         
    } 

मैं अनुशंसा करता हूं कि आदेश वस्तुएं सेंसर से UiInputManager तक गुजरती हैं। प्रबंधक उन्हें अपने कमांड प्रोसेसिंग सबसिस्टम में पास कर सकता है। यह प्रबंधक को सेंसर को सूचित करने का मौका देता है कि एक ऑपरेशन पूरा हो गया है, जिससे जरूरत पड़ने पर उन्हें अपने आंतरिक राज्य को रीसेट करने की इजाजत मिलती है।

मल्टी-स्टेप ऑपरेशंस को दो अलग-अलग तरीकों से संभाला जा सकता है। आप या तो सेंसरऑपरेशन के अंदर आंतरिक राज्य मशीनों को कार्यान्वित कर सकते हैं, या आपके पास "चरण 1" सेंसर एक "चरण 2" सेंसर बना सकता है और इसे सक्रिय सेंसर सूची में जोड़ सकता है, संभवतः सूची से खुद को हटा भी सकता है। जब "चरण 2" पूर्ण हो जाता है, तो यह "चरण 1" सेंसर को फिर से जोड़ सकता है और स्वयं को हटा सकता है।

+0

तो आप कह रहे हैं कि उसे एक पाइपलाइन का उपयोग करना चाहिए जैसा कि उसने अपने प्रश्न में कहा था? – jgauffin

+1

मैं कुछ नया सुझाव दे रहा था। (मुझे लगता है) उन्होंने कहा कि वह घटनाओं को कैप्चरिंग और फ़नल करने के लिए एक पाइपलाइन का उपयोग करना चाहते थे, जो बाद के ईवेंट हैंडलर में तब तक श्रृंखला करेगा जब तक कि अंत हैनल्डर घटना से संबंधित न हो। मैंने उन्हें ट्रिगर करने वाली घटनाओं के बजाए किए जा रहे संचालन पर ध्यान केंद्रित किया। यद्यपि ओपी ने अपने पिपुलिन विचार को स्पष्ट किया है, लेकिन मैं थोड़ा और तुलना कर सकता हूं। मैं ओपी को इसके बारे में जवाब देने के लिए उत्तर देता हूं। – tcarvin

+0

+1 सुझाव और स्पष्टीकरण – jgauffin

2

मार्टिन फाउलर में a good writeup एमवीसी और संबंधित पैटर्न पर है। यूआई तत्वों को यह पता लगाने के लिए command pattern पर एक नज़र डालना चाहें कि उन्हें कैसे व्यवहार करना चाहिए (यानी जब किसी नोड पर क्लिक करना चाहिए या इसे हटा देना चाहिए)

+0

हाँ, मैं पहले से ही क्रिया निष्पादन को लागू करने के लिए कमांड पैटर्न का उपयोग कर रहा हूं। मैं अभी तर्क तर्क को ठीक करने पर अधिक ध्यान केंद्रित कर रहा हूं। – scooterman

0

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

मैं शायद मॉडल में 'स्मारक' रखूंगा। मॉडल को पता चलेगा कि जब कोई नोड चुना जाता है, तो इसके आसन्न नोड्स बहुभुज, राज्य मशीन इत्यादि बनाते हैं। यह डिज़ाइन आपको कई लाभ देता है। यह यूआई प्रतिपादन के विवरण से स्वतंत्र है; इसलिए आप कोर कार्यक्षमता को बाधित किए बिना बड़े दृश्य परिवर्तन कर सकते हैं। यह इकाई परीक्षण के लिए भी बहुत आसान बनाता है।

3

एक बिट दिखाने के लिए देर हो चुकी है, लेकिन मैं जोड़ने के लिए है कि इस के लिए आम पैटर्न मध्यस्थ पैटर्न जहां एक अलग वर्ग के लिए विभिन्न नोड्स के बीच बातचीत की जटिलता ले जाते हैं, मध्यस्थ चाहते हैं (एक कनेक्शन निर्माता वर्ग कहें)। गामा और सहकर्मियों द्वारा डिज़ाइन पैटर्न देखें: http://ebookbrowse.com/addison-wesley-gamma-helm-johnson-vlissides-design-patterns-elements-of-reusable-object-oriented-pdf-d11349017