P>
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
2. Na inclusão de um elemento
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
...