Entenda o que é tipo abstrato de dados

Entenda o que é tipo abstrato de dados

Ao estudar estrutura de dados e programação você vai se deparar com esse termo: tipo abstrato de dados. Essa é uma das primeiras barreiras que você enfrenta nessa disciplina, a terminologia. Apesar de parecer algo complexo, um tipo abstrato de dados é uma forma de pensar em estruturas do mundo real e abstrair em código.

Mas antes de qualquer coisa vamos entender um pouco melhor sobre alguns termos muito usados e que as vezes ficam perdidos no nosso vocabulário:

  • Algoritmo – um algoritmo deve ser visto como uma sequência de passos ou ações expressas em termos de uma linguagem de programação, constituindo parte da solução de um tipo determinado de problema. Sendo assim, um algoritmo pode ser visto também como uma descrição do padrão de comportamento. Ou seja, essas ações descritas são expressas por meio de um conjunto finito de ações especificadas usando uma linguagem de programação.  
  • Estrutura de dados – uma estruturas de dados é uma coleção tanto de valores (e seus relacionamentos) quanto de operações (sobre os valores e estruturas decorrentes). As estruturas de dados não são apenas algoritmos, os algoritmos são apenas uma parte da solução do problema. Ou seja, uma estrutura de dados é composta por valores e algoritmos, sendo que ambos compõem um programa a ser executado pelo computador.
  • Programa – nesse contexto, quando falamos em programa, estamos nos referindo a uma formulação concreta, em termos de uma linguagem de programação, de um procedimento abstrato que atua sobre um modelo de dados também abstrato.
  • Tipos de dados  – em uma linguagem de programação é importante classificar constantes, variáveis e valores gerados por expressões/funções de acordo com o seu tipo de dados. Um tipo de dado deve caracterizar o conjunto de valores a que uma constante pertence ou o conjunto de valores que pode ser assumido por uma variável ou gerado por uma expressão/função. Nesse contexto temos os tipos de dados simples que tem a característica de ser um conjunto de valores de valores indivisíveis, como por exemplo os tipos numeral, texto (não tem como você dividir os números inteiros em duas partes – inteiro é inteiro e ponto final).   

Esses conceitos foram adaptados do material do professor Bruno Maffeo.

Agora que já conhecemos o que são tipos de dados e vários termos relacionados a esse contexto, podemos começar a entender melhor o tipo abstrato de dados.    

O que é um tipo abstrato de dados?

Um tipo abstrato de dados (TAD) pode ser visto como um modelo matemático que encapsula um modelo de dados e um conjunto de procedimentos que atuam com exclusividade sobre os dados encapsulados. Para simplificar um pouco as coisas, podemos dizer que um tipo de dados abstrato implementa funções ou procedimentos por meio de subprogramas denominados operações, métodos ou serviços.  

Qualquer processamento que é realizado só atua sobre os dados encapsulados em um TAD, e ele também só poderá ser executado por intermédio dos procedimentos definidos no modelo matemático do TAD. Essa restrição é uma das características mais úteis dessas estruturas de dados.  

Um programa baseado em TAD deverá conter algoritmos que implementem, em termos da linguagem de programação adotada, os procedimentos e os modelos de dados dos TADs utilizados pelo programa.  

Vamos pegar por exemplo as Strings em Java, Python, C++ etc. Esses objetos complexos são bem definidos e podem ser instanciados e manipulados por meio dos métodos associados. Por exemplo, em Java:

String nome = "vinicius";

Para manipular essa string podemos invocar alguns métodos, por exemplo para tornar tudo maiúsculo:

nome = nome.toUpperCase();

Perceba que estamos realizando uma ação que não teve nenhuma influência externa. Não acessamos em nenhum momento o código da classe String. Essa é uma característica importante dos tipos de dados abstratos, eles são tão coesos que você pode manipulá-los simplesmente usando os métodos disponíveis.

Em geral existe uma coleção de atividades, tais como inserir, suprimir e consultar, encapsulada junto com uma estrutura passiva, como um dicionário (conjunto de verbetes), que pode ser considerada um tipo abstrato de dados (TAD). 

Por que usamos TADs

Uma razão importante para programar usando TAD é o fato de que os elementos da estrutura passiva do TAD são acessíveis somente através dos elementos da estrutura ativa (métodos). Sendo assim, essa restrição conduz a uma forma eficiente de programação defensiva, protegendo os dados que foram encapsulados pelo programador no TAD e isso reduz consideravelmente o risco de haver manipulações inesperadas por parte de outros algoritmos.   

Uma outra razão para usarmos TADs é o fato de que seu uso permite introduzir alterações nas estruturas definidas no nível de implementação visando, por exemplo, aumento de eficiência livre da preocupação de gerar erros no restante do programa.

Por exemplo, imagine que você implementou um tipo de dados abstrato que cuida do saldo dos seus clientes no banco. Nessa TAD você especifica toda e qualquer operação que é permitida e tudo que não pode ser feito. Quando você constrói um software baseado nessa TAD você tem a certeza que todas aquelas regras são seguidas à risca. No entanto, essa TAD é editável, sendo assim, se você resolver otimizar um processo dentro dessa TAD, as alterações não afetarão o programa original.

Isso só é possível quando a TAD possui uma única conexão com o restante do programa que é constituída. Ou seja, aquela interface é imutável. Assim, pode-se dizer que um TAD bem construído pode tornar-se uma porção de código confiável e genérica, permitindo e aconselhando seu reuso em outros programas. Dessa forma, aumenta-se a produtividade na construção de programas e, sobretudo, garante-se a qualidade dos produtos gerados.

Alguns exemplos de TADs

  • Pilhas – estrutura onde empilhamos dados como se fossem caixas. Colocamos um dado sobre o outro e quando queremos retirar um dado é preciso desempilhá-los.
  • Filas – as filas podem armazenar dados, porém a forma de inserir ou remover dados podem ser feitas em qualquer uma das pontas.
  • Árvores – estruturas que armazenam os dados e relacionam cada dado com dois ou mais dados.
  • Listas – muito semelhante as filas porém com alterações também na forma de entrada, saída e alteração dos dados.
  • Mapas/dicionários – essas estruturas são muito comuns e relacionam chave com um valor, por exemplo: {Idade: 10, profissão: estudante}.

Por que aprendemos TADs em computação?

Esse conceito é tão genérico que ele é capaz de ser implementado em qualquer linguagem de programação (mesmo que algumas delas apresentem algumas restrições). Geralmente os modelos mais comuns como pilhas, filas, listas são pré-implementados no pacote básico da linguagem e você não precisa se preocupar com eles. No entanto, você precisa entender o que são as TADs, visto que elas são a base do encapsulamento. Assim, planejando bem sua implementação e criando tipos de dados abstratos e confiáveis, você poderá reutilizá-los em vários projetos.

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e forma com que ela pode transformar vidas!

Deixe uma resposta