Sexta-feira, 07 de março de 2008 às 09h00

Programando com Enumeração

Faça o curso: jQuery na Prática

Olá amigos! Neste artigo vamos conhecer o que é uma Enumeração, tanto em .NET, quanto no mySQL e como ela pode te ajudar nos seus projetos diários.

Clique aqui para dar download no projeto de exemplo.

O que é Enumeração?

Enumeração é um tipo de variável que vincula um valor constante numérico a um nome (string). Como exemplo, podemos dizer que se assemelha muito de uma lista. Por exemplo, queremos definir níveis fixos de usuários no nosso sistema.

  1. Administrador
  2. Diretor
  3. Gerente
  4. Analista
  5. Estagiário
  6. Visitante

Outro exemplo é se quisermos especificar tipos de animais que o nosso sistema de pet-shop aceita.

  1. Cachorro
  2. Gato
  3. Peixe
  4. Pássaro
  5. Outros

Note que para nós, 1 é cachorro, 2 é gato, 3 peixe , 4 Pássaro e 5 Outros. Para um sistema é sempre mais rápido trabalhar com números, do que com palavras. Quando salvamos estas informações em banco de dados, também pode nos ajudar a diminuir o espaço em disco, pois salvar 1, ocuparia menos espaço em disco do que salvar "Cachorro". Ainda mais se multiplicarmos por mil, dez mil, ou um milhão de registros.

Podemos salvar o valor da enumeração em um campo numérico, como por exemplo um tinyInt(1), caso o seu banco de dados não suporte enumeração. Porém, recomendo utilizar campo do tipo enumeração, caso o seu banco de dados suporte.

Como exemplo, vamos utilizar o mySQL. Caso não utilize o mySQL, pule a próxima parte deste artigo, e vá para a sessão "Mãos à obra".

Enumeração no mySQL

Em banco de dados, como o mySQL.

Vamos criar uma tabela (tblanimais) para armazenar os animais no sistema de pet-shop.

Campo Tipo

------ --------------------------------------------------

ID int(11)

Tipo enum('Cachorro','Gato','Peixe','Passaro','Outros')

Idade int(11)

Nome varchar(255)

O Create table ficaria assim:


CREATE TABLE `tblanimais` (                                                   
           `ID` int(11) NOT NULL auto_increment,                                    
           `Tipo` enum('Cachorro','Gato','Peixe','Passaro','Outros') default NULL,  
           `Idade` int(11) default NULL,                                            
           `Nome` varchar(255) default NULL,                                        
           PRIMARY KEY  (`ID`)                                                      
         ) ENGINE=InnoDB DEFAULT CHARSET=latin1   

Ao criar a enumeração na tabela, passamos os tipos, diretamente no create table.

Um comando de insert ficaria assim:

Insert into `animais`(`ID`,`Tipo`,`Idade`,`Nome`) values ( NULL,'Cachorro','14','Rufos')

Note que passamos a string, no tipo de enumeração.

Mesmo salvando "string", por de baixo dos panos uma enumeração possuí uma performance melhor do que se utilizássemos um campo varchar, por exemplo.

Pré-requisitos

  • Este artigo foi montado nas configurações abaixo. Não foi testado em outros ambientes.
  • Framework ASP.NET 2.0 com VB.net
  • Visual Studio 2005.

Mãos a obra

Vamos criar um sistema bem simples, só para entender como utilizar a enumeração com .NET.

Modelo da tela de exemplo a ser criadaModelo da tela de exemplo a ser criada

Crie um projeto web (pode ser em Vb.net ), e adicione um diretório chamado App_Code, caso ainda não exista.

Adicione uma classe no diretório App_Code de seu projeto web, chamada "enumeracoes.vb".


Imports Microsoft.VisualBasic

Public Class enumeracoes

    ''' <summary>
    ''' Enumeração de acesso
    ''' </summary>
    ''' <remarks></remarks>
    Public Enum Permissao
        [Diretor] = 2
        [Gerente] = 3
        [Analista] = 4
        [Estagiario] = 5
        [Visitante] = 6
        [Administrador] = Diretor Or Gerente Or Analista Or Estagiario Or Visitante
    End Enum

    ''' <summary>
    ''' Enumeração de animais
    ''' </summary>
    ''' <remarks></remarks>
    Public Enum Animais
        [Cachorro] = 1
        [Gato] = 2
        [Peixe] = 3
        [Pássaro] = 4
        [Outros] = 5
    End Enum

    ''' <summary>
    ''' Quando queremos tratar enumerações
    ''' como bits
    ''' </summary>
    ''' <remarks></remarks>
    <Flags()> Public Enum EstadoLed
        [TudoApagado] = 0
        [Aceso25PorCento] = 1
        [Aceso50PorCento] = 2
        [Aceso75PorCento] = 4
        [Aceso100PorCento] = 8
    End Enum

End Class

Enumeração em C# (como curiosidade)


public class enumeracoes
{

    /// <summary>
    /// Enumeração de acesso
    /// </summary>
    public enum Permissao
    {
        Diretor = 2,
        Gerente = 3,
        Analista = 4,
        Estagiario = 5,
        Visitante = 6,
        Administrador = Diretor | Gerente | Analista | Estagiario | Visitante
    }

    /// <summary>
    /// Enumeração de animais
    /// </summary>
    public enum Animais
    {
        Cachorro = 1,
        Gato = 2,
        Peixe = 3,
        Pássaro = 4,
        Outros = 5
    }

    /// <summary>
    /// Quando queremos tratar enumerações
    /// como bits
    /// </summary>
    [Flags()]
    public enum EstadoLed
    {
        TudoApagado = 0,
        Aceso25PorCento = 1,
        Aceso50PorCento = 2,
        Aceso75PorCento = 4,
        Aceso100PorCento = 8
    }

}

Note que coloquei um exemplo de enumeração chamada EstadoLed. Esta enumeração possui uma marca de Flag. Isto significa que pode ser tratada como bits, com portência de 2 (1, 2, 4, 8...).

Agora que criamos a nossa classe com as enumerações do sistema, vamos ver como interagir facilmente com a tela.

Crie uma página chamada default.aspx, em seu projeto. (Prefira em utilizar "code behind", ou seja, o código da página no arquivo default.aspx.vb). Na sua página default.aspx, copie o código.


<form id="form1" runat="server">
        <div>
            <fieldset>
                <legend>Permissão de acesso </legend>
                <asp:CheckBoxList ID="chkPermissao" runat="server">
                </asp:CheckBoxList><br />
                <asp:Button ID="btnMostrarValores" runat="server" Text="Mostrar Valores Selecionados" />
                <br />
                <br />
                <asp:Label ID="lblValoresSelecionados" runat="server"></asp:Label>
            </fieldset>
        </div>
        <br />
        <fieldset>
            <legend>Animais </legend>
            <i>Selecione o tipo de animal abaixo.</i><br />
            <asp:DropDownList ID="ddlAnimais" runat="server" AutoPostBack="true">
            </asp:DropDownList><br />
            <asp:Label runat="server" ID="lblSQLAnimais"></asp:Label>
        </fieldset>
        <br />
    </form>

Para trabalhar com a permissão, vamos criar o código abaixo.


#Region "Permissão"

    ''' <summary>
    ''' Método que carrega a permissão na checkbox
    ''' </summary>
    Private Sub carregarPermissao()
        Dim sPermissoesNomes As String() = System.[Enum].GetNames(GetType(enumeracoes.Permissao))

        For Each sPermissao As String In sPermissoesNomes
            ' Para cara ítem na minha enumeração, eu adiciono na checkbox list
            chkPermissao.Items.Add(New ListItem(sPermissao, Convert.ToString(sPermissao)))
        Next
    End Sub

    ''' <summary>
    ''' Método do botão Mostrar valores, que nos permite receber o que o usuário selecionou
    ''' </summary>
    Protected Sub btnMostrarValores_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMostrarValores.Click
        Dim sValoresSelecionados As String = String.Empty

        For Each oChkItem As ListItem In chkPermissao.Items
            If oChkItem.Selected Then
                Dim enumPermissao As New enumeracoes.Permissao

                ' Dou um parse no valor da checkbox, se selecionada, para poder exibir o valor
                enumPermissao = System.Enum.Parse(GetType(enumeracoes.Permissao), oChkItem.Value)

                sValoresSelecionados &= enumPermissao & " (" & enumPermissao.ToString & "); "
            End If
        Next

        lblValoresSelecionados.Text = sValoresSelecionados
    End Sub
#End Region

Para trabalhar com a enumeração de animais, vamos criar o código abaixo:


#Region "Animais"

    ''' <summary>
    ''' Método que carrega os animais, em uma combo
    ''' </summary>
    Private Sub carregarAnimais()
        Dim sAnimaisNomes As String() = System.[Enum].GetNames(GetType(enumeracoes.Animais))
        Dim enumAnimal As New enumeracoes.Animais

        For Each sAnimais As String In sAnimaisNomes
            ' Para cara ítem na minha enumeração, eu adiciono na combo
            enumAnimal = System.Enum.Parse(GetType(enumeracoes.Animais), sAnimais)

            ddlAnimais.Items.Add(New ListItem(sAnimais, enumAnimal))
        Next
        ' adiciono um ítem de selecionar na combo.
        ddlAnimais.Items.Insert(0, New ListItem("<--Selecione-->", "NaoSelecionado"))
    End Sub

    ''' <summary>
    ''' evento que tratya a mudança de valor da dropdown
    ''' </summary>
    Protected Sub ddlAnimais_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlAnimais.SelectedIndexChanged
        Dim sSQL As String = String.Empty
        Dim enumAnimal As New enumeracoes.Animais

        If String.Compare(ddlAnimais.SelectedValue, "NaoSelecionado") = 0 Then
            lblSQLAnimais.Text = "Selecione um animal"
        Else
            ' Dou um parse no valor da combo (dropdown), se selecionada, para poder exibir o valor
            enumAnimal = System.Enum.Parse(GetType(enumeracoes.Permissao), ddlAnimais.SelectedValue)

            sSQL = "insert into tblanimais " & _
                    "(Tipo,Idade,Nome) values " & _
                    "('" & enumAnimal.ToString & "','14','Rufos')"

            lblSQLAnimais.Text = "Sua SQL que você deve usar para salvar " & _
                                 " no mySQL é: <br />"" <i>" & sSQL & "</i> """
        End If
    End Sub

#End Region

Agora só precisamos chamar os métodos no page load


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        If Not Page.IsPostBack Then
            ' Chamo os métodos de carregar, se não for postback
            carregarPermissao()
            carregarAnimais()
        End If

    End Sub

Conclusão

Neste artigo aprendemos a como trabalhar com enumeração, tanto em .Net quanto em MySQL. Vimos como ela pode nos auxiliar nos projetos do dia a dia. Além de ajudar a melhorar a performance, a enumeração nos ajuda a ter um código mais legível, de fácil manutenção e expansão.

Clique aqui para dar download no projeto de exemplo.

Forte Abraço!

3 comentários

 Átila Menezes dos Santos
12/03/2008 12h04

Parabéns!

Muito bom eu mesmo desconhecia e nunca utilizei Enumeração!

Parabens!!

 Thomas Alexander Semple
05/04/2008 14h52

Átila, enumeração realmente é bem interessante.

Se bem utilizada, pode poupar retrabalho, e deixar o código mais legível e robusto. Com o Visual Studio ainda, é gerado o "intelisense", que ajuda e muito o desenvolvimento.

Use a criatividade e boa sorte!

Forte Abraço!

Thomas A. Semple

 Max Oliveira
11/04/2009 17h16

Enumeração

Para que se preocupa com performance esta é uma ótima dica. Para quem não se preocupa é melhor começar!

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Thomas Alexander Semple é engenheiro eletrônico com ênfase em telecomunicações. Residiu por mais de dois anos nos Estados Unidos e é líder de projetos da T4W. Com mais de 12 anos de experiência, participa de projetos para empresas dos mais diversos segmentos. A T4W (www.t4w.com.br) é uma empresa de tecnologia, que além de produtos voltados aos mercados de turismo e imobiliário, possui uma área de desenvolvimento que vem atendendo empresas de médio e grande porte em projetos corporativos e especiais. Thomas A. Semple também escreve periodicamente para as revistas .Net Magazine e Web Mobile.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.