Abstracción de datos en C ++
La abstracción de datos se refiere a proporcionar solo información esencial al mundo exterior y ocultar sus detalles de fondo, es decir, para representar la información necesaria en el programa sin presentar los detalles.
La abstracción de datos es una técnica de programación (y diseño) que se basa en la separación de interfaz e implementación.
Tomemos un ejemplo de la vida real de un televisor, que puede encender y apagar, cambiar el canal, ajustar el volumen y agregar componentes externos como parlantes, VCR y reproductores de DVD, PERO no conoce sus detalles internos, eso es decir, no sabes cómo recibe las señales por aire o por cable, cómo las traduce y finalmente las muestra en pantalla.
Por lo tanto, podemos decir que un televisor separa claramente su implementación interna de su interfaz externa y puede jugar con sus interfaces como el botón de encendido, el cambiador de canales y el control de volumen sin tener ningún conocimiento de sus componentes internos.
En C ++, las clases proporcionan un gran nivel de data abstraction. Proporcionan suficientes métodos públicos al mundo exterior para jugar con la funcionalidad del objeto y manipular los datos del objeto, es decir, declarar sin saber realmente cómo se ha implementado la clase internamente.
Por ejemplo, su programa puede realizar una llamada al sort()función sin saber qué algoritmo utiliza realmente la función para ordenar los valores dados. De hecho, la implementación subyacente de la funcionalidad de clasificación podría cambiar entre versiones de la biblioteca y, mientras la interfaz permanezca igual, la llamada a la función seguirá funcionando.
En C ++, usamos classespara definir nuestros propios tipos de datos abstractos (ADT). Puedes usar elcout objeto de clase ostream para transmitir datos a una salida estándar como esta:
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++" <<endl;
return 0;
}
Aquí, no necesitas entender cómo coutmuestra el texto en la pantalla del usuario. Solo necesita conocer la interfaz pública y la implementación subyacente de 'cout' es libre de cambiar.
Las etiquetas de acceso imponen la abstracción
En C ++, usamos etiquetas de acceso para definir la interfaz abstracta de la clase. Una clase puede contener cero o más etiquetas de acceso:
Los miembros definidos con una etiqueta pública son accesibles a todas las partes del programa. La vista de abstracción de datos de un tipo la definen sus miembros públicos.
Los miembros definidos con una etiqueta privada no son accesibles al código que usa la clase. Las secciones privadas ocultan la implementación del código que usa el tipo.
No existen restricciones sobre la frecuencia con la que puede aparecer una etiqueta de acceso. Cada etiqueta de acceso especifica el nivel de acceso de las siguientes definiciones de miembros. El nivel de acceso especificado permanece en efecto hasta que se encuentra la siguiente etiqueta de acceso o se ve la llave derecha de cierre del cuerpo de la clase.
Beneficios de la abstracción de datos
La abstracción de datos ofrece dos ventajas importantes:
Los componentes internos de la clase están protegidos contra errores inadvertidos a nivel de usuario, que podrían dañar el estado del objeto.
La implementación de la clase puede evolucionar con el tiempo en respuesta a los requisitos cambiantes o informes de errores sin necesidad de cambiar el código a nivel de usuario.
Al definir miembros de datos solo en la sección privada de la clase, el autor de la clase es libre de realizar cambios en los datos. Si la implementación cambia, solo es necesario examinar el código de la clase para ver qué efecto puede tener el cambio. Si los datos son públicos, es posible que se rompa cualquier función que acceda directamente a los miembros de datos de la representación anterior.
Ejemplo de abstracción de datos
Cualquier programa de C ++ en el que implemente una clase con miembros públicos y privados es un ejemplo de abstracción de datos. Considere el siguiente ejemplo:
#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;
}
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
Total 60
La clase anterior suma números y devuelve la suma. Los miembros públicos -addNum y getTotalson las interfaces con el mundo exterior y un usuario debe conocerlas para usar la clase. El miembro privadototal es algo que el usuario no necesita conocer, pero es necesario para que la clase funcione correctamente.
Estrategia de diseño
La abstracción separa el código en interfaz e implementación. Por lo tanto, mientras diseña su componente, debe mantener la interfaz independiente de la implementación para que, si cambia la implementación subyacente, la interfaz permanezca intacta.
En este caso, cualesquiera que sean los programas que utilicen estas interfaces, no se verán afectados y solo necesitarán una recompilación con la última implementación.