Recursos especiais neste artigo:
Artigo no estilo Mentoring.
A abstração é um dos conceitos mais importantes no desenvolvimento de softwares orientados a objetos, sendo que quanto mais abstrata uma solução, maiores as chances de reuso da mesma. Diversas práticas podem ser aplicadas para nos ajudar nesta tarefa, uma delas é o uso de Design Patterns. Os design patterns nos fornecem meios para solucionar problemas e desafios que nos deparamos diariamente no desenvolvimento de software. Um destes padrões é o DAO – Data Access Objects – que visa separar todo o código de acesso a dados do sistema em uma classe específica, isolando tais códigos do resto da aplicação, desta forma, se nosso projeto tem uma classe Cliente, então teríamos também a classe ClienteDAO, com todo o código necessário para realizar o acesso a dados de clientes no sistema.
Em que situação o tema é útil
O uso de Generics pode trazer grandes benefícios no
desenvolvimento de arquitetura e soluções reutilizáveis de software, permitindo
aumentar o reuso e consequentemente a produtividade da equipe de desenvolvimento,
sendo que o mesmo pode ser usado em qualquer camada server-side onde se tenha
alguma classe cujo comportamento independe do tipo com o qual se está
trabalhando, como por exemplo para o comportamento básico das DAOs.
O Generics é um recurso do .NET que nos fornece uma grande flexibilidade no desenvolvimento, permitindo criar classes altamente reutilizáveis com o uso de tipos genéricos, que são definidos apenas no momento de uso da classe. Apesar de sua existência não ser recente, muitas equipes ainda relutam em utilizá-lo, ou muitas vezes não conseguem extrair de todo o seu potencial.
Este artigo tem o intuito de desmistificar tal assunto permitindo ao leitor identificar as oportunidades de uso de Generics em seus projetos, sendo que para nosso estudo de caso veremos a aplicação do Generics em classes de acesso a dados.
Antes de demonstrar os benefícios do uso de Generics, vamos compreender o problema e como muitas equipes de desenvolvimento implementam suas camadas de acesso a dados.
É comum vermos camadas de acesso a dados sem nenhuma abstração, com uso direto de classes concretas. Muitas vezes estas classes até fazem uso de frameworks ORM, porém repetem todo o código de acesso a dados básico dos objetos do sistema, alterando apenas os tipos com o qual a classe trabalha. Na Listagem 1 e 2 temos um exemplo desta implementação, onde podemos ver duas classes de acesso a dados, sendo a primeira (Listagem 1) voltada para atuar com os dados de clientes e a segunda (Listagem 2) voltada para trabalhar com dados de fornecedores.
Listagem 1. Exemplo de implementação concretas de DAO para Cliente
01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05 using GenericsMentoring.Model;
06
07 namespace GenericsMentoring.DAO
08 {
09 public class ClienteDAO
10 {
11 public void Gravar(Cliente cliente) {
12 //inserção na base de dados
13 }
14 public void Excluir(Cliente cliente)
15 {
16 //deleção na base de dados
17 }
18 public void Editar(Cliente cliente)
19 {
20 //atualização na base de dados
21 }
22 public Cliente FindById(int Id)
23 {
24 return null;
25 //busca na base de dados
26 }
27 }
28 } ...