Aquí están las breves definiciones de encapsulación y abstracción.
Abstracción:
El proceso de abstracción en Java se utiliza para ocultar ciertos detalles y solo muestra las características esenciales del objeto. En otras palabras, se trata de la vista exterior de un objeto (interfaz). El único buen ejemplo que veo para esto en diferentes sitios es la interfaz.
Encapsulación:
Básicamente se trata de ocultar el estado del objeto con la ayuda de modificadores como privado, público, protegido, etc. Exponemos el estado a través de métodos públicos solo si es necesario.
Lo que logramos con modificadores como private
, public
también oculta detalles innecesarios del mundo exterior, que no es más que un concepto de abstracción
Entonces, desde la explicación anterior parece que la encapsulación es parte de la abstracción o podemos decir que es un subconjunto de la abstracción. Pero, ¿por qué se inventa el término de encapsulación cuando podríamos tratarlo solo con abstracción? Estoy seguro de que debería haber alguna diferencia importante que los distinga, pero la mayor parte del material en la red dice casi lo mismo para ambos.
Aunque esta pregunta se ha planteado anteriormente en este foro también, pero la estoy publicando nuevamente con dudas específicas. Algunas respuestas también dicen que la abstracción es un concepto y la encapsulación es la implementación. Pero no compro esto: si es cierto, entonces puedo pensar que estos dos conceptos diferentes se proporcionan para confundirnos.
Actualización: - Después de 5 años, he encontrado mi propia respuesta, que es la esencia basada en las respuestas en esta publicación y las siguientes.
An 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
private
public
, ya que solo proporcionan información / ocultación de datos que lo hacemos porque es una buena práctica proteger los datos de la instancia.Respuestas:
La encapsulación es una estrategia utilizada como parte de la abstracción. La encapsulación se refiere al estado de los objetos: los objetos encapsulan su estado y lo ocultan del exterior; Los usuarios externos de la clase interactúan con ella a través de sus métodos, pero no pueden acceder al estado de las clases directamente. Entonces la clase abstrae los detalles de implementación relacionados con su estado.
La abstracción es un término más genérico, también se puede lograr mediante (entre otros) subclases. Por ejemplo, la interfaz
List
en la biblioteca estándar es una abstracción para una secuencia de elementos, indexados por su posición, ejemplos concretos de aList
son anArrayList
o aLinkedList
. Código que interactúa conList
resúmenes sobre el detalle de qué tipo de lista está utilizando.La abstracción a menudo no es posible sin ocultar el estado subyacente por encapsulación: si una clase expone su estado interno, no puede cambiar su funcionamiento interno y, por lo tanto, no puede abstraerse.
fuente
La abstracción es el concepto de describir algo en términos más simples, es decir, abstraer los detalles para enfocarse en lo que es importante (Esto también se ve en el arte abstracto, por ejemplo, donde el artista se enfoca en los bloques de construcción de imágenes, como color o formas). La misma idea se traduce en OOP mediante el uso de una jerarquía de herencia, donde los conceptos más abstractos están en la parte superior y las ideas más concretas, en la parte inferior, se basan en sus abstracciones. En su nivel más abstracto no hay detalles de implementación en absoluto y quizás muy pocos elementos en común, que se agregan a medida que disminuye la abstracción.
Como ejemplo, en la parte superior podría haber una interfaz con un único método, luego el siguiente nivel, proporciona varias clases abstractas, que pueden o no completar algunos de los detalles sobre el nivel superior, pero se ramifican agregando sus propios métodos abstractos , entonces para cada una de estas clases abstractas hay clases concretas que proporcionan implementaciones de todos los métodos restantes.
La encapsulación es una técnica . Puede o no ser para ayudar en la abstracción, pero ciertamente se trata de ocultar información y / u organización. Exige que los datos y las funciones se agrupen de alguna manera; por supuesto, las buenas prácticas de OOP exigen que se agrupen por abstracción. Sin embargo, hay otros usos que solo ayudan en el mantenimiento, etc.
fuente
Son conceptos diferentes.
La abstracción es el proceso de refinar todos los atributos innecesarios / sin importancia de un objeto y mantener solo las características más adecuadas para su dominio.
Por ejemplo, para una persona: decide mantener el nombre y apellido y el SSN. La edad, la altura, el peso, etc. se ignoran como irrelevantes.
La abstracción es donde comienza tu diseño.
Es decir, los datos y los métodos están agrupados.
fuente
La encapsulación está ocultando datos innecesarios en una cápsula o unidad
La abstracción muestra una característica esencial de un objeto.
La encapsulación se utiliza para ocultar su miembro de la clase y la interfaz externas. Usando modificadores de acceso proporcionados en c # .como ejemplo público, privado, protegido, etc.
Aquí tenemos datos de ajuste en una unidad o cápsula, es decir, Clase.
La abstracción se utiliza para mostrar datos importantes y relevantes al usuario. El mejor ejemplo del mundo real En un teléfono móvil, puede ver sus diferentes tipos de funcionalidades como cámara, reproductor de mp3, función de llamada, función de grabación, multimedia, etc. Es una abstracción, porque solo está viendo información relevante en lugar de su ingeniería interna.
fuente
Abstracción es un término muy general, y la abstracción en software no se limita a lenguajes orientados a objetos. Una definición de diccionario: "el acto de considerar algo como una cualidad o característica general, aparte de realidades concretas, objetos específicos o instancias reales".
El lenguaje ensamblador puede considerarse como una abstracción del código de la máquina: el ensamblaje expresa los detalles y la estructura esenciales del código de la máquina, pero le libera de tener que pensar en los códigos de operación utilizados, el diseño del código en la memoria, haciendo que los saltos vayan a la dirección correcta, etc.
La API de su sistema operativo es una abstracción de la máquina subyacente. Su compilador proporciona una capa de abstracción que lo protege de los detalles del lenguaje ensamblador. La pila TCP / IP integrada en su sistema operativo abstrae los detalles de la transmisión de bits a través de una red. Si baja hasta el silicio en bruto, las personas que diseñaron su CPU lo hicieron usando diagramas de circuitos escritos en términos de "diodos" y "transistores", que son abstracciones de cómo viajan los electrones a través de los cristales semiconductores.
En software, todo es una abstracción. Creamos programas que simulan o modelan algún aspecto de la realidad, pero por necesidad nuestros modelos siempre abstraen algunos detalles de lo "real". Construimos capa sobre capa sobre capa de abstracciones, porque es la única forma de hacer algo. (Imagina que estás tratando de hacer, por ejemplo, un solucionador de sudoku, y tienes que diseñarlo usando solo cristales semiconductores. "OK, necesito una pieza de silicio tipo N aquí ...")
En comparación, "encapsulación" es un término muy específico y limitado. Algunas de las otras respuestas a esta pregunta ya le han dado buenas definiciones.
fuente
Respondo mi propia pregunta después de 5 años, ya que siento que todavía necesito más detalles.
Abstracción:
Definición técnica: - La abstracción es un concepto para ocultar detalles innecesarios (complejos o simples) y solo muestra las características esenciales del objeto. No hay implementación aquí, es solo un concepto
Lo que significa prácticamente: - Cuando digo que mi empresa necesita algún medio / dispositivo para que los empleados puedan conectarse con el cliente. Esta es la forma más pura de abstinencia (como la interfaz en java) ya que ese dispositivo / medio puede ser teléfono o internet o skype o en persona o correo electrónico, etc. No voy a entrar en detalles del dispositivo / medio
Incluso cuando digo que mi empresa necesita algún medio / dispositivo para que los empleados puedan conectarse con el cliente a través de una llamada de voz. Entonces también hablo abstracto pero en un nivel un poco más bajo ya que el dispositivo / medio puede ser teléfono o skype u otra cosa, etc.
Ahora cuando digo que mi empresa necesita un teléfono para que los empleados puedan conectarse con el cliente a través de una llamada de voz. Entonces también hablo abstracto pero en un nivel un poco más bajo ya que el teléfono puede ser de cualquier compañía como iphone o samsung o nokia, etc.
Encapsulación: - Básicamente se trata de ocultar el estado (información) del objeto con la ayuda de modificadores como privado, público, protegido, etc. Exponemos el estado a través de métodos públicos solo si es necesario.
Lo que significa prácticamente: - Ahora cuando digo que mi empresa necesita un iPhone para que los empleados puedan conectarse con el cliente a través de una llamada de voz. Ahora estoy hablando de algún objeto concreto (como el iPhone). A pesar de que no voy a entrar en el meollo del iPhone aquí también, pero el iPhone tiene algún estado / información concreta / implementación asociada con el dispositivo / medio no lo tiene. Cuando digo objeto concreto, en realidad significa cualquier objeto que tiene alguna implementación / información (no completa como la clase abstracta de Java) asociada con él.
Entonces, el iphone realmente usó aquí la encapsulación como estrategia para ocultar su estado / información y exponer solo los que cree que deberían estar expuestos. Entonces, tanto la abstracción como la encapsulación ocultan algunos detalles innecesarios, pero la abstracción a nivel de concepto y la encapsulación en realidad a nivel de implementación
Esta es la esencia basada en las respuestas en esta publicación y las siguientes
fuente
Encapsulación : el proceso de ocultar componentes de la clase para evitar el acceso directo desde el exterior. Se logra mediante el uso del modificador "privado" para evitar el acceso directo a algunos miembros de la clase (campo de datos o método) desde otras clases u objetos, mientras que el acceso público a estos miembros privados (interfaz). Eso hace que los miembros de la clase estén protegidos como órganos humanos ocultos / encapsulados debajo de la piel o algún escudo.
Abstracción : se debe seguir un principio al escribir un programa OOP que diga "debe incluir en la clase solo componentes que sean interesantes en la tarea del programa". Por ejemplo: el estudiante objeto tiene muchos caracteres como humano: nombre, edad, peso, color de cabello, color de ojos, etc. Pero, cuando crea una clase en OOP para trabajar con estudiantes, debe incluir solo aquellos caracteres que realmente importa para la base de datos del alumno: nombre, edad, especialidad, nivel, marcas ... etc. en C ++ puede crear una clase abstracta usando el modificador "virtual" con cualquier método de la clase y eso lo hará inutilizable en directo, pero puede derivar otras clases de él y crear implementación para sus miembros agregando los miembros requeridos en función de la tarea.
fuente
Así es como lo entendí:
En la programación orientada a objetos, tenemos algo llamado clases . ¿Para qué son? Deben almacenar algún estado y almacenar algunos métodos para cambiar ese estado, es decir, están encapsulando el estado y sus métodos.
A (clase) no le importa la visibilidad propia o de sus contenidos. Si elegimos ocultar el estado o algunos métodos, se trata de ocultar información .
Ahora, tome el escenario de una herencia . Tenemos una clase base y un par de clases derivadas (heredadas). Entonces, ¿qué está haciendo la clase base aquí? Está abstrayendo algunas cosas de las clases derivadas.
Todos ellos son diferentes, ¿verdad? Pero los mezclamos para escribir buenos programas orientados a objetos. Espero eso ayude :)
fuente
La abstracción delinea una representación simplificada de un contexto específico; ignora los detalles contextualmente irrelevantes e incluye detalles contextualmente importantes.
La encapsulación restringe el acceso externo a las partes de algo y agrupa el estado de esa cosa con los procedimientos que usan el estado.
Tome a la gente, por ejemplo. En el contexto de la cirugía, una abstracción útil ignora las creencias religiosas de una persona e incluye el cuerpo de la persona. Además, las personas encapsulan sus recuerdos con los procesos de pensamiento que utilizan esos recuerdos. Una abstracción no necesita tener encapsulación; Por ejemplo, una pintura de una persona no oculta sus partes ni agrupa los procedimientos con su estado. Y, la encapsulación no necesita tener una abstracción asociada; por ejemplo, personas reales (no abstractas) encapsulan sus órganos con su metabolismo.
fuente
NOTA: estoy compartiendo esto. No significa que aquí no haya una buena respuesta, sino porque lo entendí fácilmente.
Responder:
Cuando se conceptualiza una clase, ¿cuáles son las propiedades que podemos tener en ella dado el contexto? Si estamos diseñando una clase Animal en el contexto de un zoológico, es importante que tengamos un atributo como animalType para describir doméstico o salvaje. Este atributo puede no tener sentido cuando diseñamos la clase en un contexto diferente.
Del mismo modo, ¿cuáles son los comportamientos que vamos a tener en la clase? La abstracción también se aplica aquí. ¿Qué es necesario tener aquí y qué será una sobredosis? Luego cortamos alguna información de la clase. Este proceso está aplicando la abstracción.
Cuando preguntamos por la diferencia entre encapsulación y abstracción, diría que la encapsulación usa la abstracción como concepto. Entonces, ¿es solo encapsulación? No, la abstracción es incluso un concepto aplicado como parte de la herencia y el polimorfismo.
Vaya aquí para obtener más explicaciones sobre este tema.
fuente
Tratemos de entender de otra manera.
Qué puede pasar si la abstracción no está allí y qué puede pasar si la encapsulación no está allí.
Si Abstracción no está allí, puede decir que el objeto es usar menos. No puede identificar el objeto ni acceder a ninguna funcionalidad del mismo. Tomemos un ejemplo de un televisor, si no tiene la opción de encender, cambiar de canal, subir o bajar el volumen, etc., ¿de qué sirve el televisor y cómo lo usa?
Si la Encapsulación no está allí o no se está implementando correctamente, puede utilizar el objeto de forma incorrecta. Allí por datos / componentes pueden ser mal utilizados. Tome el mismo ejemplo de TV, si no se realiza la encapsulación en el volumen de TV, entonces el controlador de volumen puede ser mal utilizado haciendo que baje o supere su límite (0-40 / 50).
fuente
La encapsulación protege para colapsar el comportamiento interno del objeto / instancia de una entidad externa. Por lo tanto, se debe proporcionar un control para confirmar que los datos que se están suministrando no van a dañar el sistema interno de instancia / objeto para sobrevivir a su existencia.
Buen ejemplo, Divider es una clase que tiene dos divisores y divisores de variables de instancia y un método getDividedValue.
¿Puedes pensar, si el divisor se establece en 0, entonces el sistema / comportamiento interno (getDivided) se romperá.
Por lo tanto, el comportamiento interno del objeto podría protegerse lanzando excepciones a través de un método.
fuente
En una oración simple, puedo decir: La esencia de la abstracción es extraer propiedades esenciales mientras se omiten detalles no esenciales. Pero, ¿por qué deberíamos omitir detalles no esenciales? El motivador clave es prevenir el riesgo de cambio. Puede considerar que la abstracción es lo mismo que la encapsulación. Pero la encapsulación significa el acto de encerrar uno o más elementos dentro de un contenedor, no ocultar detalles. Si argumenta que "todo lo que estaba encapsulado también estaba oculto". Esto obviamente no es verdad. Por ejemplo, aunque la información puede estar encapsulada dentro de estructuras y matrices de registros, esta información generalmente no está oculta (a menos que esté oculta a través de algún otro mecanismo).
fuente