Diferencia entre encapsulación y abstracción

85

Hoy tuve una entrevista. Tenía una pregunta de OOP , ¿sobre la diferencia entre encapsulación y abstracción ?

Le respondí que sabía que la encapsulación consiste básicamente en unir miembros de datos y funciones de miembros en una sola unidad llamada Clase . Mientras que la abstracción es básicamente para ocultar la complejidad de la implementación y proporcionar facilidad de acceso a los usuarios. Pensé que estaría bien con mi respuesta. Pero ella preguntó, si el propósito de ambos es ocultar información, ¿cuál es la diferencia real entre estos dos? No pude darle ninguna respuesta.

Antes de hacer esta pregunta, leí otros hilos en StackOverFlow sobre la diferencia entre estos dos conceptos de POO . Pero no me encuentro en condiciones de convencer al entrevistador.

¿Alguien puede justificarlo con un ejemplo más simple?

WpfBee
fuente
13
y finalmente, ¿conseguiste el trabajo? :)
Adrian Księżarczyk
1
@WPFbee ¡Desafortunado!
Aimal Khan
3
No sé por qué la gente compara la abstracción y la encapsulación. ¿Por qué no podemos aceptarlos como dos conceptos OOP diferentes?
Mr ASquare
¿Posible duplicación de la diferencia entre abstracción y encapsulación?
Syed Souban
@WpfBee La abstracción no tiene nada que ver con esconderse, solo mira mi respuesta
S Vinesh

Respuestas:

71

Encapsular oculta variables o alguna implementación que se puede cambiar con tanta frecuencia en una clase para evitar que personas ajenas a ella accedan directamente. Deben acceder a él a través de métodos getter y setter.

La abstracción también está acostumbrada a ocultar algo, pero en un grado superior (clase, interfaz) . A los clientes que usan una clase abstracta (o interfaz) no les importa quién o cuál fue, solo necesitan saber qué puede hacer.

phnkha
fuente
6
Perfecto. Me parece que su respuesta solo apunta a la pregunta de mi entrevistador. Estoy tratando de repetir su respuesta con un ejemplo práctico. Por favor, avíseme si justifica su respuesta. Tomemos un ejemplo de televisión. La encapsulación son los circuitos internos, LEDS, etc. que se combinan para convertirlo en un televisor. La abstracción es el encendido-apagado, el sonido, la configuración del canal y otros botones proporcionados para operarlo.
WpfBee
La abstracción de los chicos no tiene nada que ver con ocultar la implementación ... la abstracción es un método para interactuar polimórficamente con una clase
Mortalus
1
@Mortalus - No estoy de acuerdo con su primera declaración "la abstracción no tiene nada que ver con ocultar la implementación". Creo que cuando comenzamos a aprender el concepto de abstracción, lo primero que nos enseñan es que ocultamos la complejidad de la implementación y proporcionamos alguna interfaz al usuario para que la use. Porque el usuario puede no estar interesado en la complejidad de la implementación. Puede tomar un ejemplo práctico de TV o AC. La otra cosa es que si no oculta la implementación, entonces proporcionamos un método en una clase abstracta que no tiene cuerpo. Claramente estamos ocultando la implementación aquí.
WpfBee
1
@Mortalus - Además, mencionaste un enlace wiki. Es la primera declaración: "En informática, la abstracción es el proceso mediante el cual los datos y los programas se definen con una representación similar en forma a su significado (semántica), mientras se ocultan los detalles de implementación. La abstracción intenta reducir y factorizar los detalles para que el programador puede concentrarse en algunos conceptos a la vez ". en sí mismo sugiere que la abstracción está destinada a ocultar la implementación. Estoy de acuerdo con su segunda declaración pero no con la primera.
WpfBee
1
Creo que la encapsulación se trata más de construir una sola unidad, no se trata de ocultarla o no. Mientras que la abstracción se trata más de ocultar cosas, corrija si me equivoco.
raj240
22

Esta imagen resume bastante bien la diferencia entre ambos:

ingrese la descripción de la imagen aquí

Fuente aquí

José Salgado
fuente
12

Abstracción: es el proceso (y el resultado de este proceso) de identificar las características esenciales comunes de un conjunto de objetos. Se podría decir que la abstracción es el proceso de generalización: todos los objetos en consideración están incluidos en un superconjunto de objetos, todos los cuales poseen propiedades dadas (pero son diferentes en otros aspectos).

Encapsulación: es el proceso de encerrar datos y funciones que manipulan estos datos en una sola unidad, para ocultar la implementación interna del mundo exterior.

Esta es una respuesta general no relacionada con un lenguaje de programación específico (como era la pregunta). Entonces la respuesta es: la abstracción y la encapsulación no tienen nada en común. Pero sus implementaciones pueden relacionarse entre sí (digamos, en Java: Encapsulación: los detalles están ocultos en una clase, Abstracción: los detalles no están presentes en absoluto en una clase o interfaz).

TT_
fuente
11

Encapsulación: empaquetar código y datos en una sola unidad. Classes un ejemplo de encapsulación, porque envuelve el método y la propiedad.

Abstracción: ocultar detalles internos y mostrar solo la funcionalidad. La abstracción se centra en lo que hace el objeto en lugar de en cómo lo hace. Proporciona una vista generalizada de las clases.

int number = 5;
string aStringNumber = number.ToString(); 

Aquí, ToString () es abstracción. Y cómo esta numbervariable de mecanismo se convierte en cadena y se inicializa en aStringNumberencapsulación.

Tomemos un ejemplo de calculadora del mundo real. La encapsulación son los circuitos internos, la batería, etc., que se combinan para convertirla en una calculadora. La abstracción son los diferentes botones como encendido-apagado, claro y otros botones proporcionados para operarlo.

Arif
fuente
7

Abstracción: generalmente se realiza para proporcionar acceso polimórfico a un conjunto de clases. No se puede instanciar una clase abstracta, por lo que otra clase tendrá que derivar de ella para crear una representación más concreta.

Un ejemplo de uso común de una clase abstracta puede ser una implementación de un patrón de diseño de método de plantilla donde se introduce un punto de inyección abstracto para que la clase concreta pueda implementarlo en su propia forma "concreta".

ver: http://en.wikipedia.org/wiki/Abstraction_(computer_science)

Encapsulación: Es el proceso de ocultar la complejidad de implementación de una clase específica al cliente que la va a usar, tenga en cuenta que el "cliente" puede ser un programa o evento la persona que escribió la clase.

ver: http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

Mortalus
fuente
1
¿La abstracción está relacionada con la clase abstracta?
vishnu viswanath
@vishnuviswanath, sí, podemos implementar la abstracción usando clases e interfaces abstractas.
invzbl3
3

Hay un gran artículo que aborda las diferencias entre la abstracción, la encapsulación y el ocultamiento de la información en profundidad: http://www.tonymarston.co.uk/php-mysql/abstraction.txt

Aquí está la conclusión del artículo:

La abstracción, la ocultación de información y la encapsulación son conceptos muy diferentes, pero muy relacionados. Se podría argumentar que la abstracción es una técnica que nos ayuda a identificar qué información específica debería ser visible y qué información debería estar oculta. La encapsulación es entonces la técnica para empaquetar la información de tal manera que se oculte lo que debería estar oculto y se haga visible lo que se pretende que sea visible.

Manish Kumar Sharma
fuente
2

La diferencia en ambos es solo que la palabra Encapsulación del punto de vista
se usa para ocultar datos si nuestro objetivo es evitar que el cliente vea la vista interior de nuestra lógica

La palabra de abstracción se usa para ocultar datos si nuestro objetivo es mostrarle a nuestro cliente una vista lateral

Vista exterior significa que supongamos

BubbleSort(){
//code 
swap(x,y);
}

aquí usamos swap en clasificación de burbujas solo para mostrarle a nuestro cliente qué lógica estamos aplicando, si reemplazamos swap (x, y) con el código completo aquí, en una sola instancia él / ella no puede entender nuestra lógica

Iqbal Haider
fuente
2

Sí, es cierto que la Abstracción y la Encapsulación se tratan de esconderse.

  • Usar solo detalles relevantes y ocultar datos innecesarios en el nivel de diseño se llama Abstracción . (Como seleccionar solo propiedades relevantes para una clase 'Coche' para hacerla más abstracta o general).

  • La encapsulación es el ocultamiento de datos en el nivel de implementación . Por ejemplo, cómo ocultar datos del acceso directo / externo. Esto se hace vinculando datos y métodos a una sola entidad / unidad para evitar el acceso externo. Por lo tanto, la encapsulación también se conoce como ocultación de datos a nivel de implementación.

CodeFu
fuente
3
¿Puede explicar en qué se diferencia esta respuesta de las otras 12 respuestas existentes?
Stephen Rauch
2

Encapsulamiento:

Esconder algo, una especie de cápsula de medicina. No sabemos qué hay en la cápsula, simplemente lo tomamos. Igual que en la programación: solo ocultamos un código especial de método o propiedad y solo da salida, al igual que la cápsula. En resumen, la encapsulación oculta los datos.

Abstracción:

La abstracción significa ocultar la lógica o la implementación. Por ejemplo, tomamos tabletas y vemos su color, pero no sabemos cuál es el propósito de esto y cómo funciona con el cuerpo.

Zeeshan Haider
fuente
0

Abstracción

En Java, la abstracción significa ocultar la información al mundo real. Establece el contrato entre las partes para informar sobre “qué debemos hacer para hacer uso del servicio”.

Ejemplo, en el desarrollo de API, solo se ha revelado al mundo la información resumida del servicio en lugar de la implementación real. La interfaz en java puede ayudar a lograr este concepto muy bien.

La interfaz proporciona un contrato entre las partes, por ejemplo, productor y consumidor. El productor produce los bienes sin informar al consumidor cómo se fabrica el producto. Pero, a través de la interfaz, Producer permite que todos los consumidores sepan qué producto pueden comprar. Con la ayuda de la abstracción, el productor puede comercializar el producto a sus consumidores.

Encapsulamiento:

La encapsulación es un nivel por debajo de la abstracción. La misma empresa de productos intenta proteger la información de los demás grupos de producción. Por ejemplo, si una empresa produce vino y chocolate, la encapsulación ayuda a proteger la información sobre cómo se elabora cada producto entre sí.

  1. Si tengo un paquete individual, uno para vino y otro para chocolate, y si todas las clases están declaradas en el paquete como modificador de acceso predeterminado, estamos dando encapsulación a nivel de paquete para todas las clases.
  2. Dentro de un paquete, si declaramos cada clase archivada (campo miembro) como privada y tenemos un método público para acceder a esos campos, de esta manera damos encapsulación a nivel de clase a esos campos
Shaan
fuente
0

Solo algunos puntos más para aclarar las cosas

No se debe confundir la abstracción de datos con la clase abstracta. Ellos son diferentes.

Generalmente decimos que la clase o método abstracto es básicamente ocultar algo. Pero no ... Eso está mal. ¿Qué significa la palabra abstracta? La búsqueda de Google dice que la palabra inglesa abstracción significa

"Existiendo en el pensamiento o como idea pero sin tener existencia física o concreta".

Y eso también es cierto en el caso de la clase abstracta. No está ocultando el contenido del método, pero el contenido del método ya está vacío (no tiene una existencia física o concreta) pero determina cómo debe ser un método (existente en el pensamiento o como idea) o un método debe estar en la calss. .

Entonces, ¿cuándo usas realmente métodos abstractos?

  • Cuando un método de la clase base será diferente en cada clase secundaria que lo amplíe.
  • Y, entonces, debe asegurarse de que la clase secundaria tenga implementada esta función.
  • Esto también asegura que el método, para tener una firma obligatoria como, debe tener n número de parámetros.

¡Entonces sobre la clase abstracta! - ¡Una clase abstracta no puede ser instanciada, solo extendida! Pero por qué ?

  • Se debe evitar que una clase con método abstracto cree su propia instancia porque los métodos abstractos en ella no tienen ninguna implementación significativa.
  • Incluso puede hacer un resumen de clase, si por alguna razón encuentra que tiene menos sentido tener una instancia de esa clase.

¡Una clase abstracta nos ayuda a evitar crear una nueva instancia de ella!

¡Un método abstracto en una clase obliga a la clase secundaria a implementar esa función con seguridad con la firma proporcionada!

S Vinesh
fuente
0

Permítanme explicarlo con el mismo ejemplo discutido anteriormente. Por favor considere el mismo televisor.

Encapsulación : Los ajustes que podemos hacer con el control remoto son un buen ejemplo - Volumen ARRIBA / ABAJO, Color y Contraste - Todo lo que podemos hacer es ajustarlo al valor mínimo y máximo proporcionado y no podemos hacer nada más allá de lo que se proporciona en el control remoto - Imagine el captador y el configurador aquí (la función del configurador verificará si el valor proporcionado es válido si Sí, procesará la operación si no, no nos permitirá hacer cambios, como si no pudiéramos disminuir el volumen más allá de cero incluso si presionamos el volumen hacia abajo botón cien veces).

Abstracción : Podemos tomar el mismo ejemplo aquí pero con un Grado / Contexto más alto. El botón para bajar el volumen disminuirá el volumen, y esta es la información que proporcionamos al usuario y el usuario no es consciente del transmisor de infrarrojos dentro del control remoto ni del receptor en el televisor y del proceso posterior de analizar la señal y el microprocesador. arquitectura dentro de la TV. En pocas palabras, no es necesario en el contexto: solo proporcione lo que sea necesario. Aquí se puede relacionar fácilmente la definición del libro de texto, es decir, ocultar la implementación interna y solo proporcionar lo que hará en lugar de cómo lo hará.

¡Espero que aclare un poco!

Surya
fuente
0

Si soy yo quien enfrentó la entrevista, diría que, como la abstracción y la encapsulación de la perspectiva del usuario final, son bastante iguales. No es más que ocultar información. Como perspectiva del desarrollador de software, la abstracción resuelve los problemas en el nivel de diseño y la encapsulación resuelve el problema en el nivel de implementación.

Rasika Weragoda
fuente
0

Brevemente, Abstractionsucede a nivel de clase al ocultar la implementación e implementar una interfaz para poder interactuar con la instancia de la clase. Considerando que, Encapsulationse utiliza para ocultar información; por ejemplo, hacer que las variables miembro sean privadas para prohibir el acceso directo y proporcionarles captadores y definidores para el acceso indirecto.

Morteza Bandi
fuente
-2

Abstracción: cuáles son las funciones y variables mínimas que deben exponerse al exterior de nuestra clase.

Encapsulación: cómo lograr este requisito, es decir, cómo implementarlo.

Nadim Almas Siddiqui
fuente
La encapsulación no es un medio para lograr la abstracción. Son 2 conceptos ligeramente diferentes pero tienen un vínculo sutil.
varsh
Creo que ambos no son conceptos diferentes, porque puedes lograr la encapsulación con una clase abstracta.
K Kishore Kumar Reddy