logo
  • Home
  • Acerca
  • Autores
  • Faq
  • Rede
  Twitter   Feed-me! RSS!

Dica Flex – Utilizando o padrão Typesafe Enum no ActionScript 3.0

Colocado por Pablo Souza na(s) categoria(s): 1, 2009, 4, 6, action, Actionscript, ActionScript 3, Adobe, app, AR, arte, BI, blog, boolean, break, case, class, classe, classes, código, demo, Dica, Download, err, erro, error, event, events, Excel, exemplo, Flex, for, function, handle, html, ide, IE, if, image, Java, library, Livro, MXML, O, on, Oracle, padrão, problema, pt, RIA, Ria’s Geral, RoR, Segurança, spark, state, string, TAT, Teste, UAU, UI, utf8, XML em 01 7th, 2011 | Sem comentários

Um das grandes passagens do livro Code Complete é sem dúvidas aquela que diz: “se uma linguagem não suporta nativamente uma determinada implementação, você deve então programar ‘para a linguagem’ e não ‘na linguagem’ “. O exemplo que o livro apresenta para essas limitações é justamente com relação ao Typesafe Enum, nossa dica Flex de hoje.

Os Enums são muito utilizados para evitar redundância de código e garantir o máximo de segurança nas aplicações. Além de serem excelentes objetos para se trabalhar com estados e tipos, eles também são parte essencial quando trabalhamos com o padrão de projeto State. Ele é muito utilizado também para limitar as opções de argumentos para determinados métodos. O problema é que diferente do Java 5 ou do ActionScript 2, o ActionScript 3 não suporta Enums e não permite usar o modificador privado no construtor das classes.

Suponha que temos um método que retorna a URL de uma imagem em 3 diferentes tamanhos: Pequeno, médio e grande. Para retornar o caminho dessa imagem passamos como argumento do método qual o tamanho que esperamos. Sem utilizar o Typesafe Enum poderíamos fazer conforme código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="application1_initializeHandler(event)">

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private static const PEQUENO:String     = "pequeno";
            private static const MEDIO:String     = "medio";
            private static const GRANDE:String   = "grande";

            protected function application1_initializeHandler(event:FlexEvent):void
            {
                trace( retornaCaminhoImagem("texto qualquer") );
            }

            private function retornaCaminhoImagem(tamanho:String):String
            {
                var caminho:String;
                switch(tamanho)
                {
                    case PEQUENO:
                    {
                        caminho = "http://www.suaurl.com/imagem_pequena.jpg";
                        break;
                    }
                    case MEDIO:
                    {
                        caminho = "http://www.suaurl.com/imagem_media.jpg";
                        break;
                    }
                    case GRANDE:
                    {
                        caminho = "http://www.suaurl.com/imagem_grande.jpg";
                        break;
                    }
                    default:
                    {
                        caminho = "[ERRO]";
                    }
                }

                return caminho;
            }

        ]]>
    </fx:Script>

</s:Application>

O problema no código acima é que podemos passar como argumento do método “retornaCaminhoImagem()” qualquer string:

1
trace( retornaCaminhoImagem("texto qualquer") );

Para resolvermos o problema acima vamos criar uma classe que implementa o padrão Typesafe Enum:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package enum
{
    public class ImageSizeEnum
    {

        public static const PEQUENO:ImageSizeEnum   = new ImageSizeEnum("pequeno");
        public static const MEDIO:ImageSizeEnum     = new ImageSizeEnum("medio");
        public static const GRANDE:ImageSizeEnum    = new ImageSizeEnum("grande");

        private var _tamanho:String;

        private static var _instance:Boolean = false;

        // Bloco estático
        {
            _instance = true;
        }

        public function ImageSizeEnum(tamanho:String)
        {
            if(_instance)
            {
                throw new Error("Você não pode instanciar um Typesafe Enum");
            }
            _tamanho = tamanho;
        }

        public function toString():String
        {
            return this._tamanho;
        }
    }
}

Repare no bloco estático que criamos, ele será excutado assim que a classe for carregada na memória, portanto antes do construtor da classe ser chamado e depois que todos os membros estáticos forem criados.

Agora crie um novo método chamado “retornaCaminhoTypesafeEnum()”:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private function retornaCaminhoTypesafeEnum(tamanho:ImageSizeEnum):String
            {
                var caminho:String;
                switch(tamanho)
                {
                    case ImageSizeEnum.PEQUENO:
                    {
                        caminho = "http://www.suaurl.com/imagem_pequena.jpg";
                        break;
                    }
                    case ImageSizeEnum.MEDIO:
                    {
                        caminho = "http://www.suaurl.com/imagem_media.jpg";
                        break;
                    }
                    case ImageSizeEnum.GRANDE:
                    {
                        caminho = "http://www.suaurl.com/imagem_grande.jpg";
                        break;
                    }
                    default:
                    {
                        caminho = "[ERRO]";
                    }
                }

                return caminho;
            }

Para utilizá-lo faça:

1
trace( retornaCaminhoTypesafeEnum(ImageSizeEnum.GRANDE) );

Faça alguns testes, tente instanciar nosso Enum para criar um novo tipo:

1
var enum:ImageSizeEnum = new ImageSizeEnum("novo_tipo");

Como resultado você deve ter recebido um erro em tempo de execução com a mensagem: “Você não pode instanciar um Typesafe Enum”.

Agora tente passar uma string qualquer como argumento do método “retornaCaminhoTypesafeEnum()”:

1
trace( retornaCaminhoTypesafeEnum("novo_tipo") );

Você deve ter visto um erro em tempo de compilação uma vez não ser possível passar como argumento do método uma string quando ele espera o tipo “ImageSizeEnum”.

Bom galera espero que tenham gostado. Veja aqui um projeto de exemplo.

Até a próxima!



Veja o post original no blog do autor aqui!  

Pablo Souza

Escrito por Pablo Souza @ http://rectius.com.br/blog
Saiba mais sobre o autor na sua pagina de perfil
Outros posts do autor:
» Dica Flex – Trazendo janelas para o topo com IFocusManagerComponent
» Confirmation request before closing an Air app
» A simple Dashboard using Flex 4

Deixe um comentário



Spam Protection by WP-SpamFree

ACERCA

O que é o RedeRIA ?

O redeRIA não é nada mais que um agregador de feed's que disponibiliza o conteudo de varios blogs e autores ao redor do mundo RIA, actualmente agregamos mais de 2791 entradas vindas de 53 blogs especializados em ria’s, pelo que só fica a ganhar em assinar o feed ou seguir a comunidade no twitter.

Se acha que o seu blog ou um blog de um amigo é interessante e util para os leitores o redeRIA, faça a sua submissão aqui.

Feed: assine já
Twitter: siga-nos

GOOGLE

Votação


Deveria o RedeRia agregar conteúdo em inglês?
Ver Resultados

AUTORES


Eduardo KrausAlexandre TadashiBindableCognitiva SoluçõesDaniel LopesDaniel SchmitzDanielPedrinhaDClick TeamEbercomEdgard DavidsonElvis FernandesErko BrideeFabiel PrestesFábio Batista da SilvaFabio da SilvaFabriccio BernardesFelipe BorellaFlavia MoreiraGabriel VersalliniGabriela T. PerryIgor MusardoJanderson CardosoJoão AugustoJose Carlos FielKelps SousaLeonardo FrançaLucas MarçalLuis MessiasLuiz TarabalMario JuniorMário SantosMauro MartinsPablo SouzaPedro ClaudioreneRia BrazilriaPTRicardo CerqueiraRobson FernandesRodrigo Pereira FragaSaintBrSamuelFacchinelloSergio SouzaSilva DeveloperStefan HorochovecTech CaffeTecinforThiago BuenoVedVinícius SandimWillian ManoXAML Cast

PUBLICIDADE








Powered by Wordpress & msdevstudio.com