Самое главное во всех фреймворках это то, что все они диктуют правила создания приложения. Если ты никогда не использовал никакого фреймворка в своих приложениях, то либо они слишком малы и ты не сталкивался с проблемой нарастающего хаоса в коде, либо просто не пришло твоё время :) И в конце концов приложение созданное по правилам фреймворка однозначно обретёт правильную форму. А разве не этого все мы хотим? Новичок в программировании начав изучение какого-либо фреймворка автоматически начинает правильно мыслить, тем самым перенимая опыт предыдущих поколений и открывая себе более гладкую дорогу вперёд. В любом случае единственная возможность создания больших, расширяемых и модульных приложений это использование фреймворка.
Итак начнём…
MVC «Модель-представление-поведение» === «Модель-представление-контроллер».
А теперь закрой глаза и представь себе работу своего приложения. Представил?… так вот, попробуй условно разбить этот процесс на три абстрактые логические части:
Собери все методы своего приложения которые занимаются обработкой всех визуальных компонентов, методы которые имеют знания о визуальном элементе, которые занимаются перемещением их по экрану и т.д. Мысленно объедини их в одну часть программы, это и будет (Представление).
Далее. Собери все методы своего приложения которые занимаются логикой приложения, методы которые имеют знания о том, что и как делать. Модель поведения компонентов приложения. Мысленно объедини их в одну часть программы, это и будет (Модель).
Третья, но не менее важная часть, это те методы в которых реализовано само поведение модели. Так называемый «Контроллер». Вообщем это любые методы, которые вызываются к примеру событием проигрыша игры, допустим: function onLoseLevel(e:SomeEvent):void. В данном случае этот метод является поведением модели вашего приложения в случае проигрыша. Как только вы проиграли уровень вызывается конкретный метод, которые реализует поведение приложения в конкретном случае. Так вот, собери все методы, реализующие поведение в одну кучу
это и будет третья логическая часть концепции MVC, (Контроллер).
Для тех кто не до конца понял и не ответил на вопрос для чего нужно это все разбиение: Для того, чтобы уменьшить связываемость кода, т.е. меняя, что-то в проекте изменения не затронут другой части программы. Таким образом наше приложение может быть более гибким и состоять из независимых модулей и приспособлено к рефакторингу.
Реализация концепции MVC на примере приложения HellowWorld
HelloWorld.as:
Model.as
View.as:
Controller.as:
Ок. Разберём что же здесь происходит. Есть Главный класс приложения: HelloWorld.as который ответственный за всё. В нём мы создаём один единственный визуальный компонент типа TextField (текстовое поле), а также экземпляры Model.as, View.as и Controller.as. Теперь как это всё связать?
Для начала передадим визуальный компонент в управление нашему View путём передачи его в конструктор:
artemfedorov.com/?p=64
Теперь наша View знает о компоненте.
Далее, добавим метод во View с помощью которого она сможет влиять на компонент:
здесь всего лишь происходит присвоение текстовому полю компонента нового значения типа String.
Наша Model в этом примере содержит лишь знания о значении строковой переменной и на это бизнес логика ограничивается.
Controller содержит тоже лишь одну команду, которая получает значение из Model и сообщает View что нужно сделать:
Далее заключительный штрих без которого ничего не будет работать это событие. Здесь для примера события я выбрал событие, которое возникает когда происходит добавление на stage и добавил слушатель:
addEventListener(Event.ADDED_TO_STAGE, showTextHandler);
К этому событию я привязал команду реализуя поведение моего приложения:
www.artemfedorov.com
Вот и всё!
Итак начнём…
MVC «Модель-представление-поведение» === «Модель-представление-контроллер».
А теперь закрой глаза и представь себе работу своего приложения. Представил?… так вот, попробуй условно разбить этот процесс на три абстрактые логические части:
Собери все методы своего приложения которые занимаются обработкой всех визуальных компонентов, методы которые имеют знания о визуальном элементе, которые занимаются перемещением их по экрану и т.д. Мысленно объедини их в одну часть программы, это и будет (Представление).
Далее. Собери все методы своего приложения которые занимаются логикой приложения, методы которые имеют знания о том, что и как делать. Модель поведения компонентов приложения. Мысленно объедини их в одну часть программы, это и будет (Модель).
Третья, но не менее важная часть, это те методы в которых реализовано само поведение модели. Так называемый «Контроллер». Вообщем это любые методы, которые вызываются к примеру событием проигрыша игры, допустим: function onLoseLevel(e:SomeEvent):void. В данном случае этот метод является поведением модели вашего приложения в случае проигрыша. Как только вы проиграли уровень вызывается конкретный метод, которые реализует поведение приложения в конкретном случае. Так вот, собери все методы, реализующие поведение в одну кучу
это и будет третья логическая часть концепции MVC, (Контроллер).
Для тех кто не до конца понял и не ответил на вопрос для чего нужно это все разбиение: Для того, чтобы уменьшить связываемость кода, т.е. меняя, что-то в проекте изменения не затронут другой части программы. Таким образом наше приложение может быть более гибким и состоять из независимых модулей и приспособлено к рефакторингу.
Реализация концепции MVC на примере приложения HellowWorld
HelloWorld.as:
package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; public class HelloWorld extends Sprite { private var viewComponent :TextField; public static var model :Model; public static var view :View; public static var controller :Controller; /** * Constructor * */ public function HelloWorld() { /*Add listener to catch an event to add to stage * */ addEventListener(Event.ADDED_TO_STAGE, showTextHandler); /* Creation one view component as TextField * */ viewComponent = new TextField(); addChild(viewComponent); /*Creation the Model * */ model = new Model(); /*Creation the View and giving viewComponent into constructor * */ view = new View(viewComponent); /*Creation the Controller * */ controller = new Controller(); } /*Set the command to handling on the event * */ protected function showTextHandler(event:Event):void { controller.showTextFieldCommand(); } } }
Model.as
package { public class Model { private var _textString :String = "Hello World!"; public function Model() { } public function get textString():String { return _textString; } public function set textString(value:String):void { _textString = value; } } }
View.as:
package { import flash.text.TextField; public class View { private var _view:Object; public function View(viewObj:Object) { view = viewObj; } /*Method to change text field in the view component * */ public function changeView(str:String):void { view.text = str; } public function set view(value:Object):void { _view = value; } public function get view():Object { return _view; } } }
Controller.as:
package { public class Controller { public function showTextFieldCommand():void { var str:String = HelloWorld.model.textString; HelloWorld.view.changeView(str); } } }
Ок. Разберём что же здесь происходит. Есть Главный класс приложения: HelloWorld.as который ответственный за всё. В нём мы создаём один единственный визуальный компонент типа TextField (текстовое поле), а также экземпляры Model.as, View.as и Controller.as. Теперь как это всё связать?
Для начала передадим визуальный компонент в управление нашему View путём передачи его в конструктор:
view = new View(viewComponent);
artemfedorov.com/?p=64
Теперь наша View знает о компоненте.
Далее, добавим метод во View с помощью которого она сможет влиять на компонент:
public function changeView(str:String):void { view.text = str; }
здесь всего лишь происходит присвоение текстовому полю компонента нового значения типа String.
Наша Model в этом примере содержит лишь знания о значении строковой переменной и на это бизнес логика ограничивается.
private var _textString :String = "Hello World!";
Controller содержит тоже лишь одну команду, которая получает значение из Model и сообщает View что нужно сделать:
public function showTextFieldCommand():void { var str:String = HelloWorld.model.textString; HelloWorld.view.changeView(str); }
Далее заключительный штрих без которого ничего не будет работать это событие. Здесь для примера события я выбрал событие, которое возникает когда происходит добавление на stage и добавил слушатель:
addEventListener(Event.ADDED_TO_STAGE, showTextHandler);
К этому событию я привязал команду реализуя поведение моего приложения:
protected function showTextHandler(event:Event):void { controller.showTextFieldCommand(); }
www.artemfedorov.com
Вот и всё!
