P>

capaNET38.JPG

Clique aqui para ler todos os artigos desta edição

.NET Framerwork

Coleções Genéricas de Objetos

 

O desenvolvimento de sistemas de computador é, sem dúvida, uma atividade complexa. A publicação de uma página Web básica envolve a utilização de diversas tecnologias e recursos que, muitas vezes, são transparentes para o usuário final e, até mesmo, para o próprio desenvolvedor, mas que são indispensáveis para a simples exibição do conteúdo desejado.

As ferramentas e metodologias de desenvolvimento têm evoluído rapidamente, tornando o trabalho do desenvolvedor muito mais produtivo. O .NET Framework e o Visual Studio são dois ótimos exemplos de tecnologias e ferramentas com que podemos obter os melhores resultados com o menor esforço possível, focando nossa energia no trabalho criativo.

Por outro lado, a cada dia surgem novas tecnologias e a todo o momento nos deparamos com a necessidade de decidir qual é a melhor forma de resolver determinado problema: “Nesse caso, será que seria melhor usar XML, SQL ou um Web Service?” Essa é apenas uma das muitas perguntas que ouvimos ou fazemos constantemente. O sucesso de uma aplicação está intimamente ligado às soluções adotadas. O segredo é analisar o problema com cuidado e optar pela solução que melhor se adapta, sem deixar levar pelas novidades e pelos modismos do mercado.

Neste artigo discutiremos uma das grandes novidades do .NET Framework 2.0, as coleções genéricas, que permite utilizar estruturas de dados fortemente tipadas, de forma simples e eficaz, melhorando a performance da aplicação em até cinco vezes e aumentando a produtividade do processo de desenvolvimento. Aproveitaremos para discutir mais algumas novidades interessantes e a adoção de algumas boas práticas, como por exemplo, a arquitetura em camadas.

Para uma melhor exemplificação dos temas discutidos no artigo, construiremos uma pequena aplicação, comum a muitos sites de intranet, para a exibição da uma relação de aniversariantes. A aplicação estará estruturada em camadas, separando as camadas de apresentação, negócios e dados. Construiremos uma classe, representando a camada de negócios da aplicação, que suportará as operações necessárias para a montagem de uma coleção de objetos do tipo Aniversariante.

Criaremos também uma página para a exibição da relação de aniversariantes, representando a camada de apresentação da aplicação. A classe de dados será representada por um arquivo XML onde está contida a relação de aniversariantes.

A arquitetura em camadas, além de ser uma boa prática, é uma companheira inseparável das coleções de objetos, uma vez que precisaremos um método para construir a coleção desejada e que atuará como fonte de dados (Data Source) da camada de apresentação.

O que é coleção?

Muitos de nós, quando criança, teve o hábito de colecionar coisas, como: bolas de gude, figurinhas, tampas de refrigerante, bonecos, carrinhos e gibis. Às vezes, esse hábito nos acompanha na idade adulta e aumentamos a coleção de carrinhos ou mudamos os nossos objetos de desejo para latas de cerveja de países exóticos, rolhas de garrafas de vinho, carros antigos, livros, discos de vinil etc.

Portanto, uma coleção é um conjunto ou reunião de objetos de um mesmo tipo. Os objetos de uma coleção, apesar de serem do mesmo tipo, são únicos e exclusivos àquela coleção. No mundo dos bits e bytes uma coleção é um conjunto de instâncias de objetos do mesmo tipo, como por exemplo, uma relação de clientes, amigos ou aniversariantes.

Quando montamos uma tabela em um banco de dados relacional estamos criando uma coleção, onde cada registro (tupla) da tabela é um objeto e cada coluna (campo) do registro é uma propriedade do objeto. Em uma aplicação, quando criamos uma nova instância de uma classe de dados e atribuímos dados às propriedades da instância, estamos criando e populando um objeto. Esse objeto pode então ser inserido em uma estrutura de dados (uma lista, por exemplo) formando então uma coleção de objetos, com uma ocorrência para cada objeto membro da coleção.

Esse tipo de operação sempre pôde ser realizado no .NET Framework, desde a versão 1.0, utilizando-se o ArrayList diretamente, como gerenciador da lista ou declarando uma outra classe para atuar como coleção, que herda de ArrayList e tem o método de empilhamento (Add) sobrescrito.

Essa técnica apresenta dois problemas principais:

1.      Qualquer elemento armazenado em um ArrayList é sempre do tipo Object. Dessa forma, o Intellisense do ambiente de desenvolvimento, não pode manipular diretamente as propriedades e métodos da classe, sem que antes façamos uma conversão de tipo. Com isso, temos perdas de produtividade no processo de desenvolvimento;

2.      Na inclusão de um elemento em um ArrayList, o elemento é convertido para o tipo Object. Esse processo é conhecido como boxing. A recuperação do elemento no ArrayList resultará em um processo inverso, o unboxing. A necessidade de fazer o boxing e o unboxing dos elementos do ArrayList resulta em perda de performance no processamento.

No .NET Framework 2.0 esse procedimento foi sensivelmente simplificado e otimizado através das coleções genéricas, tema de estudo deste artigo.

Criando a aplicação de exemplo

Neste artigo utilizaremos o Visual Studio 2005 para construir uma aplicação Web com o Visual Basic. No entanto, devemos salientar que tudo o que será discutido aqui poderá ser feito também com o Visual Web Developer 2005 Express Edition e com C# ou qualquer outra linguagem, resguardando apenas as diferenças da linguagem.

Para iniciar a construção do exemplo, abra o Visual Studio 2005, crie um novo Web Site e adicione uma nova classe (menu Website>Add New Item), que chamaremos de “Aniversarios.vb”. Essa classe representará a camada de negócios da aplicação e conterá a declaração de uma classe de negócio e os respectivos métodos de controle.

A classe de negócio é a estrutura básica onde armazenaremos os dados de cada aniversariante e que será adicionado a uma lista (coleção). A Listagem 1 apresenta a declaração da classe pública Aniversariante, com as propriedades públicas que comporão a estrutura fortemente tipada do objeto.

Observe que, neste exemplo, estamos utilizando classes aninhadas, isso é, uma classe definida dentro da outra classe. Uma técnica interessante que, entre outras vantagens, possibilita uma melhor organização dos componentes da aplicação.

 

Listagem 1. Classe Aniversariante

Public Class Aniversarios

 

    Public Class Aniversariante

        Private strNome As String

        Private numDiaAniversario As Byte

        Private strEMail As String

 

        Public Property Nome() As String

            Get

                Return strNome

            End Get

            Set(ByVal value As String)

                strNome = value

            End Set

        End Property

 

        Public Property DiaAniversario() As Byte

            Get

                Return numDiaAniversario

            End Get

            Set(ByVal value As Byte)

                numDiaAniversario = value

            End Set

        End Property

 

        Public Property EMail() As String

            Get

                Return strEMail

            End Get

            Set(ByVal value As String)

                strEMail = value

            End Set

        End Property

    End Class

End Class

 

Uma vez definida a classe de negócio, devemos então escrever o método responsável pela montagem da coleção de objetos, foco de nosso estudo. A Listagem 2 apresenta o AniversarianteMes, que recebe como parâmetro de entrada, o mês que desejamos montar a relação de aniversariantes. O método foi declarado dentro da classe Aniversarios, logo abaixo da Aniversariante, estando, dessa forma, no mesmo “nível” da classe mais interna.

 

Listagem 2. Método getAniversariantesMes

...

Quer ler esse conteúdo completo? Tenha acesso completo