Abstração de dados em C ++
A abstração de dados refere-se a fornecer apenas informações essenciais para o mundo exterior e ocultar seus detalhes de fundo, ou seja, representar as informações necessárias no programa sem apresentar os detalhes.
Abstração de dados é uma técnica de programação (e design) que depende da separação de interface e implementação.
Vamos dar um exemplo da vida real de uma TV, que você pode ligar e desligar, mudar o canal, ajustar o volume e adicionar componentes externos, como alto-falantes, videocassetes e DVD players, MAS você não sabe seus detalhes internos, que ou seja, você não sabe como ele recebe sinais pelo ar ou por cabo, como os traduz e, finalmente, os exibe na tela.
Assim, podemos dizer que uma televisão separa claramente sua implementação interna de sua interface externa e você pode brincar com suas interfaces como botão liga / desliga, trocador de canal e controle de volume sem ter nenhum conhecimento de seus componentes internos.
Em C ++, as classes fornecem um ótimo nível de data abstraction. Eles fornecem métodos públicos suficientes para o mundo externo brincar com a funcionalidade do objeto e manipular os dados do objeto, ou seja, afirmar sem realmente saber como a classe foi implementada internamente.
Por exemplo, seu programa pode fazer uma chamada para o sort()função sem saber qual algoritmo a função realmente usa para classificar os valores fornecidos. Na verdade, a implementação subjacente da funcionalidade de classificação pode mudar entre as versões da biblioteca e, desde que a interface permaneça a mesma, sua chamada de função ainda funcionará.
Em C ++, usamos classespara definir nossos próprios tipos de dados abstratos (ADT). Você pode usar ocout objeto de aula ostream para transmitir dados para a saída padrão como este -
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++" <<endl;
return 0;
}
Aqui, você não precisa entender como coutexibe o texto na tela do usuário. Você precisa saber apenas a interface pública e a implementação subjacente de 'cout' é livre para mudanças.
Os rótulos de acesso impõem abstração
Em C ++, usamos rótulos de acesso para definir a interface abstrata para a classe. Uma classe pode conter zero ou mais rótulos de acesso -
Os membros definidos com um rótulo público são acessíveis a todas as partes do programa. A visão de abstração de dados de um tipo é definida por seus membros públicos.
Os membros definidos com um rótulo privado não são acessíveis ao código que usa a classe. As seções privadas ocultam a implementação do código que usa o tipo.
Não há restrições sobre a frequência com que um rótulo de acesso pode aparecer. Cada rótulo de acesso especifica o nível de acesso das definições de membro subsequentes. O nível de acesso especificado permanece em vigor até que o próximo rótulo de acesso seja encontrado ou a chave direita de fechamento do corpo da classe seja vista.
Benefícios da abstração de dados
A abstração de dados oferece duas vantagens importantes -
As partes internas da classe são protegidas contra erros inadvertidos no nível do usuário, que podem corromper o estado do objeto.
A implementação da classe pode evoluir ao longo do tempo em resposta a requisitos de mudança ou relatórios de bug sem exigir mudança no código de nível de usuário.
Definindo membros de dados apenas na seção privada da classe, o autor da classe está livre para fazer alterações nos dados. Se a implementação muda, apenas o código da classe precisa ser examinado para ver o que pode afetar a mudança. Se os dados forem públicos, qualquer função que acesse diretamente os membros de dados da representação antiga pode ser quebrada.
Exemplo de abstração de dados
Qualquer programa C ++ onde você implementa uma classe com membros públicos e privados é um exemplo de abstração de dados. Considere o seguinte exemplo -
#include <iostream>
using namespace std;
class Adder {
public:
// constructor
Adder(int i = 0) {
total = i;
}
// interface to outside world
void addNum(int number) {
total += number;
}
// interface to outside world
int getTotal() {
return total;
};
private:
// hidden data from outside world
int total;
};
int main() {
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout << "Total " << a.getTotal() <<endl;
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Total 60
Acima da classe soma os números e retorna a soma. Os membros públicos -addNum e getTotalsão as interfaces para o mundo exterior e um usuário precisa conhecê-las para usar a classe. O membro privadototal é algo que o usuário não precisa saber, mas é necessário para que a classe funcione corretamente.
Estratégia de Projeto
A abstração separa o código em interface e implementação. Portanto, ao projetar seu componente, você deve manter a interface independente da implementação para que, se alterar a implementação subjacente, a interface permaneça intacta.
Nesse caso, quaisquer programas que estejam usando essas interfaces, eles não seriam afetados e precisariam apenas de uma recompilação com a implementação mais recente.