본문 바로가기

ActionScript/AS3.0

Message Queueing




코드는 알아보기 쉬워야 한다.


굳이 켄트벡의 구현 패턴을 언급할 필요도 없이 알아보기 쉬운 코드가 좋다는것은 누구나 동의할것이다.

이상적인 경우의 한가지로 로직의 흐름이 코드에 적힌대로 순서대로 이루어진다면 알아보기 쉬울 것이다.



이미지의 경로가 담긴 xml을 로드하여 해당이미지들을 로드한 후 필터효과를 주고 화면에 표시하려고 할 경우

아래와 같은 식의 코드라면 굳이 주석을 달지 않아도 하고자하는것이 무엇인지 알게 된다.




하지만 Flash의 경우 각종 로드작업으로 인한 비동기 작업을 많이 하게 되므로 피치못하게

코드의 흐름이 끊기게 된다 아래의 코드가 보통의 코드흐름이다.



이를 해결하기 위한 방법이 바로  큐구조 이다.

각종 명령을 큐에 담아 명령이 완료되었을때 다음 큐에서 명령을 꺼내와 실행.


이는 각종 로드, 모션작업이 많고 이를 이벤트구조로 처리해야하는 액션스크립트에서 완소!

실제로 제이쿼리에서는 이러한 큐서비스가 지원되므로 animate를 이용한 모션작업시 편리하다.


액션스크립트에서 적용하기 위한 방법은 hika 님의 블로그에 Message Queueing 서비스라는 제목으로 포스팅이 되어있다.



http://www.diebuster.com/flash/156



결국 중요한 것은 명령을 어디엔가 담고 차례차례 실행시킨다는 것이다.



포스트글을 요약하자면



1.함수를 배열 혹은 벡터에 담는다. 이때 비동기 실행이 될 함수, 동기 실행이 될 함수로 구분해야 하므로

  문자열과 함수를 하나의 세트로 하여 (오브젝트타입) 담는다.


2. 담아질 비동기 함수는 인자로 함수를 받을 수 있는 시그니처여야 한다.


3. 실행을 하면 배열 혹은 벡터의 크기와 카운터를 이용하여 순차적으로 실행한다.


4. 만약 실행할 함수가 비동기 처리가 필요하지 않다면 카운터를 이용해 다음 순서의 함수를 꺼내어 실행하고

  비동기 함수라면 해당함수의 인자로 다음 순서의 함수를 넘긴다.



hika 님의 포스트의 내용은 핵심 내용일뿐 MQ 라는 클래스까지 반드시 따라할 필요는 없다.

로직만 이해하면 자신만의 커스텀화된 라이브러리를 가질 수 있을 것이다.


나같은 경우 static 가 아니라 객체로 만들어 다수의 큐를 관리할 수 있게 하고 큐에 담긴 모든 명령이 실행이 완료되면 이벤트를 

완료 이벤트를 dispatch 하도록 아주 약간 수정하여 쓰고 있다. 


급할때 이용하긴 좀 귀찮을 수도 있으나 리팩토링할땐 반드시 사용하게 된다. 몇달이 지나도 코드를 다시보기 편함;