oop - principio - ¿Cuál es la diferencia entre abstracción y encapsulación?
polimorfismo abstraccion (20)
Abstracción
Exponer la entidad en lugar de los detalles de la entidad.
"Los detalles están ahí, pero no los consideramos. No son necesarios".
Ejemplo 1:
Varios cálculos: Suma, Multiplicación, Resta, División, Cuadrado, Pecado, Cos, Tan.
No mostramos los detalles de cómo calculamos Sin, Cos o Tan. Simplemente mostramos la Calculadora y sus diversos métodos, que serán utilizados por el usuario.
Ejemplo 2:
El empleado tiene: Nombre, Apellido, Segundo Nombre. Él puede Iniciar sesión (), Cerrar sesión (), DoWork ().
Muchos procesos pueden estar ocurriendo para la entrada del empleado de registro, como la conexión a la base de datos, el envío de la identificación del empleado y la contraseña, y la recepción de la respuesta de la base de datos. Aunque los detalles anteriores están presentes, ocultaremos los detalles y expondremos solo a "Empleado".
Encapsulación
Encerrando. Tratar múltiples características / funciones como una unidad en lugar de individuos. Para que el mundo exterior se refiera a esa unidad en lugar de sus detalles directamente.
"Los detalles están ahí, los consideramos, pero no los mostramos, en cambio mostramos lo que necesita ver".
Ejemplo 1:
En lugar de llamarlo como Suma, Resta, Multiplicación, División, ahora lo llamaremos como una Calculadora.
Ejemplo 2:
Todas las características y operaciones ahora son referidas por el empleado, como "John". John tiene nombre. John Can DoWork (). John puede iniciar sesión ().
Ocultación
Esconder la implementación del mundo exterior. Para que el mundo exterior no vea lo que no se debe ver.
"Los detalles están ahí, los consideramos, pero no los mostramos. No necesita verlos".
Ejemplo 1:
Su requisito: Suma, Resta, Multiplicación, División. Podrás verlo y obtener el resultado.
No necesita saber dónde se almacenan los operandos. No es tu requerimiento
Además, cada instrucción que estoy ejecutando, tampoco es su requisito.
Ejemplo 2:
John desea saber su porcentaje de asistencia. Entonces se llamará GetAttendancePercentage ().
Sin embargo, este método necesita datos guardados en la base de datos. Por lo tanto, llamará a FetchDataFromDB (). FetchDataFromDB () NO es necesario que sea visible para el mundo exterior.
Por lo tanto, lo ocultaremos. Sin embargo, John.GetAttendancePercentage () será visible para el mundo exterior.
La abstracción, la encapsulación y la ocultación se complementan entre sí.
Debido a que creamos un nivel de abstracción sobre los detalles, los detalles están encapsulados. Y debido a que están encerrados, están ocultos.
En las entrevistas, se me ha pedido que explique la diferencia entre abstracción y encapsulación. Mi respuesta ha sido a lo largo de las líneas de
La abstracción nos permite representar el mundo real complejo de la manera más simple. Es el proceso de identificar las cualidades y comportamientos relevantes que un objeto debería poseer; en otras palabras, para representar la característica necesaria sin representar los detalles de fondo.
La encapsulación es un proceso de ocultar todos los detalles internos de un objeto del mundo real exterior. La palabra "encapsulación" es como "encerrar" en una "cápsula". Impide a los clientes ver su vista interna donde se implementa el comportamiento de la abstracción.
Creo que con la respuesta anterior el entrevistador estaba convencido, pero luego me preguntaron si el propósito de ambos es esconderse, entonces ¿por qué hay necesidad de usar la encapsulación? En ese momento no tenía una buena respuesta para esto.
¿Qué debería haber agregado para que mi respuesta sea más completa?
¡Es sencillo!
Tome ejemplo de televisión: es Encapsulación , porque:
La televisión está cargada de diferentes funcionalidades que no conozco porque están completamente ocultas.
Cosas ocultas como música, video, etc. todo incluido en una cápsula que llamamos TV
Ahora, Abstracción es cuando sabemos un poco sobre algo y que puede ayudarnos a manipular algo para lo que no sabemos cómo funciona internamente.
Por ejemplo: Un control remoto para TV es abstracción, porque
- Con el control remoto, sabemos que presionar las teclas numéricas cambiará los canales. No estamos al tanto de lo que realmente sucede internamente. Podemos manipular lo oculto, pero no sabemos cómo se está haciendo internamente.
Programáticamente, cuando podemos acceder a los datos ocultos de alguna manera y saber algo ... es Abstracción ... Y cuando no sabemos nada sobre lo interno, su Encapsulación.
Sin control remoto no podemos cambiar nada en la TV, tenemos que ver lo que muestra porque todos los controles están ocultos.
ABSTRACCIÓN: "Una vista de un problema que extrae la información esencial relevante para un propósito particular e ignora el resto de la información". [IEEE, 1983]
ENCAPSULACIÓN: "La encapsulación u ocultación de información equivalente se refiere a la práctica de incluir dentro de un objeto todo lo que necesita, y además hacerlo de tal manera que ningún otro objeto tenga que conocer esta estructura interna".
Abstracción: en el caso de una capa de abstracción de hardware, tiene interfaces simples para activar el hardware (por ejemplo, girar a la izquierda / derecha) sin conocer los detalles de hardware. Así que ocultando la complejidad del sistema. Es una vista simplificada del mundo real.
Encapsulación: ocultación de objetos internos. El objeto es una abstracción del mundo real. Pero los detalles de este objeto (como las estructuras de datos ...) se pueden ocultar a través de la encapsulación.
El desarrollador A, que utiliza inherentemente el concepto de abstracción , utilizará un módulo / función / widget de biblioteca, preocupado solo por lo que hace (y para qué se utilizará), pero no cómo lo hace. La interfaz de ese módulo / función de biblioteca / widget (las ''palancas'' que el Desarrollador A tiene permitido tirar / empujar) es la personificación de esa abstracción.
El desarrollador B, que busca crear dicho módulo / función / widget, utilizará el concepto de encapsulación para garantizar que el Desarrollador A (y cualquier otro desarrollador que use el widget) pueda aprovechar la abstracción resultante. El desarrollador B está muy interesado en cómo el widget hace lo que hace.
TLDR;
- Abstracción: me importa lo que haga algo, pero no cómo lo hace.
- Encapsulación: me importa cómo algo hace lo que hace, de modo que a otros solo les importe lo que hace.
(Como una generalización floja, para abstraer algo, debes encapsular algo más. Y al encapsular algo, has creado una abstracción).
En lo que respecta a iOS, se puede decir que los archivos de Objective C (es decir, .h y .m) usan abstracción y encapsulación.
Abstracción
El archivo de encabezado (.h) solo expone las funciones y los miembros públicos al mundo exterior. Nadie sabe cómo se usan a menos que tengan el archivo de implementación con ellos. Es el archivo .m el que contiene toda la lógica de uso e implementación consigo mismo. "La implementación permanece sin exposición".
Encapsulación
La propiedad (@property) encapsula el atributo de administración de memoria (atómico, fuerte, retenido, débil) de un iVar.
En mi opinión, ambos términos están relacionados en cierto sentido y se mezclan entre sí. La "encapsulación" proporciona una forma de agrupar campos relacionados, métodos en una clase (o módulo) para envolver los elementos relacionados entre sí. A partir de ese momento, proporciona ocultación de datos de dos maneras;
A través de modificadores de acceso.
Puramente para ocultar el estado de la clase / objeto.
Resumiendo algunas funcionalidades.
a. A través de interfaces / clases abstractas, la lógica compleja dentro de la clase o módulo encapsulado se puede abstraer / generalizar para ser utilizada por el exterior.
segundo. A través de firmas de funciones. Sí, incluso firmas de funciones ejemplo de abstracción. Porque las personas que llaman solo conocen la firma y los parámetros (si los hay) y no saben nada sobre cómo se realiza la función. Solo le importa el valor devuelto.
Del mismo modo, "Abstracción" podría ser una forma de encapsulación en términos de agrupar / envolver el comportamiento en una interfaz (o clase abstracta o incluso podría ser una clase normal).
En mi opinión, la encapsulación es una idea del programador para ocultar la complejidad del código del programa utilizando el especificador de acceso.
Donde como abstracción es la separación de método y objeto de acuerdo a su función y comportamiento. Por ejemplo, el coche tiene hojas, ruedas, rotura, faro.
La abstracción tiene que ver con separar la interfaz de la implementación. (No nos importa qué es , nos importa que funcione de cierta manera ) .
La encapsulación tiene que ver con no permitir el acceso o el conocimiento de las estructuras internas de una implementación. (No nos importa o necesitamos ver cómo funciona , solo que sí).
Algunas personas usan la encapsulación como sinónimo de abstracción, que es (IMO) incorrecta. Es posible que tu entrevistador pensara esto. Si ese es el caso, entonces cada uno estaba hablando de dos cosas diferentes cuando se refería a "encapsulación".
Vale la pena señalar que estos conceptos se representan de manera diferente en diferentes lenguajes de programación. Algunos ejemplos:
- En Java y C #, las interfaces (y, hasta cierto punto, las clases abstractas) proporcionan abstracción, mientras que los modificadores de acceso proporcionan encapsulación.
- En su mayoría es el mismo trato en C ++, excepto que no tenemos interfaces, solo tenemos clases abstractas.
- En JavaScript, la tipificación de pato proporciona abstracción y el cierre proporciona encapsulación. (La convención de nomenclatura también puede proporcionar encapsulación, pero esto solo funciona si todas las partes aceptan seguirla).
Lo esencial de la abstracción es que el código del cliente opera en términos de un modelo lógico / abstracto diferente . Ese modelo diferente puede ser más o menos complejo que la implementación que ocurre en cualquier uso dado del cliente.
Por ejemplo, "Iterator" abstrae (también se generaliza) el recorrido secuencial de 0 o más valores; en C ++ se manifiesta como begin()
, *
/ ->
(desreferencia), end()
, pre / post ++
y posiblemente --
, luego están +
, +=
, []
, std::advance
etc. Eso es mucho equipaje si el cliente pudiera decir incrementar un size_t
largo de una matriz de todos modos. Lo esencial es que la abstracción permite que el código del cliente que necesita realizar dicho recorrido se desacople de la naturaleza exacta del "contenedor" o fuente de datos que proporciona los elementos. La iteración es una noción de nivel superior que a veces restringe la forma en que se realiza el recorrido (por ejemplo, un iterador directo solo puede avanzar un elemento a la vez), pero los datos pueden ser proporcionados por un conjunto mayor de fuentes (por ejemplo, desde un teclado donde ni siquiera hay un "contenedor" en el sentido de valores almacenados concurrentemente). El código del cliente generalmente puede cambiar a otra fuente de datos abstraída a través de sus propios iteradores con cambios mínimos o incluso nulos, e incluso polimórficamente a otros tipos de datos, ya sea implícita o explícitamente usando algo como std::iterator_traits<Iterator>::value_type
available.
Esto es bastante diferente de la encapsulación, que es la práctica de hacer que algunos datos o funciones sean menos accesibles, de modo que usted sepa que solo se usan indirectamente como resultado de las operaciones en la interfaz pública. La encapsulación es una herramienta esencial para mantener invariantes en un objeto, lo que significa cosas que desea mantener verdadero después de cada operación pública: si el código del cliente podría simplemente alcanzar y modificar su objeto, entonces no puede imponer ninguna invariante. Por ejemplo, una clase puede envolver una cadena, asegurando que después de cualquier operación cualquier letra minúscula se cambie a mayúsculas, pero si el código del cliente puede alcanzar y poner una letra minúscula en la cadena sin la participación de las funciones de miembro de la clase, entonces el invariante no puede ser aplicado.
Para resaltar aún más la diferencia, considere decir un miembro private
std::vector<Timing_Sample>
que de hecho está poblado por operaciones en el objeto que lo contiene, con un informe arrojado sobre la destrucción. Con el efecto secundario de datos y destructor que no interactúa con el código de cliente del objeto de ninguna manera, y las operaciones en el objeto no controlan intencionalmente el comportamiento de mantenimiento del tiempo, no hay abstracción de esa funcionalidad de informe de tiempo pero hay encapsulación. Un ejemplo de abstracción sería mover el código de tiempo en una clase separada que podría encapsular el vector
(hacerlo private
) y simplemente proporcionar una interfaz como add(const Timing_Sample&)
e report(std::ostream&)
- el lógico / abstracto necesario operaciones involucradas con el uso de tal instrumentación, con el efecto secundario altamente deseable de que el código abstraído sea a menudo reutilizable para otro código de cliente con necesidades funcionales similares.
Mi opinión sobre la abstracción no es en el sentido de ocultar la implementación o los detalles del fondo.
La abstracción nos brinda el beneficio de lidiar con una representación del mundo real que es más fácil de manejar, tiene la capacidad de ser reutilizada, podría combinarse con otros componentes de nuestro paquete de programas más o menos complejo. Entonces tenemos que descubrir how
elegimos una paz completa del mundo real, que es lo suficientemente completa como para representar el sentido de nuestro algoritmo y nuestros datos. La implementación de la interfaz puede ocultar los detalles, pero esto no es parte del trabajo que tenemos que hacer para abstraer algo.
Para mí, lo más importante para la abstracción es:
- reducción de la complejidad
- reducción de tamaño / cantidad
- división de dominios no relacionados para componentes claros e independientes
¡Todo esto no tiene nada que ver con ocultar detalles de fondo!
Si piensa en clasificar algunos datos, la abstracción puede dar como resultado:
- un algoritmo de clasificación, que es independiente de la representación de datos
- una función de comparación, que es independiente de los datos y el algoritmo de ordenación
- una representación de datos genéricos, que es independiente de los algoritmos utilizados
Todo esto no tiene nada que ver con ocultar información.
Sé que hay muchas respuestas para mí con variedad de ejemplos.
Bueno, aquí está mi opinión: la abstracción se está interesando de la realidad .
En abstracción , escondemos algo para reducir la complejidad del mismo y en la encapsulación , ocultamos algo para proteger los datos.
Por lo tanto, definimos la encapsulación como el ajuste de datos y métodos en una única entidad denominada clase.
En Java logramos la encapsulación utilizando getters y setters no solo envolviendo datos y métodos en él. también definimos una forma de acceder a esos datos. y al acceder a los datos también lo protegemos.
Tecnológico, por ejemplo, sería definir un peso de llamada de variable de datos privados. Ahora sabemos que el peso no puede ser cero o menor que cero en el escenario del mundo real.
Imagínese que si no hay captadores y establecedores, alguien podría haberlo configurado fácilmente en un valor negativo como miembro público de la clase.
Ahora la diferencia final usando un ejemplo del mundo real,
Considere una placa de circuito que consiste en interruptores y botones. Envolvemos todos los cables en una caja de circuitos, de modo que podamos proteger a alguien al no tener contacto directo ( encapsulación ).
No nos importa cómo esos cables están conectados entre sí, solo queremos una interfaz para encender y apagar el interruptor. Esa interfaz es provista por botones ( abstracción )
Un programa tiene principalmente dos partes: DATOS y PROCESO. la abstracción oculta los datos en proceso para que nadie pueda cambiar. La encapsulación oculta los datos en todas partes para que no se puedan mostrar. Espero que esto aclare tu duda.
Abstracción: la abstracción es un proceso en el que se recopilan o recopilan datos relevantes y se eliminan datos no relevantes. (Y si has logrado la abstracción, entonces la encapsulación también se logra).
Encapsulación: la encapsulación es un proceso en el que envuelve funciones y miembros en una sola unidad. Significa que está ocultando los detalles de la implementación. Significa que el usuario puede acceder haciendo objeto de clase, no puede ver los detalles.
Ejemplo:
public class Test
{
int t;
string s;
public void show()
{
s = "Testing";
Console.WriteLine(s);
Console.WriteLine(See()); // No error
}
int See()
{
t = 10;
return t;
}
public static void Main()
{
Test obj = new Test();
obj.Show(); // there is no error
obj.See(); // Error:- Inaccessible due to its protection level
}
}
En el ejemplo anterior, el usuario puede acceder solo al método Show () usando obj, que es Abstraction.
Y el método See () llama internamente al método Show () que es encapsulación, porque el usuario no sabe qué está sucediendo en el método Show ().
Diferencia entre abstracción y encapsulación: -
Abstracción
- La abstracción soluciona el problema en el nivel de diseño.
- La abstracción se usa para ocultar los datos no deseados y proporcionar datos relevantes.
- La abstracción le permite concentrarse en lo que hace el objeto en lugar de cómo lo hace.
- Abstracción: diseño externo, utilizado en términos de diseño. Por ejemplo: - Vista exterior de un teléfono móvil, como si tuviera una pantalla y botones del teclado para marcar un número.
Encapsulación
- La encapsulación resuelve el problema en el nivel de implementación.
- La encapsulación significa ocultar el código y los datos en una sola unidad para proteger los datos del mundo exterior.
- La encapsulación significa ocultar los detalles internos o la mecánica de cómo un objeto hace algo.
- Encapsulación: diseño interno, utilizado en términos de implementación. Por ejemplo: - Detalle de implementación interna de un teléfono móvil, cómo el botón del teclado y la pantalla de visualización se conectan entre sí mediante circuitos.
Encapsulación: supongamos que tengo algunos documentos confidenciales, ahora escondo estos documentos dentro de un casillero para que nadie pueda obtener acceso a ellos, esto es encapsulación.
Abstracción: se produjo un gran incidente que se resumió en el periódico. Ahora el periódico solo enumeró los detalles más importantes del incidente real, esto es abstracción. Además, el título del incidente destaca detalles aún más específicos en una sola línea, lo que proporciona un mayor nivel de abstracción en el incidente. También los aspectos más destacados de un partido de fútbol / cricket se pueden considerar como abstracción de todo el partido.
Por lo tanto, la encapsulación oculta datos para proteger su integridad y la abstracción resalta detalles más importantes.
En términos de programación podemos ver que una variable puede estar encerrada es el alcance de una clase como privada, lo que impide que se acceda directamente desde el exterior, esto es encapsulación . Mientras que una función se puede escribir en una clase para intercambiar dos números. Ahora los números pueden intercambiarse ya sea usando una variable temporal o mediante manipulación de bits o usando operaciones aritméticas, pero el objetivo del usuario es recibir los números intercambiados independientemente del método utilizado para el intercambio, esto es abstracción .
Encapsulación
La encapsulación de lo que has aprendido en Google es un concepto de combinar los datos y las operaciones relacionadas en una única cápsula o lo que podríamos decir una clase en OOP, de modo que ningún otro programa pueda modificar los datos que contiene ni la implementación de métodos que tiene. en un momento particular de tiempo. Solo los métodos getter y setter pueden proporcionar acceso a las variables de instancia.
Nuestro código puede ser utilizado por otros y las futuras gradaciones o correcciones de errores son responsables. La encapsulación es algo que asegura que cualquier cambio de código que hagamos en nuestro código no rompe el código de otros que lo están usando.
La encapsulación se suma a la capacidad de mantenimiento, la flexibilidad y la extensibilidad del código.
La encapsulación ayuda a ocultar la implementación detrás de una interfaz.
Abstracción
La abstracción es el proceso de ocultar realmente la implementación detrás de una interfaz. Entonces, somos conscientes del comportamiento real, pero no de cómo funciona exactamente el pensamiento interno. El ejemplo más común podría ser el escenario donde colocar una llave dentro de la cerradura y desbloquearla fácilmente. Entonces, la interfaz aquí es el ojo de la cerradura, mientras que no somos conscientes de cómo las palancas dentro de la cerradura se coordinan entre sí para desbloquear el bloqueo.
Para ser más claros, la abstracción se puede explicar como la capacidad de usar la misma interfaz para diferentes objetos. Pueden existir diferentes implementaciones de la misma interfaz, mientras que los detalles de cada implementación están ocultos por la encapsulación.
Finalmente, la declaración para responder a todas las confusiones hasta ahora: la parte que está oculta se relaciona con la encapsulación mientras que la parte que está expuesta se relaciona con la abstracción.
La abstracción se refiere al acto de representar las características esenciales sin incluir los detalles de fondo o las explicaciones.
La encapsulación es una técnica utilizada para ocultar las propiedades y los comportamientos de un objeto y permitir el acceso externo solo según corresponda. Impide que otros objetos alteren o accedan directamente a las propiedades o métodos del objeto encapsulado.
Diferencia entre abstracción y encapsulación
1. La abstracción se centra en la vista exterior de un objeto (es decir, la interfaz). La encapsulación (ocultación de información) impide que los clientes vean su vista interior, donde se implementa el comportamiento de la abstracción.
2. La abstracción resuelve el problema en el lado del diseño mientras que la encapsulación es la implementación.
3.Encapsulation es el producto de Abstracción. La encapsulación apenas habla de agrupar su abstracción para satisfacer las necesidades del desarrollador.
La abstracción es uno de los muchos beneficios de la Encapsulación de datos . También podemos decir que la Encapsulación de Datos es una forma de implementar la Abstracción .
La encapsulación se usa por 2 razones principales:
1.) Ocultar y proteger los datos (el usuario de su clase no puede modificar los datos, excepto a través de los métodos proporcionados).
2.) Combinar los datos y métodos utilizados para manipular los datos en una sola entidad (cápsula). Creo que la segunda razón es la respuesta que su entrevistador quería escuchar.
Por otro lado , la abstracción es necesaria para exponer solo la información necesaria para el usuario y ocultar detalles innecesarios (por ejemplo, ocultar la implementación de métodos, de modo que el usuario no se vea afectado si se cambia la implementación).