c# - poo - ¿Cómo difieren la abstracción y la encapsulación?
encapsulamiento en programacion (14)
Me estoy preparando para una entrevista y decidí repasar mis conceptos de POO. Hay cientos de artículos disponibles, pero parece que cada uno los describe de manera diferente. Some dicen
La abstracción es "el proceso de identificar patrones comunes que tienen variaciones sistemáticas, una abstracción representa el patrón común y proporciona un medio para especificar qué variación usar" (Richard Gabriel).
y se logra a través de clases abstractas.
Algunos other dicen
Abstracción significa mostrar solo los detalles necesarios al cliente del objeto
y
Supongamos que tiene un método "CalculateSalary" en su clase Employee, que toma EmployeeId como parámetro y devuelve el salario del empleado del mes actual como un valor entero. Ahora si alguien quiere usar ese método. ¿No necesita preocuparse por cómo el objeto empleado calcula el salario? Lo único que debe preocupar es el nombre del método, sus parámetros de entrada y el formato del miembro resultante,
Busqué en Google una y otra vez y ninguno de los resultados parece darme una respuesta adecuada. Ahora, ¿dónde encapsula la encapsulación en todo esto? Busqué y encontré una pregunta de desbordamiento de pila . Incluso las respuestas a esas preguntas eran confusas Here , dice
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 desde el exterior; los usuarios externos de la clase interactúan con ella a través de sus métodos, pero no pueden acceder directamente al estado de las clases. Entonces la clase abstrae los detalles de implementación relacionados con su estado.
Y here otro miembro de renombre dice:
Son conceptos diferentes.
La abstracción es el proceso de depurar todos los atributos innecesarios / no importantes de un objeto y conservar solo las características más adecuadas para su dominio.
Ahora estoy arruinado con todo el concepto. Sé acerca de la clase abstracta, la herencia, los especificadores de acceso y todo. Solo quiero saber cómo debo responder cuando me preguntan sobre abstracción y / o encapsulación en una entrevista.
Por favor, no lo marques como un duplicado . Sé que hay varias preguntas similares. Pero quiero evitar la confusión entre las explicaciones contradictorias. ¿Alguien puede sugerir un enlace creíble? Un enlace a la pregunta de stackoverflow también es bienvenido a menos que vuelva a crear confusión. :)
EDITAR: Necesito respuestas, un poco c orientado
Abstracción significa mostrar solo los detalles necesarios al cliente del objeto
En realidad eso es encapsulación. también vea la primera parte del artículo de wikipedia para no confundirse con la encapsulación y el ocultamiento de datos. http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
Tenga en cuenta que simplemente ocultando a todos los miembros de la clase 1: 1 detrás de las propiedades no se encapsula en absoluto. la encapsulación se trata de proteger invariantes y ocultar los detalles de implementación.
aquí un buen artículo sobre eso. http://blog.ploeh.dk/2012/11/27/Encapsulationofproperties/ también eche un vistazo a los artículos vinculados en ese artículo.
las clases, las propiedades y los modificadores de acceso son herramientas para proporcionar la encapsulación en c #.
haces encapsulación para reducir la complejidad.
La abstracción es "el proceso de identificar patrones comunes que tienen variaciones sistemáticas, una abstracción representa el patrón común y proporciona un medio para especificar qué variación usar" (Richard Gabriel).
Sí, esa es una buena definición para la abstracción.
Son conceptos diferentes. La abstracción es el proceso de depurar todos los atributos innecesarios / no importantes de un objeto y conservar solo las características más adecuadas para su dominio.
Sí, son conceptos diferentes. tenga en cuenta que la abstracción es realmente lo opuesto a hacer un objeto adecuado para SU dominio SOLAMENTE. ¡es para hacer que el objeto sea adecuado para el dominio en general!
si tiene un problema real y proporciona una solución específica, puede usar la abstracción para formalizar una solución más genérica que también puede resolver más problemas que tienen el mismo patrón común. De esta forma, puede aumentar la reutilización de sus componentes o usar componentes creados por otros programadores que están hechos para el mismo dominio o incluso para diferentes dominios.
buenos ejemplos son clases provistas por el framework .net, por ejemplo lista o colección. estas son clases muy abstractas que puedes usar en casi todos lados y en muchos dominios. Imagine si .net solo implementara una clase EmployeeList y una CompanyList que solo podría contener una lista de empleados y compañías con propiedades específicas. tales clases serían inútiles en muchos casos. y qué dolor sería si tuviera que volver a implementar toda la funcionalidad de una CarList, por ejemplo. Entonces, la "Lista" se ABSTRAE del Empleado, Compañía y Automóvil. La lista en sí misma es un concepto abstracto que puede implementarse por su propia clase.
Las interfaces, las clases abstractas o la herencia y el polimorfismo son herramientas para proporcionar abstracción en c #.
haces abstracción para proporcionar reutilización.
Abstracción
En Java, abstracción significa ocultar la información al mundo real. Establece el contrato entre la parte para contar sobre "qué deberíamos hacer para hacer uso del servicio".
Ejemplo: en el desarrollo de API, solo se ha revelado al mundo la información resumida del servicio, más bien la implementación real. La interfaz en Java puede ayudar a lograr este concepto muy bien.
La interfaz proporciona un contrato entre las partes, ejemplo, productor y consumidor. El productor produce los productos sin informar al consumidor cómo se está fabricando el producto. Pero, a través de la interfaz, Producer permite que todos los consumidores sepan qué productos pueden comprar. Con la ayuda de la abstracción, el productor puede comercializar el producto a sus consumidores.
Encapsulación:
La encapsulación es un nivel inferior a la abstracción. La misma empresa de productos intenta proteger la información de cada uno de los otros grupos de producción. Por ejemplo, si una empresa produce vino y chocolate, la encapsulación ayuda a proteger la información de cómo cada producto se fabrica entre sí.
- Si tengo un paquete individual 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.
- Dentro de un paquete, si declaramos que cada clase archivada (campo de miembro) es privada y que tenemos un método público para acceder a esos campos, de esta manera se otorga encapsulación de nivel de clase a esos campos
Como sé, la encapsulación esconde los datos de las clases en sí mismos, y solo los hace accesibles a través de setters / getters, si se debe acceder desde el mundo exterior.
La abstracción es el diseño de clase por sí mismo.
Significa, cómo se crea el árbol de clases, qué métodos son generales, cuáles se heredan, cuáles se pueden anular, qué atributos están solo en el nivel privado, o en modo protegido, cómo se construye el árbol de herencia de la clase. ¿Utiliza el final? clases, clases de abtract, implementación de interfaz.
La abstracción coloca más la fase de diseño de oo, mientras que la encapsulación también se inscribe en la fase de desarrollo.
Creo que son conceptos ligeramente diferentes, pero a menudo se aplican juntos. La encapsulación es una técnica para ocultar detalles de implementación a la persona que llama, mientras que la abstracción es más una filosofía de diseño que involucra la creación de objetos que son análogos a objetos / procesos familiares, para ayudar a la comprensión. La encapsulación es solo una de las muchas técnicas que se pueden usar para crear una abstracción.
Por ejemplo, toma "windows". En realidad, no son ventanas en el sentido tradicional, son solo cuadrados gráficos en la pantalla. Pero es útil pensar en ellos como ventanas. Esa es una abstracción.
Si la "API de Windows" oculta los detalles de cómo el texto o los gráficos se representan físicamente dentro de los límites de una ventana, eso es una encapsulación.
El Análisis y Diseño Orientado a Objetos (OOAD) se basa en cuatro principios. Son:
Abstracción: significa que solo incorpora aquellas características de una entidad que se requieren en su diseño. Entonces, si cada cuenta bancaria tiene una fecha de apertura pero su aplicación no necesita conocer la fecha de apertura de una cuenta, simplemente no agrega el campo FechaHorario en su Diseño Orientado a Objetos de la clase CuentaBancaria. † La abstracción en OOAD no tiene nada que ver con las clases abstractas de programación. Según este principio, sus entidades son una abstracción de lo que realmente son. Diseñas una abstracción de la cuenta bancaria hasta el nivel de detalle que las necesidades de tu aplicación.
Herencia: es el principio que le evita escribir las funcionalidades que puede recibir de otra persona. Al igual que puede heredar la riqueza de sus padres, puede heredar campos y métodos de su clase de padres. Entonces, tomar todo lo que tiene la clase de padres y luego agregar algo más si es necesario, es herencia. No busque la herencia en su Diseño orientado a objetos. La herencia se presentará.
Polimorfismo: es una consecuencia de la herencia. Heredar un método de parent es útil, pero ser capaz de modificar un método si la situación lo exige, es polimorfismo. Puede implementar un método en la subclase con exactamente la misma firma que en la clase principal para que cuando se llame, se ejecute el método de la clase secundaria. Esto es polimorfismo.
Encapsulación: significa agrupar la funcionalidad relacionada y dar acceso solo a lo necesario. Este principio es la base del diseño de clases en Object Oriented Design donde:
- usted junta datos y métodos relacionados; y,
- no todos los datos y métodos pueden ser públicos.
† Personas que argumentan que "Abstracción de OOAD resulta en la palabra clave abstracta de OOP" ... Bueno, eso simplemente no es correcto .
Ejemplo: cuando diseñas una universidad en una aplicación que utiliza principios orientados a objetos, solo diseñas una "abstracción" de la universidad. A pesar de que generalmente hay un cajero automático dispensador de efectivo en casi todas las universidades, no puede incorporar ese hecho si no es necesario para su aplicación. Y ahora, aunque haya diseñado solo una abstracción de la universidad, no tiene que poner un resumen en su declaración de clase. Su diseño abstracto de la universidad será una clase normal en su aplicación.
Encapsulación: ocultar detalles de implementación (NOTA: datos Y / O métodos) de modo que solo lo que sea razonablemente legible / escribible / utilizable por externos sea accesible para ellos, todo lo demás es "intocable" directamente.
Abstracción: a veces se refiere específicamente a un tipo que no se puede instanciar y que proporciona una plantilla para otros tipos que pueden ser, generalmente a través de subclases. En términos más generales, "abstracción" se refiere a hacer / tener algo que es menos detallado, menos específico, menos granular.
Existe cierta similitud y superposición entre los conceptos, pero la mejor manera de recordarlo es la siguiente: la encapsulación se trata más bien de ocultar los detalles, mientras que la abstracción se trata más bien de generalizar los detalles.
La abstracción y la encapsulación son términos confusos y dependientes entre sí. Tomemos un ejemplo:
public class Person
{
private int Id { get; set; }
private string Name { get; set; }
private string CustomName()
{
return "Name:- " + Name + " and Id is:- " + Id;
}
}
Cuando creó la clase Person, realizó la encapsulación escribiendo propiedades y funciones juntas (Id, Name, CustomName). Usted realiza la abstracción cuando expone esta clase al cliente como
Person p = new Person();
p.CustomName();
Su cliente no sabe nada sobre Id y Nombre en esta función. Ahora bien, si su cliente también desea saber el apellido sin interrumpir la llamada a la función. Usted encapsula agregando una propiedad más a la clase Person de esta manera.
public class Person
{
private int Id { get; set; }
private string Name { get; set; }
private string LastName {get; set;}
public string CustomName()
{
return "Name:- " + Name + " and Id is:- " + Id + "last name:- " + LastName;
}
}
Mira, incluso después de agregar una propiedad extra en clase, tu cliente no sabe lo que le hiciste a tu código. Aquí es donde hiciste abstracción.
Lo pienso de esta manera, la encapsulación está ocultando la forma en que se hace algo. Esta puede ser una o muchas acciones.
La abstracción está relacionada con "por qué". Lo estoy encapsulando en primer lugar.
Básicamente le digo al cliente: "No necesita saber mucho sobre cómo procesar el pago y calcular el envío, etc. Solo quiero que me diga que quiere ''Realizar el pago'' y me ocuparé de los detalles para usted. "
De esta manera he encapsulado los detalles al generalizar (abstraer) en la solicitud de Checkout.
Realmente creo que el resumen y la encapsulación van de la mano.
Trataré de demostrar Encapsulación y Abstracción de una manera simple. Veamos ...
- El envolvimiento de datos y funciones en una sola unidad (llamada clase) se conoce como encapsulación. Encapsulamiento que contiene y oculta información sobre un objeto, como las estructuras de datos internas y el código.
La encapsulación es -
- Ocultando Complejidad,
- Datos y funciones de enlace juntos,
- Haciendo que el Método Complicado sea Privado,
- Haciendo que la variable de instancia sea privada,
- Ocultando Datos y Funciones Innecesarios del Usuario Final.
La encapsulación implementa la abstracción.
Y la abstracción es -
- Mostrando lo que es necesario
- Los datos deben abstraerse del Usuario final,
Veamos un ejemplo-
La imagen a continuación muestra una GUI de "Detalles del cliente para agregar en una base de datos".
Al mirar la imagen podemos decir que necesitamos una clase de cliente.
Paso 1: ¿Qué necesita mi clase de clientes?
es decir
2 variables para almacenar el Código del Cliente y el Nombre del Cliente.
1 Función para agregar el código del cliente y el nombre del cliente en la base de datos.
namespace CustomerContent
{
public class Customer
{
public string CustomerCode = "";
public string CustomerName = "";
public void ADD()
{
//my DB code will go here
}
Ahora, solo el método ADD no funcionará aquí solo.
Paso -2: ¿Cómo funcionará la validación? ¿Funcionará la función ADD?
Necesitaremos el código de conexión de la base de datos y el código de validación (métodos adicionales).
public bool Validate()
{
//Granular Customer Code and Name
return true;
}
public bool CreateDBObject()
{
//DB Connection Code
return true;
}
class Program
{
static void main(String[] args)
{
CustomerComponent.Customer obj = new CustomerComponent.Customer;
obj.CustomerCode = "s001";
obj.CustomerName = "Mac";
obj.Validate();
obj.CreateDBObject();
obj.ADD();
}
}
Ahora no hay necesidad de mostrar los métodos adicionales ( Validate()
; CreateDBObject()
[Método complicado y adicional]) al usuario final. El usuario final solo necesita ver y conocer el código del cliente, el nombre del cliente y el botón ADD que agregará el registro ... ¿El usuario final no se preocupa por CÓMO AGREGARÁ los datos a la base de datos ?.
Paso -3: Private los métodos extra y complicados que no involucra la interacción del usuario final.
Entonces, hacer que el método Complicado y Extra sea Privado en lugar de Público (es decir, Ocultar esos métodos) y eliminar obj.Validate();
obj.CreateDBObject();
del programa principal en la clase logramos la encapsulación.
En otras palabras, la simplificación de la interfaz para el usuario final es encapsulación.
Así que ahora el código completo se ve como a continuación -
namespace CustomerContent
{
public class Customer
{
public string CustomerCode = "";
public string CustomerName = "";
public void ADD()
{
//my DB code will go here
}
private bool Validate()
{
//Granular Customer Code and Name
return true;
}
private bool CreateDBObject()
{
//DB Connection Code
return true;
}
class Program
{
static void main(String[] args)
{
CustomerComponent.Customer obj = new CustomerComponent.Customer;
obj.CustomerCode = "s001";
obj.CustomerName = "Mac";
obj.ADD();
}
}
Resumen :
Paso -1 : ¿Qué necesita mi clase de clientes? es abstracción
Paso -3 : Paso -3: privado de los métodos adicionales y complicados que no involucra la interacción del usuario final es la encapsulación .
PD: el código anterior es difícil y rápido.
ACTUALIZACIÓN: hay un video en este enlace para explicar la muestra: ¿Cuál es la diferencia entre la abstracción y la encapsulación?
Un ejemplo siempre me ha sido presentado en el contexto de la abstracción; la transmisión automática vs. manual en los autos. La transmisión manual oculta parte del funcionamiento del cambio de marchas, pero aún tiene que embragar y cambiar como conductor. La transmisión automática encapsula todos los detalles del cambio de marchas, es decir, la oculta de usted, y por lo tanto, es una abstracción más alta del proceso de cambio de marchas.
mi 2c
el objetivo de la encapsulación es ocultar los detalles de implementación al usuario de su clase; por ejemplo, si internamente mantiene una lista estándar de elementos en su clase y luego decide que un estándar de Internet sería más efectivo, puede cambiar esto sin que el usuario cuidando. Dicho esto, la forma en que interactúas con el contenedor stl es gracias a la abstracción, tanto la lista como el vector pueden, por ejemplo, atravesarse de la misma manera con métodos similares (iteradores).
Abstracción: se resume en las imágenes superior izquierda y superior derecha del gato. El cirujano y la anciana diseñaron (o visualizaron) el animal de manera diferente. De la misma manera, pondrías diferentes características en la clase Cat, dependiendo de la necesidad de la aplicación. Cada gato tiene hígado, vejiga, corazón y pulmón, pero si necesita que su gato ''ronronee'' solamente, abstraerá el gato de su aplicación al diseño en la parte superior izquierda en lugar de en la esquina superior derecha.
Encapsulación: está delineada por el gato parado sobre la mesa. Eso es lo que todos los que están fuera del gato deberían ver al gato como . No necesitan preocuparse si la implementación real del gato es la superior izquierda o la superior derecha o incluso una combinación de ambos.
PD: ve here en esta misma pregunta para escuchar la historia completa.
El encapsulado oculta variables o alguna implementación que se puede cambiar con tanta frecuencia en una clase para evitar que los extraños accedan a ella directamente. Deben acceder a él a través de los métodos getter y setter.
La abstracción se usa para mostrar lo que es relevante pero en un grado más alto (clase, interfaz). Los clientes usan una clase abstracta (o interfaz), no les importa quién o qué era, solo necesitan saber qué puede hacer.
Encapsulación : ocultación de datos usando getters y setters, etc.
Abstracción : ocultación de la implementación usando clases abstractas e interfaces, etc.