¿Encapsulación vs abstracción?

137

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, publictambié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.

  1. diferencia entre abstracción y encapsulación?
  2. encapsulación vs abstracción ejemplo del mundo real
M. Sach
fuente
la encapsulación como se definió anteriormente es una herramienta de abstracción, sin embargo, tiendo a pensar en términos de lo que encapsula una clase (funcionalidad / datos independientemente del acceso), donde como abstracción es más una sensación de alejarlo de las preocupaciones de implementaciones concretas, es decir, independientemente de cómo está hecho y lo que está hecho es factible desde wikipediaAn '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.
TI
La encapsulación es más vinculante que los detalles relevantes (datos y comportamientos que operan en los datos) relacionados con el contexto. También se puede lograr sin especificadores de acceso 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.
user3227986

Respuestas:

98

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 Listen la biblioteca estándar es una abstracción para una secuencia de elementos, indexados por su posición, ejemplos concretos de a Listson an ArrayListo a LinkedList. Código que interactúa con Listresú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.

Martin Probst
fuente
8
La encapsulación significa que un grupo de propiedades, métodos y otros miembros relacionados se tratan como una sola unidad u objeto. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana
1
La encapsulación conduce a la abstracción.
Martin
124

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.

Robert
fuente
13
Su definición de abstracción es la mejor que he visto, y siento que, por primera vez, hizo clic en mi cabeza y tuvo sentido. Sé que han pasado más de 3 años desde que publicaste esto, pero gracias.
Casey Crookston
1
Wow ... abstracción ... expresada en términos de arte ... rojo podría ser ira, eso es todo lo que necesitábamos saber! Gracias por esta visión del concepto :-)
SlowLearner
La encapsulación se utiliza para lograr "Acoplamiento flojo y alta cohesión".
Clasificador
28

la encapsulación es parte de la abstracción o podemos decir que es un subconjunto de la abstracción

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.

  • La encapsulación es el siguiente paso en el que reconoce las operaciones adecuadas a los atributos que aceptó mantener durante el proceso de abstracción. Es la asociación de los datos con la operación lo que actúa sobre ellos.
    Es decir, los datos y los métodos están agrupados.
Cratilo
fuente
¿Podemos decir que la abstracción es un tipo de concepto de diseño y la encapsulación se refiere principalmente a la implementación del diseño que acordamos durante la abstracción?
M Sach
1
En la encapsulación, usted define operaciones que pueden / deben aplicarse a sus datos. Esto también puede ser parte del diseño. Por ejemplo, recuperar el SSN, pero no modificarlo
Cratylus
25

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.

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Aquí tenemos datos de ajuste en una unidad o cápsula, es decir, Clase.

La abstracción es justo opuesta a la encapsulación.

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.

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }
varsha
fuente
estoy de acuerdo. Estos tipos son más bien opuestos. good oop tiende a abstraer las cosas que no cambian y a [encapsular las cosas que cambian] [1]. [1]: principios-wiki.net/…
Ray Tayek
15

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.

Alex D
fuente
14

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

  1. diferencia entre abstracción y encapsulación?
  2. encapsulación vs abstracción ejemplo del mundo real
M. Sach
fuente
5

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.

rojo
fuente
4

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 :)

abhilash
fuente
3

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.

Shaun Luttin
fuente
1

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.

Yubaraj
fuente
1

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).

satya
fuente
1

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.

Ranjit Kumar
fuente
0

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).

Alireza Rahmani Khalili
fuente