sexta-feira, 8 de julho de 2011

Usando o forEach com Vector

Olá, está cansado de usar FOR ou WHILE para percorrer seus vetores? Essa funcionalidade também suportada pelo Array facilita executar um bloco de comandos para cada ítem, assim como deixa seu código e lógica muito mais desacoplados.

Se ainda não conhece a classe Vector, clique aqui para ver o post que fiz sobre a classe. Vale a pena dar uma olhada e entender o porque de usá-la ao invés do Array. Mas se já conhece, vamos ao estudo de caso…

O caso é simples, você tem 200 bolinhas coloridas na tela e quer usar a mesma lógica de colorir (da criação) quando uma delas for clicada pelo usuário. Nesse caso podemos criar um único método que encapsulará essa lógica e usá-la na criação, e como callback no ForEach.

Código fonte abaixo…

   1: package
   2: {
   3:     import flash.display.Graphics;
   4:     import flash.display.Sprite;
   5:     import flash.events.MouseEvent;
   6:  
   7:     [SWF( width = "500", height = "300" )]
   8:     /**
   9:      * Classe das Bolinhas Coloridas
  10:      *
  11:      * @author Idemax Green
  12:      * @blog   www.idemax.net
  13:      * @idemax www.twitter.com/idemax
  14:      *
  15:      */
  16:     public class ColorBalls extends Sprite
  17:     {
  18:         private static const _BALLS_LEN:uint = 200;
  19:  
  20:         private var _ballsMap:Vector.<Sprite>;
  21:  
  22:         /**
  23:          * Construtor.
  24:          */
  25:         public function ColorBalls()
  26:         {
  27:             _ballsMap = new Vector.<Sprite>( _BALLS_LEN );
  28:  
  29:             createBalls();
  30:         }
  31:  
  32:         /**
  33:          * Troca a cor da bolinha.
  34:          *
  35:          * @param $item Sprite da bolinha.
  36:          * @param $index Índice do ítem no vector (_ballsMap).
  37:          * @param $vector Vector _ballsMap.
  38:          *
  39:          */
  40:         private function colorBall( $item:Sprite,
  41:                                     $index:int = NaN,
  42:                                     $vector:Vector.<Sprite> = null ):void
  43:         {
  44:             var graph:Graphics = $item.graphics;
  45:  
  46:             graph.clear();
  47:             graph.beginFill( 0xFFFFFF * Math.random());
  48:             graph.drawCircle( 0, 0, 15 );
  49:             graph.endFill();
  50:         }
  51:  
  52:         /**
  53:          * Cria, colore, adiciona no mapa e na tela, e adiciona o evento de CLICK.
  54:          */
  55:         private function createBalls():void
  56:         {
  57:             var ball:Sprite;
  58:             var stageWidth:uint  = stage.stageWidth;
  59:             var stageHeight:uint = stage.stageHeight;
  60:  
  61:             for( var i:uint = 0; i < _BALLS_LEN; i++ )
  62:             {
  63:                 ball = new Sprite();
  64:  
  65:                 colorBall( ball );
  66:  
  67:                 ball.x = Math.abs( stageWidth * Math.random());
  68:                 ball.y = Math.abs( stageHeight * Math.random());
  69:  
  70:                 _ballsMap[ i ] = ball;
  71:  
  72:                 addChild( ball );
  73:  
  74:                 ball.addEventListener( MouseEvent.CLICK, onBallMouseClick );
  75:             }
  76:         }
  77:  
  78:         /**
  79:          * Handler do evento de CLICK na bolinha.
  80:          *
  81:          * @param $event
  82:          *
  83:          */
  84:         private function onBallMouseClick( $event:MouseEvent ):void
  85:         {
  86:             _ballsMap.forEach( colorBall );
  87:         }
  88:     }
  89: }

Qualquer dúvida, postem nos comentários.