Desenvolvimento - ASP. NET

.NET 2.0 - Introdução ao Generics (Whidbey)

Entre muitas novidades do .NET Framework 2.0 abordaremos nesse artigo o suporte a programação genérica (Generics). Esse artigo tem o propósito de apresentar esse novo modelo de programação que pode se aplicar nos diversos modelos de projetos disponíveis.

por Ramon Durães



Artigo recomendado para Visual Studio Beta 2

Entre muitas novidades do .NET Framework 2.0 abordaremos nesse artigo o suporte a programação genérica (Generics). Esse artigo tem o propósito de apresentar esse novo modelo de programação que pode se aplicar nos diversos modelos de projetos disponíveis.

Conforme o próprio nome esse novo modelo de programação permite diversos ganhos para o desenvolvedor. Dentre eles podemos citar a diminuição da quantidade de código escrito pois não será mais necessário escrever diversos métodos iguais com parâmetros diferentes (sobrecarga), maior ganho em desempenho evitando uso de Boxing & Unboxing (conversões implícitas de tipos primitivo p/Objeto / vice-versa, lembrando que no mundo OOP tudo é objeto.), ganhos consideráveis em produtividade e reutilização, o modelo de programação genérica veio para potencializar suas classes.

O modelo Generics se assemelha ao templates do C++ com os diferenciais de produtividade da plataforma .NET

Podendo ser aplicado:

- Class
- Interfaces
- Methods
- Delegates
- Contraints

Confira na Listagem 01 o modelo tradicional utilizado atualmente baseado em sobrecargas para ter a possibilidade de receber diversos tipos diferentes como parâmetro.

Public Class Modelo_Atual

Function addItems(ByVal arritens() As String) As String
Return "Adicionado"
End
Function

Function addItems(ByVal arritens() As Int32) As String
Return "Array Inteiro"

End Function

End Class


Listagem 01 - Modelo de class atual

Observando o modelo da Listagem 01 confira que existem dois métodos addItems um pedindo um array do tipo String e outro pedindo um array para o tipo Int32. Agora vamos ao modelo da Listagem 02 onde a mesma class está escrita no novo padrão Generics.

Public Class Modelo_Generics(Of itemType)

   Function addItems(ByVal arritens() As itemType) As String                 
       Return "Array " + arritens.GetType.ToString
   End Function

End Class
Listagem 02 - Modelo de class Generics

Conferindo agora a Listagem 02 você deve observar que no lugar de ter dois métodos agora temos apenas um e o tipo do parâmetro agora é um tipo genérico "itemType", permitindo dessa forma receber os mais diversos parâmetros reduzindo a necessidade de se ter vários métodos.

Para verificar como se utiliza esse tipo de class confira o exemplo na Listagem 03.

Protected Sub btGenerics_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btGenerics.Click

Dim
arrCodigos() As Int32 = {2, 4, 1}
Dim ModeloCodigos As New Modelo_Generics(Of Int32)

Dim ModeloNomes As New Modelo_Generics(Of String)
ModeloNomes.addItems(arrNomes)

End Sub


Listagem 03 - Utilizando class Generics

Conforme exemplo da Listagem 03 criamos o objeto ModeloCodigos que vai receber parâmetro do tipo In32 conforme essa chamada da Class Modelo_Generics(Of Int32).

Até esse ponto você já pode concluir que com Generics você evitou de ter vários métodos apenas pra receber parâmetros de tipos diferentes.

Para melhor facilitar sua compreensão estarei apresentando no próximo exemplo uma nova class, dessa vez será um carrinho de compras que recebera "objetos" como itens e serão passados pelo método. Avaliando em uma situação anterior ao modelo Generics você precisaria construir um método para objeto que fosse passado como parâmetro. Descrito essa situação dessa Class imaginaria do carrinho de compras de objetos confira mais um exemplo na Listagem 04.

Namespace Compras

        Public Enum Frutas
            Melancia = 0
            Manga = 1
            Banana = 2
        End Enum

        Public Enum Verduras
            Cenoura = 0
            Batata = 1
            Abobora = 2
        End Enum

       

    Public Class Carrinho(Of itemType)

        Private CestadeItens() As itemType
        Private intIndiceItens As Integer

            Public Sub New(ByVal intQuantidade As Integer)                
            ReDim CestadeItens(intQuantidade - 1)                
            intIndiceItens = 0
            End Sub

            Public Sub Adiciona_Itens(ByVal item As itemType)             
            If intIndiceItens> UBound(CestadeItens)Then
                    Throw New Exception("Não é possivel adicionar mais itens")
            End If

                CestadeItens(intIndiceItens) = item                
                intIndiceItens += 1

           End Sub

             Public Function Retorna_Lista_Itens() As String

                Dim i As Int32
                Dim strItens As String = ""
                For i = 0 To CestadeItens.Length - 1
                    If i> 0 Then
                        strItens += ","
                    End If

                    strItens += CestadeItens(i).ToString
                Next

                Return strItens
            End Function
        End Class
    End Namespace

Listagem 04 - Carrinho de compras de objetos

Analisando a Listagem 04 identificamos o método principal que é o Adiciona_Itens o mesmo recebe os nossos "objetos" virtuais que serão adicionados ao carrinho. Agora confira na Listagem 05 o código necessário para utilização dessa class.

Protected Sub btCarrinhoCompras_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btCarrinhoCompras.Click

Dim ComprasFrutas As New Compras.Carrinho(Of Compras.Frutas)(2)

ComprasFrutas.Adiciona_Itens(Compras.Frutas.Banana) ComprasFrutas.Adiciona_Itens(Compras.Frutas.Manga) Response.Write(ComprasFrutas.Retorna_Lista_Itens)

End
Sub


Listagem 05 - Utilizando class carrinho de compras

Referências

- http://msdn.microsoft.com

Finalizando

O modelo de programação genérica (Generics) funcionara como uma reengenharia na forma como as classes atuais são escritas. Conforme visto podemos comprovar uma redução brutal de código.

O que você gostaria saber?
Aguardo seu comentário! Ele é muito importante. Participe!!! Até próximo artigo!

Ramon Durães

Ramon Durães - Especialista em desenvolvimento de software e Microsoft Most Valuable Professional (MVP) em Visual Studio Team System. Realiza treinamentos de .NET Framework em empresas, consultoria em arquitetura de software e implantação de Visual Studio Team System. Palestrante nos principais eventos da Microsoft no Brasil (Tech-Ed 2005, Tech-Ed 2006, Tech-Ed 2007, Tech-Ed 2008, Tech-ED 2009), Microsoft Innovation Days 2007 (Salvador, Brasília, Recife, Goiânia, Natal, Maringá), Microsoft Innovation Days 2009 (Salvador) , Campus Party Brasil 2009 e eventos regionais relacionados a grupos de usuários e universidades. Conhecido autor de artigos para os principais portais de conteúdo e autor de 10 publicações eletrônicas em CD (Video-Aula) pela editora Linha de Código além dos livros "Desenvolvendo para web usando o Visual Studio 2008" e "Gerenciando projetos de software usando Visual Studio Team System" pela editora Brasport. Pode ser encontrado em seu blog http://www.ramonduraes.net e @ramonduraes no Twitter.