¿Diferencia entre abstracción y encapsulación?
¿Cuál es la diferencia precisa entre encapsulación y abstracción?
La mayoría de las respuestas aquí se centran en la programación orientada a objetos, pero la encapsulación comienza mucho antes:
Cada función es una encapsulación ; en pseudocódigo:
point x = { 1, 4 } point y = { 23, 42 } numeric d = distance(x, y)
Aquí,
distance
se resume el cálculo de la distancia (euclidiana) entre dos puntos en un plano: se ocultan los detalles de implementación. Esto es encapsulación, pura y simple.La abstracción es el proceso de generalización : tomar una implementación concreta y hacerla aplicable a tipos de datos diferentes, aunque algo relacionados. El ejemplo clásico de abstracción es
qsort
la función de C para ordenar datos:El problema
qsort
es que no le importan los datos que clasifica; de hecho, no sabe qué datos clasifica. Más bien, su tipo de entrada es un puntero sin tipo (void*
), que es simplemente la forma en que C dice "No me importa el tipo de datos" (esto también se llama borrado de tipo). El punto importante es que la implementación deqsort
siempre permanece igual, independientemente del tipo de datos. Lo único que tiene que cambiar es la función de comparación, que difiere de un tipo de datos a otro.qsort
por lo tanto, espera que el usuario proporcione dicha función de comparación como argumento de función.
La encapsulación y la abstracción van de la mano hasta el punto de que se podría señalar que son verdaderamente inseparables. A efectos prácticos, esto probablemente sea cierto; Dicho esto, aquí hay una encapsulación que no es una gran abstracción:
class point {
numeric x
numeric y
}
Encapsulamos las coordenadas del punto, pero no las abstraemos materialmente, más allá de agruparlas lógicamente.
Y aquí hay un ejemplo de abstracción que no es encapsulación:
T pi<T> = 3.1415926535
Esta es una variable genérica pi
con un valor dado (π), y a la declaración no le importa el tipo exacto de la variable. Es cierto que sería difícil encontrar algo como esto en código real: la abstracción prácticamente siempre usa encapsulación. Sin embargo, lo anterior realmente existe en C++(14), a través de plantillas de variables (= plantillas genéricas para variables); con una sintaxis un poco más compleja, por ejemplo:
template <typename T> constexpr T pi = T{3.1415926535};
Muchas respuestas y sus ejemplos son engañosos.
La encapsulación es empaquetar "datos" y "funciones que operan sobre esos datos" en un solo componente y restringir el acceso a algunos de los componentes del objeto.
Encapsulación significa que la representación interna de un objeto generalmente está oculta a la vista fuera de la definición del objeto.
La abstracción es un mecanismo que representa las características esenciales sin incluir detalles de implementación.
Encapsulación: - Ocultación de información .
Abstracción: - Ocultación de implementación .
Ejemplo (en C++):
class foo{
private:
int a, b;
public:
foo(int x=0, int y=0): a(x), b(y) {}
int add(){
return a+b;
}
}
La representación interna de cualquier objeto de foo
clase está oculta fuera de esta clase. --> Encapsulación .
Cualquier miembro accesible (datos/función) de un objeto foo
está restringido y solo puede acceder a él ese objeto.
foo foo_obj(3, 4);
int sum = foo_obj.add();
La implementación del método add
está oculta. --> Abstracción .
La encapsulación oculta los detalles de implementación que pueden ser o no para comportamientos genéricos o especializados.
La abstracción proporciona una generalización (digamos, sobre un conjunto de comportamientos).
Aquí hay una buena lectura: Abstracción, encapsulación y ocultación de información por Edward V. Berard de Object Agency.
la encapsulación pone algunas cosas en una caja y te da una mirilla; Esto evita que juegues con los engranajes.
la abstracción ignora por completo los detalles que no importan, como si las cosas tienen engranajes, trinquetes, volantes o núcleos nucleares; ellos simplemente "van"
ejemplos de encapsulación:
- calzoncillos
- caja de herramientas
- billetera
- bolso
- cápsula
- carbonita congelada
- una caja, con o sin botón
- un burrito (técnicamente, la tortilla alrededor del burrito)
ejemplos de abstracción:
- "grupos de cosas" es una abstracción (a la que llamamos agregación)
- "cosas que contienen otras cosas" es una abstracción (a la que llamamos composición)
- "contenedor" es otro tipo de abstracción de "cosas que contienen otras cosas"; tenga en cuenta que todos los ejemplos de encapsulación son tipos de contenedores, pero no todos los contenedores exhiben/proporcionan encapsulación. Una cesta, por ejemplo, es un contenedor que no encapsula su contenido.