Flex/AS3 – Truques e Dicas #8 – Re-use o código!

Flex/AS3 – Truques e Dicas #8 – Re-use o código!

Outro dos bons exemplos que se podem fazer ao criar uma aplicação usando actionscript 3 é a utilização do código, num dos simples exemplos vou mostrar como podemos usar apenas uma função para lidar com 4 ou mais eventos…e de tipos diferentes!

Na minha aplicação, tinha a necessidade de adicionar alguns eventos (inicialmente do rato) a um elemento e lidar com os mesmos, muita gente faria, por exemplo ao lidar com 4 eventos do rato numa dataGrid:

[coolcode] dg.addEventListener(MouseEvent.CLICK, onClick);
dg.addEventListener(MouseEvent.MOUSE_WHEEL onMouseWheel);
dg.addEventListener(MouseEvent.ROLL_OVER, onRollOver);
dg.addEventListener(MouseEvent.ROLL_OUT, onRollOut);
[/coolcode]

O que neste caso teriamos que usar 4 funções diferentes: onClick, onDoubleClick, onRollOver, onRollOut do estilo:
[coolcode] private function onClick(evt:MouseEvent):void { }
private function onMouseWheel(evt:MouseEvent):void { }
private function onRollOver(evt:MouseEvent):void { }
private function onRollOut(evt:MouseEvent):void { }
[/coolcode]

É facil compreender que muita gente use esta forma (eu já usei), mas existe uma forma mais pratica, uma vez que todos os eventos são MouseEvent, podemos fazer apenas uma função:
[coolcode] dg.addEventListener(MouseEvent.CLICK, onDGMouse);
dg.addEventListener(MouseEvent.MOUSE_WHEEL, onDGMouse);
dg.addEventListener(MouseEvent.ROLL_OVER, onDGMouse);
dg.addEventListener(MouseEvent.ROLL_OUT, onDGMouse);
[/coolcode]
e construir apenas uma função em vez de 4, fazend o uso de comparação do tipo de evento:
[coolcode] private function onDGMouse(evt:MouseEvent):void {
switch(evt.type) {
case MouseEvent.CLICK:
trace(“Evento click: “+evt.type);
break;

case MouseEvent.MOUSE_WHEEL:
trace(“Evento roda do rato: “+evt.type);
break;

case MouseEvent.ROLL_OVER:
trace(“Evento Roll Over: “+evt.type);
break;

case MouseEvent.ROLL_OUT:
trace(“Evento Roll Out: “+evt.type);
break;

default:
Alert.show(“Evento detectado, nenhuma função associada!: “+evt.type);
break;
}

}
[/coolcode]

Como podem ver simplificamos o trabalho e ficamos com o código mais organizado, mas ainda podemos alargar esta função a mais eventos, aliás, a todos os eventos do rato, mas não só… se mudarmos a declaração da função de
[coolcode] private function onDGMouse(evt:MouseEvent)
[/coolcode] para
[coolcode] private function onDGMouse(evt:*)
[/coolcode] A nossa função passa a poder receber qualquer tipo de evento, se bem que nem todos os programadores são de acordo em usar este tipo de função “handler” de multi-eventos, a verdade é que muitas vezes reduzimos o código em dezenas de linhas e o colocamos bem mais legil, ora vejam como além dos eventos do rato, a mesma função passa a poder receber e lidar com DragEvent’s ou DataGridEvent’s:
[coolcode] private function onDGMouse(evt:*):void {
switch(evt.type) {
case MouseEvent.CLICK:
trace(“Evento click: “+evt.type);
break;

case MouseEvent.MOUSE_WHEEL:
trace(“Evento roda do rato: “+evt.type);
break;

case MouseEvent.ROLL_OVER:
trace(“Evento Roll Over: “+evt.type);
break;

case MouseEvent.ROLL_OUT:
trace(“Evento Roll Out: “+evt.type);
break;

case DataGridEvent.COLUMN_STRETCH:
trace(“Evento DG :”+evt.type);
break;

case DragEvent.DRAG_ENTER:
trace(“Evento DRAG :”+evt.type);
break;

default:
Alert.show(“Evento “+evt.type+”detectado, nenhuma instrução associada!: “);
break;
}

}
[/coolcode] Neste momento podemos dizer que esta função é valida para lidar com quase qualquer evento, vejam 3 eventos completamente diferentes a usarem a mesma função de “event handle”:
[coolcode] dg.addEventListener(MouseEvent.CLICK, onDGMouse);
dg.addEventListener(DataGridEvent.COLUMN_STRETCH, onDGMouse);
dg.addEventListener(DragEvent.DRAG_ENTER, onDGMouse);
[/coolcode]

Como devem imaginar, pode ser, e é, muito util!!

Abraço.


3 comments

add yours
  • felipe April 10, 2009

    o seria do flex se não fosse santos como você, Obrigado por mais essa dica, a partir de hoje sempre vou fazer assim.

  • GESSE September 12, 2009

    parabens , obrigado

  • Rafael Möller March 6, 2010

    Ótimo artigo.
    Porém, podemos prover uma assinatura padrão para eventos utilizando a classe genérica para eventos flash.events.Event ao invés de “*”.
    O que torna um método fortemente tipado, reduzindo a utilização de closures.

Leave a Comment

Post