Com o avanço das linguagens de programação, a criação de
estruturas de dados genéricas foi possível, principalmente com a utilização do
paradigma de orientação a objetos. Essas estruturas de dados são essenciais em
projetos grandes ou pequenos, para generalizar o código sendo criado. Esse
artigo traz a utilização de Generics em C#, e como trabalhar com listas de
objetos que utilizem esse recurso.
Quando programamos com orientação a objetos, normalmente temos a necessidade de generalizar ao máximo nosso código. Isso é muito útil na criação de bibliotecas, por exemplo, mas também de classes e interfaces que serão estendidas ou implementadas posteriormente. Antigamente, nas primeiras versões do C#, para realizar tal tarefa existia uma complexidade muito grande.
Porém, a partir da versão 2.0 do .NET Framework, o conceito de Generics entrou com tudo no C# e no .NET. Isso fez com que os desenvolvedores tivessem uma melhor noção na hora de implementar listas genéricas, bem como generalizar ao máximo seus códigos.
Em poucas palavras, a programação em torno da chamada Generic Programming é um paradigma. Trata-se de um estilo de computação, principalmente voltado para a programação de bibliotecas, onde são utilizados tipos genéricos, que podem (e serão) especificados depois.
Essa programação é baseada em parâmetros, que são passados durante a criação das estruturas de dados genericamente, e transformados quando as estruturas são utilizadas no código.
Hoje em dia, praticamente todas as linguagens de programação possuem suporte a Generics. No caso do C++, eles eram chamados de templates, o que explica o que são os Generics, basicamente.
Trata-se de um template capaz de generalizar o código. O poder é tremendo, e permite que o desenvolvedor crie classes e interfaces que podem ser instanciadas posteriormente para qualquer tipo de dados. Pensando um pouco, o que poderia ser realizado é a utilização da classe Object como base para essa estrutura de dados.
Isso permitiria que, realizando um casting simples, pudéssemos utilizar a estrutura para qualquer tipo de dados, uma vez que todos eles herdam da classe Object. Porém, o conceito de Generics evita a necessidade de casting, o que traz uma eficiência muito maior.
Generics na prática
Os paradigmas de programação genéricos sempre tiveram espaço nos estudos de Ciência da Computação e Engenharia de Software. A generalização do código sempre foi um ponto muito importante no desenvolvimento de novas aplicações, linguagens e bibliotecas. Pensando nisso, Musser & Stepanov, em 1989, definiram o paradigma de programação que “criou” o conceito de Generics.
Esse conceito especifica uma decomposição formal de requerimentos em tipos abstratos, permitindo a formalização dos algoritmos em alguma etapa posterior do desenvolvimento.
O objetivo desse paradigma de programação é bastante simples: diminuir a complexidade computacional de um dado algoritmo. Como sabemos, a complexidade de um algoritmo geralmente é fator determinante na escolha da estrutura de dados que iremos utilizar.
Além disso, dependendo dessa estrutura, o algoritmo será mais ou menos confiável, rápido e seguro. Generics, em seu conceito inicial, conforme dito por um dos autores (Stepanov), tem como objetivo abstrair e classificar algoritmos e estruturas de dados.
Essa classificação fará com que o parâmetro genérico seja capaz de ser transformado em um tipo de dados real, para ser utilizado em aplicativos.
Na prática, embora o conceito só tenha sido colocado no papel, na forma de um artigo científico no final dos anos 1980, as linguagens de programação já se utilizam de alguns elementos de generalização desde a década de 1970. Linguagens como CLU e Ada (BOX 1) foram as precursoras do movimento, que posteriormente incluiu as principais linguagens orientadas a objetos. Hoje em dia, as linguagens mais utilizadas que contam com esse conceito são Java e C#.
A quantidade de linguagens de programação é absurda. Principalmente antigamente, com a falta de comunicação entre os centros de pesquisa, várias linguagens de programação surgiram, e Ada é uma delas.
Trata-se de uma linguagem estruturada de tipagem estática, que se originou a partir do Pascal, entre outras linguagens da época. Foi uma das primeiras linguagens a aparecer com elementos de Generics para utilização dos desenvolvedores, e por isso se tornou bastante utilizada na década de 1970.
Hoje em dia, ainda é utilizada, principalmente em sistemas que necessitam de confiabilidade, como softwares de aviação.
Generics é um conceito de linguagens de programação fortemente tipadas. Quando utilizamos PHP, por exemplo, não há a necessidade de tal conceito, uma vez que as variáveis não possuem tipos, e são, de certa forma, genéricas por natureza.
Algumas dessas linguagens procuram unificar a utilização de Generics para tipos primitivos de dados e tipos definidos pelo usuário. Essa é uma característica que veremos na sequência desse artigo, presente a partir do C# 2.0.
Normalmente, a utilização de Generics em linguagens orientadas a objetos se dá utilizando uma classe genérica, um parâmetro T. Essa letra vem do termo Template, e se trata de um parâmetro que irá segurar o lugar para um tipo de dados qualquer, o chamado placeholder.
Esse template permite que a classe seja utilizada ...