2011-11-10 20 views
6

सभी कार्यक्रम यह है कि आप एक बटन पर क्लिक करते हैं और यह आपको बताता है कि आपने टेक्स्टफील्ड में बटन पर कितनी बार क्लिक किया था।क्या यह एक्शनस्क्रिप्ट 3 में एमवीसी का सही कार्यान्वयन है?

दस्तावेज़ कक्षा: यह कोड का प्रवेश बिंदु है।

package { 
    import flash.display.MovieClip; 

    /** 
    * MVCTest.as 
    * @author rotaercz 
    */ 
    public class MVCTest extends MovieClip { 
     private var _model:Model; 
     private var _view:View; 
     private var _control:Control; 

     public function MVCTest() { 
      _model = new Model(); 
      _view = new View(this); 
      _control = new Control(_model, _view); 
     } 
    } 
} 

मॉडल कक्षा: मूल मॉडल कोड।

package { 

    /** 
    * Model.as 
    * @author rotaercz 
    */ 
    public class Model { 
     private var _totalClicks:int; 

     public function AddClick():void { 
      _totalClicks++; 
     } 

     public function get Clicks():int { 
      return _totalClicks; 
     } 

     public function Model() { 
      _totalClicks = 0; 
     } 
    } 
} 

नियंत्रण वर्ग: मॉडल के इनपुट और अद्यतन दोनों को नियंत्रित करता है और यहां देखें।

package { 
    import flash.events.MouseEvent; 

    /** 
    * Control.as 
    * @author rotaercz 
    */ 
    public class Control { 
     private var _model:Model; 
     private var _view:View; 

     public function Control(model:Model, view:View):void { 
      _model = model; 
      _view = view; 
      _view.addEventListener(MouseEvent.CLICK, OnClick); 
     } 

     private function OnClick(e:MouseEvent):void { 
      _model.AddClick(); 
      _view.Text = "clicked " + _model.Clicks; 
     } 
    } 
} 

कक्षा देखें: कार्यक्रम का दृश्य प्रतिनिधित्व।

package { 
    import flash.display.MovieClip; 
    import flash.events.EventDispatcher; 
    import flash.events.MouseEvent; 
    import flash.text.TextField; 

    /** 
    * View.as 
    * @author rotaercz 
    */ 
    public class View extends EventDispatcher { 
     private var _parent:MovieClip; 
     private var _button:MovieClip; 

     private var _dt:TextField; 

     public function set Text(s:String):void { 
      _dt.text = s; 
     } 

     public function View(parent:MovieClip) { 
      _parent = parent; 
      _dt = _parent.getChildByName("dt") as TextField; 
      _button = _parent.getChildByName("mcButton") as MovieClip; 
      _button.addEventListener(MouseEvent.CLICK, OnClick); 
     } 

     private function OnClick(e:MouseEvent):void { 
      dispatchEvent(e); 
     } 
    } 
} 
+0

यदि आप मूवीक्लिप (आईई: 'gotoAndplay() ', आदि) पर विशिष्ट विधियों का उपयोग करने की योजना नहीं बनाते हैं, तो आपको इसके बजाय स्प्राइट का उपयोग करना चाहिए। सीपीपी के विपरीत, एक वर्ग के कार्यों को नामित करने के लिए सम्मेलन (कन्स्ट्रक्टर को छोड़कर) लोअरकेस (आईई: 'मायफंक्शन() 'के बजाय' myFunction() ' – TheDarkIn1978

+0

के बजाय शुरू होता है, यह केवल व्यक्तिगत शैली का मामला है, कोई तर्क दे सकता है कि यह सम्मेलन केवल कन्स्ट्रक्टर का नाम अपरकेस अक्षर से शुरू होने के लिए और भी भ्रमित है। – TheDarkIn1978

+2

जो वास्तव में कम भ्रमित है, यह कन्स्ट्रक्टर है और इसलिए कक्षा का नाम दर्शाता है। पूंजीकृत सदस्यों के पास एक बड़ा नो-आईएमओ नहीं है, यह वास्तव में अस्पष्ट है कि आप किसी सदस्य के इंस्टेंस सदस्य या कक्षा के स्थिर सदस्य को संबोधित कर रहे हैं या नहीं। – Creynders

उत्तर

3

पारंपरिक MVC पैटर्न में देखें कि मॉडल पर प्रत्यक्ष निर्भरता है जैसे www0z0k ने लिखा है, लेकिन मुझे भी लगता है कि यह एक आदर्श समाधान नहीं है।

जिस तरह से आपने अपना नियंत्रक सेटअप किया है, यह मॉडल और दृश्य के बीच मध्यस्थ के रूप में कार्य करता है, और यह निश्चित रूप से एक बहुत ही वैध समाधान है।

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

आरेख: http://bit.ly/sTSDVT

नियंत्रक मॉडल अद्यतन करता है सीधे, लेकिन यह भी मॉडल से अद्यतन के लिए केंद्रीय घटना डिस्पैचर को सुनता है (यदि आवश्यक हो) और उन्हें देखने के लिए अनुवाद। यह दृश्य घटनाओं के लिए भी सुनता है

मॉडल केवल ईवेंट प्रेषक पर निर्भरता है और अद्यतन घटनाओं को प्रेषित करने के लिए इसका उपयोग करता है।

दृश्य केवल ईवेंट प्रेषक पर निर्भरता है और मॉडल से ईवेंट अपडेट करने के लिए सुनता है। यह अपने स्वयं के कार्यक्रम भी भेजता है। (आप इसके लिए केंद्रीय इवेंट प्रेषक का उपयोग कर सकते हैं, लेकिन मैं इसकी अनुशंसा नहीं करता)

0

नियंत्रक मॉडल को देखने और अपडेट करने के लिए सुनता है, यह हिस्सा एमवीसी की मेरी दृष्टि को फिट करता है।
लेकिन मैं दृश्य के लिए बाध्य मॉडल में नियंत्रक को शामिल करने से बचने की कोशिश की होगी:

_model = new Model(); 
    _view = new View(this, _model); 
    _control = new Control(_model, _view); 
मॉडल में

:

public class Model extends EventDispatcher{ 
    //............ 
    public function AddClick():void { 
     _totalClicks++; 
     dispatchEvent(new Event('one more click')); 
    } 
ध्यान में रखते हुए

:

private var _model:Model; 
    public function View(parent:MovieClip, model:Model) { 
     _parent = parent; 
     _model = model; 
     _model.addEventListener('one more click', update); 
     _dt = _parent.getChildByName("dt") as TextField; 
     _button = _parent.getChildByName("mcButton") as MovieClip; 
     _button.addEventListener(MouseEvent.CLICK, OnClick); 
    } 

    private function update(e:Event):void{ 
     _dt.text = _model.clicks; 
    } 
+0

मैं देखता हूं कि आपने वहां क्या किया। मैं समझता हूं कि मॉडल अब घटनाओं को प्रेषित कर रहा है और दृश्य सुन रहा है। हालांकि आपको व्यू कन्स्ट्रक्टर को _ मॉडेल इंस्टेंस पास करना होगा। दृश्य को अब काम करने के लिए _model की आवश्यकता है। यह बेहतर क्यों है? यदि इस दृश्य का उपयोग करके कई मॉडल हैं, तो मुझे ईवेंट श्रोताओं को उनमें से प्रत्येक के लिए देखने के लिए जोड़ना होगा। – rotaercz

+0

ऐसे मामलों में मैं सामान्य रूप से एक स्थिर प्रेषक का उपयोग करता हूं, इसलिए प्रत्येक ui तत्व के लिए मैं इसे श्रोता जोड़ता हूं और प्रत्येक मॉडल मान परिवर्तन इसके द्वारा प्रेषित एक ईवेंट का कारण बनता है, जबकि मुझे अपने दृश्य में मॉडल संदर्भ की आवश्यकता नहीं है – www0z0k

+0

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

0

मेरा मानना ​​है कि मेरा Introduction to Flex Application’s Architecture - Redux आपके लिए काफी रूचि रखता है।

अधिक चमकदार दृष्टिकोण के लिए आप FLit Framework देख सकते हैं। MVCSprite आपके समाधान के समान है।

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

+1

परिचय एक टूटी हुई लिंक है, और Google Code पर प्रोजेक्ट बंद हो रहे हैं। –