PureMVC Framework 수정사항

Vulcan Project에 사용된 PureMVC Framework의 코드는 일부 수정되어 사용 되었습니다. 수정된 내용은 다음과 같습니다.

PureMVC MultiCore for AS3 1.0.5

패키지 및 클래스 이름 변경

org.puremvc.as3.multicore 패키지 및 하위 구조는 com.vulcan.mvc.history 패키지를 제외한 com.vulcan.mvc 패키지 및 하위 구조와 1:1로 대응되어 경로 및 파일명(클래스 네임)이 변경되었습니다.

코드 수정

com.vulcan.mvc.core 패키지의 Controller, Model, View 클래스의 removeController, removeModel, removeView 메서드에서 각각 새로 정의한 clear 메서드를 호출하는 로직으로 변경되었습니다. 각 clear 메서드는 등록된 IController, IModel, IView 인스턴스를 명시적으로 모두 제거하는 역할을 합니다.

Controller.as

		// 수정된 메서드
		public static function removeController( key:String ):void
		{
			var controller:Controller = instanceMap[ key ];
			if(controller){
				controller.clear();
			}
		}
		
		// 추가된 메서드
		protected function clear():void
		{
			for(var notificationName:String in commandMap)
			{
				removeCommand(notificationName);
			}
			
			delete instanceMap[ multitonKey ];
		}

Model.as

		// 수정된 메서드
		public static function removeModel( key:String ):void
		{
			var model:Model = instanceMap[ key ];
			if(model){
				model.clear();
			}
		}

		// 추가된 메서드
		protected function clear():void
		{
			for(var name:String in proxyMap)
			{
				removeProxy(name);
			}
			
			delete instanceMap[ multitonKey ];
		}

View.as

		// 수정된 메서드
		public static function removeView( key:String ):void
		{
			var view:View = instanceMap[ key ];
			if(view){
				view.clear();
			}
		}
		
		// 추가된 메서드
		protected function clear():void
		{
			for(var name:String in mediatorMap)
			{
				removeMediator(name);
			}
			
			delete instanceMap[ multitonKey ];
		}


PureMVC Utility - AS3 / Undo 1.3

패키지 및 클래스 이름 변경

org.puremvc.as3.utilities.undo 패키지 및 하위 구조는 com.vulcan.mvc.history 패키지 및 하위 구조와 1:1로 대응되어 경로 및 파일명(클래스 네임)이 변경되었습니다.

코드 수정

PureMVC Standard 버전인 코드를 PureMVC MultiCore 버전에 적합하도록 수정되었습니다.

HistoryBase.as (원본의 UndoableCommandBase.as 파일)

		public function undo():void
		{
			if ( undoCmdClass == null )
				throw new Error("undo command 를 찾지 못함. registerUndoCommand 메서드를 사용하여 undo command 를 등록하세요.");
			
			/** The type of the notification is used as a flag, 
			 * indicating wheather to save the command into the history, or not.
			 * The undo command, shold not be recorded into the history, 
			 * and its notification type is set to UndoableCommandEnum.NON_RECORDABLE_COMMAND 
			**/
			var oldType:String = _note.getType();
			_note.setType( ProcessType.NON_RECORD );
			
			try
			{
				var commandInstance : ICommand = new undoCmdClass();
				
				// MultiCore를 위해 multitonKey 설정추가함.
				commandInstance.initializeNotifier(multitonKey);
				
				commandInstance.execute( _note );
			}
			catch ( err:Error )
			{
				trace("UNDO 에러 : " + this + ".\n " + err.getStackTrace() );
			}
			
			_note.setType( oldType );
		}

HistoryMacroBase.as(원본의 UndoableMacroCommandBase.as 파일)

		override public function executeCommand():void
		{
			//throw new Error("The undoable MACRO command does not have 'executeCommand' method implemented.");
			
			// don't record the sub commands
			var noteType:String = getNote().getType();
			
			// DO NOT RECORD THE SUBCOMMANDS INTO THE HISTORY
			getNote().setType( ProcessType.NON_RECORD );
			
			for ( var i:int = 0; i< subCommands.length; i++)	
			{
				var commandClassRef : Class = subCommands[i];
				var commandInstance : ICommand = new commandClassRef();
				
				// MultiCore를 위해 multitonKey 설정추가함.
				commandInstance.initializeNotifier(multitonKey);
				
				commandInstance.execute( getNote() );
			} 
			
			// SET BACK THE ORIGINAL TYPE OF THE NOTE
			getNote().setType( noteType );
		}


수정된 소스 코드와 PureMVC 라이선스 사본은 소스 저장소의 com.vulcan.mvc 패키지에 해당하는 디렉토리를 참고하시기 바랍니다.

저작자 표시 비영리 변경 금지
신고

'Documents > Startup' 카테고리의 다른 글

NAME, NAME_TYPE 속성을 이용한 인스턴스 찾기  (4) 2010.10.29
Vulcan Project 초기화 과정  (0) 2010.10.25
Vulcan Project 구조  (0) 2010.10.25
PureMVC Framework 수정사항  (4) 2010.10.16
TAG
트랙백 ( 0 )개 , 댓글 ( 4 ) 개가 달렸습니다.

Commentary

댓글을 달아 주세요.

  1. 시큰둥 2010.12.17 08:59 신고  댓글주소  수정/삭제  댓글쓰기

    PureMVC를 사용하셨네요.. ^^..

    요즘 PureMVC 를 사용해보고 있는데..
    혹시.. 특정 Mediator로만 Notify할수 있는 방법 아실까해서 문의를 드려봅니다.
    워낙 PureMVC관련 자료가 없어서.. ㅠ.ㅠ.

    문의드리고 싶은건...

    제가 PureMVC로 만드는 프로그램에..

    - ContainerMediator 3개.
    - ContainerMediator안에는 - ItemMediator 10개.
    - ItemMediator에는 ItemComponent가 매칭되어 있습니다..

    여기서 ItemComponent 에서 이미지 load가 끝나면..
    ItemComponent에서 -> ItemMediator로 Event 전달 -> ItemMediator가 Notify 전달..

    이렇게 load가 끝났다구 notify를 날리면..
    등록된 3개의 ContainerMediator 에 모두 전달되어 버립니다.. ㅠ.ㅠ..

    ContainerMediator가 늘어나면 늘어날수록 Performance가 떨어질것 같은데..
    그렇다고 ContainerMediator에서 if문으로 자기 id를 비교해서 처리하는 것도 이상한것 같고..

    특정 Mediator로만 이벤트를 전달할수 있는 방법은 없을까요??

    저렇게 Container에서 자신의 Mediator로 Event전달한 다음에..
    자기를 가지고 있는 상위 Mediator로 다시 이벤트나 Notify를 하려면 어떻게 구조를 잡아야 하는 걸까요??

    좋은 말씀 부탁드리겠습니다..

    • Favicon of http://vulcan9.tistory.com BlogIcon vulcan 2010.12.17 14:23 신고  댓글주소  수정/삭제

      고민끝에 생각해낸 방법입니다.
      Vulcan Project에도 이 방식이 적용되었습니다. ( http://vulcan9.tistory.com/92 )
      나중에라도 더 좋은 방법 찾으시면 알려주세요.

      요점은 ContainerMediator에 고유 아이디를 부여하고 이 아이디를 이용해 Notification을 식별합니다.
      간단한 코드로 설명해 봅니다.

      ==========================
      * ContainerMediator Mediator 생성, 등록
      var uid:String = containerComponent.uid;
      var name:String = ContainerMediator.NAME + uid;
      var mediator:IMediator = new ContainerMediator(name, containerComponent);
      facade.registerMediator(mediator);

      * ContainerMediator에서 Notification 청취목록에 등록(listNotificationInteres 메서드)
      var noteType:String = "loadComplete" + viewComponent.uid;

      ==========================
      * ItemMediator 생성, 등록
      var mediator:IMediator = new ItemMediator(ItemMediator.NAME, itemComponent);
      facade.registerMediator(mediator);

      * ItemMediator에서 containerComponent.uid값 참조 방법

      1) 생성자 인자로 전달하는 방법
      var mediator:IMediator = new ItemMediator(ItemMediator.NAME, itemComponent, containerComponent.uid);

      2) Mediator 생성 후 직접 변수 설정하는 방법
      mediator.containerUID = containerComponent.uid;

      3) Component 변수로 설정하여 viewComponent.containerUID로 접근하는 방법
      itemComponent.containerUID = containerComponent.uid;

      ==========================
      * ItemMediator에서 containerUID를 이용하여 Notification 발송
      var noteType:String = "loadComplete" + containerUID;
      sendNotification(noteType, noteBody);


      핵심은 ContainerMediator, ItemMediator에서 하나의 아이디를 공유하고 이를 통해 둘만이 알수 있는 NoteType을 동적으로 생성하여 사용한다는 점입니다.

  2. 시큰둥 2010.12.17 17:01 신고  댓글주소  수정/삭제  댓글쓰기

    아.. Nofify 명을 각각으로 설정하면 되는 거였군요.. 감사드립니다~~ ^^..

    그런데.. id로 전달을 하게 되면..
    itemMediator의 상위(ContainerMediator)가 변경 될때마다 id를 직접 for문 돌면서 변경을 해줘야 할것 같은데요..

    혹시.. ItemMediator에서 자신을 가지고 있는 ContainerMediator로..
    직접 Notify하거나 Event를 전달하는 방법은 없을까요??

    직접 이벤트를 전달할 수만 있으면 좋을것 같은데..
    혹.. 이런 구조가 PureMVC 구조의 룰을.. 깨뜨리는게 아닌지 걱정도 되기도 하고..

    아무튼.. 말씀해 주신 방법 감사드립니다~.. 좋은 말씀 다시한번 감사드립니다~~ ^^

    • Favicon of http://vulcan9.tistory.com BlogIcon vulcan 2010.12.18 17:14 신고  댓글주소  수정/삭제

      1)itemComponent에서 parent가 바뀔때 이벤트를 ItemMediator에서 받습니다.
      2)ItemMediator에서 containerUID값을 갱신해 줍니다.

      이런식으로 for문을 돌리지 않고 ItemMediator가 스스로 값을 갱신하도록 하는게 낳지 않을까 싶습니다.

      또한 Event나 Notification을 발생시키는 곳을 별 고민없이 선택하게되면 나중에 코드흐름을 파악하기가 정말 힘들어집니다.
      MVC의 목적이 세개의 영역을 되도록이면 분리시키자는 것이므로 이것만 잘 지켜진다면야 좋은 설계가 될 수 있을것 같네요.

Add a Comment

comment에 대한 답변글은 해당 글상자에 있는 "R"(reply)버튼을 클릭하여 작성해 주시기 바랍니다.

티스토리 툴바