Pull to refresh

Зачем нужны паттерны проектирования или «Что такое MVC?»

Reading time4 min
Views12K
Самое главное во всех фреймворках это то, что все они диктуют правила создания приложения. Если ты никогда не использовал никакого фреймворка в своих приложениях, то либо они слишком малы и ты не сталкивался с проблемой нарастающего хаоса в коде, либо просто не пришло твоё время :) И в конце концов приложение созданное по правилам фреймворка однозначно обретёт правильную форму. А разве не этого все мы хотим? Новичок в программировании начав изучение какого-либо фреймворка автоматически начинает правильно мыслить, тем самым перенимая опыт предыдущих поколений и открывая себе более гладкую дорогу вперёд. В любом случае единственная возможность создания больших, расширяемых и модульных приложений это использование фреймворка.

Итак начнём…

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
Вот и всё!
Tags:
Hubs:
-9
Comments27

Articles

Change theme settings