2011-11-10 22 views
6

Tất cả chương trình làm là bạn bấm vào một nút và nó cho bạn biết số lần bạn nhấp vào nút trong một trường văn bản.Đây có phải là việc triển khai đúng MVC trong Actionscript 3 không?

Lớp tài liệu: Đây là điểm vào của mã.

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); 
     } 
    } 
} 

Lớp mô hình: Mã mẫu cơ bản.

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; 
     } 
    } 
} 

Lớp điều khiển: kiểm soát cả đầu vào và cập nhật mô hình và xem tại đây.

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; 
     } 
    } 
} 

Chế độ xem lớp: Biểu thị trực quan của chương trình.

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

nếu bạn không có kế hoạch sử dụng các phương pháp cụ thể trên MovieClip (IE: 'gotoAndPlay()', v.v.), bạn nên sử dụng Sprite thay thế. cũng như, không giống như CPP, quy ước đặt tên các hàm của một lớp (ngoại trừ hàm khởi tạo) bắt đầu bằng chữ thường (IE: 'myFunction()' thay vì 'MyFunction()') – TheDarkIn1978

+0

tất nhiên, đó chỉ đơn giản là vấn đề cá nhân trong khi người ta có thể lập luận rằng quy ước này thậm chí còn khó hiểu hơn khi chỉ có tên của nhà xây dựng bắt đầu bằng một chữ hoa. – TheDarkIn1978

+2

Thực tế là ít gây nhầm lẫn, đó là hàm tạo và do đó phản ánh tên lớp. Có các thành viên được viết hoa là một IMO không có no lớn, nó thực sự không rõ ràng cho dù bạn đang giải quyết thành viên cá thể của thành viên hay thành viên tĩnh của một lớp. – Creynders

Trả lời

3

Trong mô hình MVC truyền thống xem có sự phụ thuộc trực tiếp vào mô hình giống như www0z0k đã viết, nhưng tôi cũng nghĩ đó không phải là giải pháp lý tưởng.

Chúng theo cách bạn thiết lập bộ điều khiển, nó hoạt động như một người hòa giải giữa mô hình và chế độ xem, và đó chắc chắn là một giải pháp rất hợp lệ. Tuy nhiên, nếu bạn muốn có một giao tiếp trực tiếp hơn từ mô hình để xem (nó sẽ giúp bạn tiết kiệm một số mã), bạn có thể tạo một eventdispatcher trung tâm, chuyển nó tới các mô hình và cho phép họ sử dụng eventdispatcher trung tâm để gửi các sự kiện cập nhật của họ, sau đó cũng vượt qua eventdispatcher trung tâm để xem và để cho khung nhìn lắng nghe các sự kiện được gửi trực tiếp bởi các mô hình. Bằng cách đó, chế độ xem không có sự phụ thuộc trực tiếp vào các mô hình, nhưng vẫn có thể nghe các sự kiện mà họ gửi. Trong trường hợp đó, bộ điều khiển sẽ chỉ dịch các sự kiện xem sang các mô hình.

Diagram: http://bit.ly/sTSDVT

Bộ điều khiển cập nhật các mô hình trực tiếp, nhưng nó cũng nghe dispatcher sự kiện trung tâm cho bản cập nhật từ mô hình (nếu cần) và chuyển chúng đến xem. Nó cũng lắng nghe các sự kiện xem

Mô hình chỉ có phụ thuộc vào người điều phối sự kiện và sử dụng nó để gửi các sự kiện cập nhật.

Chế độ xem chỉ có phụ thuộc vào người điều phối sự kiện và lắng nghe cập nhật sự kiện từ mô hình. Nó cũng gửi các sự kiện riêng của nó. (Bạn có thể sử dụng trình điều phối sự kiện trung tâm cho điều đó, nhưng tôi không khuyến nghị điều đó)

0

điều khiển lắng nghe và cập nhật mô hình, phần này phù hợp với tầm nhìn của tôi về MVC.
nhưng tôi muốn cố gắng để tránh liên quan đến điều khiển trong mô hình liên kết để xem:

_model = new Model(); 
    _view = new View(this, _model); 
    _control = new Control(_model, _view); 

trong mô hình:

public class Model extends EventDispatcher{ 
    //............ 
    public function AddClick():void { 
     _totalClicks++; 
     dispatchEvent(new Event('one more click')); 
    } 

theo quan điểm:

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

Tôi thấy những gì bạn đã làm ở đó. Tôi hiểu rằng Model bây giờ cũng đang cử các sự kiện và View đang lắng nghe. Tuy nhiên, bạn phải chuyển thể hiện _model tới View Constructor. Chế độ xem hiện yêu cầu _model để nó hoạt động. Tại sao điều này tốt hơn? Nếu có nhiều Mô hình sử dụng Chế độ xem này, tôi sẽ phải thêm trình xử lý sự kiện vào Chế độ xem cho mỗi một trong số các mô hình đó. – rotaercz

+0

trong những trường hợp như vậy, tôi thường sử dụng một bộ điều phối tĩnh, vì vậy mỗi phần tử ui tôi thêm một người nghe vào nó và mọi thay đổi giá trị mô hình gây ra một sự kiện được gửi đi, trong khi tôi không cần tham chiếu mô hình trong khung nhìn của tôi – www0z0k

+0

thực sự khuyên bạn nên chống lại bằng cách sử dụng một điều phối tĩnh, bởi vì nó liên kết các lớp của bạn với một cá thể cụ thể. Điều gì xảy ra nếu bạn quyết định muốn hai mạch điều phối sự kiện thay vì một mạch? Sau đó, bạn sẽ được refactoring tất cả các lớp học của bạn. Như một vấn đề của tính chất tĩnh thực tế nên luôn luôn tránh được ngoại trừ trong hai trường hợp: consts và tài sản phản ánh trạng thái lớp (ví dụ một truy cập ví dụ) – Creynders

0

Tôi tin rằng Introduction to Flex Application’s Architecture - Redux của tôi sẽ rất quan tâm đến bạn.

Để biết cách tiếp cận hào nhoáng hơn, bạn có thể kiểm tra FLit Framework. MVCSprite rất giống với giải pháp của bạn.

Chơi với nhiều khung công tác qua nhiều năm, tôi đã tin rằng việc thực hiện 'đúng' và 'lý tưởng' không thực sự rất thực tế. Các mẫu thiết kế không chính thức - đây chỉ là những ý tưởng luôn được điều chỉnh theo các thuộc tính chất lượng mà bạn đang cố gắng đạt được. Hãy ghi nhớ rằng nó sẽ là một dịp rất hiếm để thực sự làm móng tay tiếp cận trong một lần lặp đơn - đôi khi phải mất nhiều dự án được hoàn thành trước khi bạn phát hiện ra một cách tốt hơn - để có được một cái nhìn sâu sắc hơn.

+1

Giới thiệu là liên kết bị hỏng và các dự án tại Google Code đang ngừng hoạt động. –

Các vấn đề liên quan