Esse artigo faz parte da revista .NET Magazine edição 63. Clique aqui para ler todos os artigos desta edição

Clique aqui para ler essa revista em PDF.imagem_pdf.jpg

Projetando com Generics

 

Quando falamos de Generics, estamos frisando um comportamento como seu próprio nome já diz, genérico. Com isso, a criação de novos projetos fica facilitada, podendo fazer uso de um modelo base, que permite o reuso de funcionalidades independentes dos tipos dos objetos tratados no momento. Falando mais abertamente, imagine uma função que lhe retorne o resultado de uma simples consulta de forma “tipada", ou seja, retorna uma listagem de objetos do tipo “Usuário”, com todas as propriedades que nada mais são que um espelho dos campos da tabela de Usuários, nome, login, e-mail etc. Se surgisse a necessidade de criar uma nova consulta, dessa vez de Veículos, sem Generics, pouco poderia se aproveitar do código criado anteriormente, afinal, o tipo retornado força a entidade espelho da primeira tabela consultada, que é de Usuários, não servindo para segunda tabela criada de Veículos, que logicamente possui campos específicos como marca do veículo, placa, modelo, ano etc., que são totalmente diferentes da tabela de Usuários. Aplicando Generics, isso deixa de ser um problema, e passa ser uma ótima solução, pois não existe menor problema em criar uma função que retorne uma listagem de “Usuários” ou “Veículos”, e ainda retorná-las com seus verdadeiros tipos, não havendo a necessidade da conversão para objetos de Array, ArrayList, entre outras collections, saídas que já foram interessantes principalmente no framework 1.1, utilizadas para tentar se padronizar um retorno. Mas fazendo dessa outra forma sem Generics, além de não termos tipos de objetos espelhos de uma entidade criada, obviamente acaba se perdendo o conforto do “IntelliSense”, o que acaba obrigando quem faz uso do objeto, saber qual o tipo para forçar o Cast.

 

Nota

Repare que Generics vai bem além do famoso “overload”, que é ter a mesma função replicada dentro da mesma classe, podendo esperar quantidades e tipos diferentes de parâmetros e também retornar tipos específicos. A grande diferença, é que com Generics, não é preciso replicar métodos, garantindo assim que o tratamento seja exatamente o mesmo, independente se o objeto esperado e retornado é do tipo “X” ou “Y”. Mas não devemos interpretar Generics como uma extensão do “overload”, afinal, nada impede de criarmos uma função genérica com a quantidade de parâmetros diferentes, para isso, teria que trabalhar com os dois recursos, criando um “overload” da sua função genérica.

 

Perceba que trabalhando dessa forma fica muito mais fácil aplicarmos Orientação a Objetos, todo retorno terá um tipo, será um objeto, e poderá ser reaproveitado a qualquer momento, não engessando o retorno para um tipo específico.

Para visualizarmos na prática onde podemos aplicar Generics como base para trafegarem dados dentro de uma aplicação, vamos construir uma página de exemplo, que embora contenha poucos controles e uma tela relativamente simples, poderá certamente servir como base estrutural para criação de projetos pequenos, médios ou até mesmo grande porte. Ao final da matéria, teremos o resultado mostrado conforme Figura 1.

 

Figura 1. Resultado da aplicação ao final da matéria

 

Criando a estrutura para consulta

Primeiramente vamos criar uma tabela de consulta, para então iniciar o projeto fazendo uso do Generics. Dentro do modo designer do seu SQL Server, crie uma tabela contendo três campos: UsuarioID do tipo int, Nome do tipo varchar(128) e DataDeAlteracao do tipo datetime, para facilitar visualize a estrutura apresentada na Figura 2.

 

Figura 2. Criando tabela para consulta

 

Nota: Para facilitar o cadastro, nas propriedades do campo UsuarioID, expanda a propriedade “Identity Specification” e habilite a opção “Is Identity” selecionando “Yes”, isso fará com que o SQL controle o ID do usuário incrementando 1 para todo registro novo gerado. Já dentro das propriedades do campo DataDeAlteracao, na propriedade “Default Value or Binding”, coloque o valor GetDate(), assim a Data/Hora será inserida automaticamente sempre que fizer uma nova inserção.

 

Criada a tabela, vamos salvá-la com o nome Usuário (Figura 3).

 

Figura 3. Definindo um nome e salvando a tabela

 

Agora aproveite para efetuar o cadastro de alguns registros de exemplo na tabela de “Usuários”, estes serão úteis para em breve testarmos a aplicação. Lembre-se que caso tenha habilitado o “Identity” para o campo UsuarioID e definido o valor “DefaultValue or Binding” do campo DataDeAlteracao para GetDate(), o único campo que precisará ser preenchido será o “Nome”, todos os outros ficarão por conta do SQL Server. A Figura 4 mostra alguns exemplos.

 

Figura 4. Cadastrando a tabela Usuários

 

Para finalizarmos toda a parte de banco de dados, fica faltando apenas a criação de uma Stored Procedure, que espere como parâmetro um texto com parte do nome, e retorne uma lista que contenha o texto passado. Para isso faremos um SELECT na tabela “Usuarios”, e no WHERE da consulta vamos utilizar o comando LIKE, que permitirá trazer tudo o que contenha o texto recebido como parâmetro (Listagem 1).

 

Listagem 1. Criando a procedure para consulta de usuários

CREATE PROCEDURE [dbo].[RetornaUsuarios](@Nome AS VARCHAR(128))

AS

 

SELECT

         UsuarioID,

         Nome,

         DataDeAlteracao

FROM

         Usuarios

WHERE

         Nome LIKE '%' + @Nome + '%'

 

Contruindo o Projeto Generics

Chegada a hora, vamos criar um novo projeto, com o Visual Studio aberto clique em File – New – Project. Surgirá uma janela mostrada na Figura 5. Dentre os itens apresentados, ao lado esquerdo da janela, selecione a opção “Visual C#” e então clique no item “ASP.NET WebApplication”. Coloque um nome de sua preferência para o projeto e confirme.

 

Figura 5. Criando um novo projeto do tipo WebApplication

 

Nota

Caso não encontre a opção Web Application dentro do item Visual C# , poderá utilizar a opção WebSite existente dentro do menu File – New –WebSite. A opção WebApplication só está presente dentro da versão do VisualStudio 2005 SP1 ou posterior. Esta opção é um pouco diferente, mas para nossa aplicação não fará diferença.

 

Pensando que o objetivo da matéria é deixar você leitor com uma estrutura pronta para uso em diversos futuros projetos, vamos adicionar a nossa solution mais um projeto, este será de classes, onde teremos toda a estrutura necessária para acesso e recuperação de dados contidos na base de dados. Clique no menu File – Add – New Project, nas opções listadas à esquerda selecione “Visual C#” e clique na opção “Class Library”. Diferente do projeto Web, o nome deste projeto fará toda diferença, pois a partir do nome especificado, os namespace das novas classes criadas tomarão base. Sendo assim para facilitar o acompanhamento da matéria, nomeie para “TrafegaDados” (Figura 6).

 

Figura 6. Adicionando um projeto de classes na solution

 

Agora que temos a estrutura criada, vamos iniciar programando o nosso projeto de classes, pois não adiantaria termos a tela montada e não ter o que acessar. Ao criar o novo projeto de classes, repare que junto a ele foi criada uma classe chamada de “Class1.cs”, renomeie para Dados e mãos à obra, abra o código e inicie referenciando System.Data, System.Data.SqlClient e claro o System.Collections.Generics. Veja na ...

Quer ler esse conteúdo completo? Tenha acesso completo