Тема: Хорошее MVC
Показать сообщение отдельно
Старый 05.04.2010, 22:07
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 6  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Спасибо, начинаю понимать.
1) Я так понимаю в контроллер всегда передаётся DisplayObjectContainer, говорящий куда пихнуть вьюшку?
б) я имею ввиду что раз контроллер создаёт и вьюшку, и модель то он сохраняет их ссылки. Ну в принципе вопрос риторический, не сохранять было бы глупо.
в) а как можно ссылаться снаружи на то, что было создано внутри? Диспатчится событие и на неё начинают ссылаться?
г) теперь понял что это, думал о другом =)

Такс, применив свои знания набросал это в коде, посмотри пожалуйста:
Базовый класс:
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class JustMain extends Sprite
	{
 
		public function JustMain() 
		{
			super();
			var controller:Controller = new Controller(this);
		}
 
	}
 
}
Контроллер:
Код AS3:
package  
{
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Controller
	{
		private var _model:Model = new Model();
		private var _viewer:Viewer = new Viewer();
		private var _container:DisplayObjectContainer;
		public function Controller(container:DisplayObjectContainer) 
		{
			_container = container;
			init();
		}
 
		private function init():void
		{
			_container.addChild(_viewer);
			_model.addEventListener(Event.CHANGE, onModelChange);
			_viewer.addEventListener(MouseEvent.CLICK, onViewerClick);
 
		}
 
		private function onViewerClick(e:MouseEvent):void 
		{
			_model.change(Math.random() * 400, Math.random() * 400);
		}
 
		private function onModelChange(e:Event):void 
		{
			_viewer.updatePositions(_model.x, _model.y);
		}
 
	}
 
}
Моделька:
Код AS3:
package  
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
 
	public class Model extends EventDispatcher
	{
 
		//no getters/setters, just example
		public var x:Number = 0;
		public var y:Number = 0;
 
		public function Model() 
		{
			super(null);
 
		}
 
		public function change(x:Number, y:Number):void {
			this.x = x;
			this.y = y;
			super.dispatchEvent(new Event(Event.CHANGE));
		}
 
	}
 
}
И вьюшка:
Код AS3:
package  
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
 
	public class Viewer extends Sprite
	{
 
		public function Viewer() 
		{
			super();
			init();
		}
 
		private function init():void
		{
			var someSprite:Sprite = new Sprite();
			someSprite.graphics.beginFill(0);
			someSprite.graphics.drawCircle(0, 0, 50);
			someSprite.graphics.endFill();
			super.addChild(someSprite);
			someSprite.addEventListener(MouseEvent.CLICK, super.dispatchEvent);
		}
 
 
		public function updatePositions(x:Number,y:Number):void {
			this.x = x;
			this.y = y;
		}
	}
 
}
По клику на кружок событие идёт в контроллер, оттуда просит модель изменить данные, модель данные меняет и говорит контроллеру, который обновляет вьюшку.

Возникает отсюда уже несколько вопросов:
1) Чтобы было совсем идеально-правильное MVC на твой взгляд, что нужно добавить, а что убрать?
2) Наверное, на столь простом примере не видно - но зачем такой полёт данных? Ведь если контроллер изменяет все данные, а моделька их всего лишь хранит - тогда, наверное, контроллеру уж точно видно что данные изменены и надо что то сказать вьюшке, зачем в моделе уведомлять об изменении?
3) А если я ф-цию change заменю 2-мя сеттерами, тогда я дважды вызову уведомление об обновлении, что плохо. Как быть?

Было бы очень здорово, если бы ты ткнул на конкретно этом примере, как сделать лучше.