¿Diferencia entre abstracción y encapsulación?

Resuelto Rocky asked hace 15 años • 0 respuestas

¿Cuál es la diferencia precisa entre encapsulación y abstracción?

Rocky avatar Apr 13 '09 03:04 Rocky
Aceptado

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í, distancese 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 esqsortla función de C para ordenar datos:

    El problema qsortes 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 de qsortsiempre 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. qsortpor 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};
Konrad Rudolph avatar Apr 13 '2009 12:04 Konrad Rudolph

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 fooclase está oculta fuera de esta clase. --> Encapsulación .
Cualquier miembro accesible (datos/función) de un objeto fooestá 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 addestá oculta. --> Abstracción .

haccks avatar Mar 24 '2015 04:03 haccks

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.

dirkgently avatar Apr 12 '2009 20:04 dirkgently

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.
Steven A. Lowe avatar Apr 12 '2009 22:04 Steven A. Lowe