poo - Abstracción vs Encapsulación en Java
override java definition (3)
Posible duplicado:
Abstraction VS Information Ocultar Encapsulación VS
Sé que esta pregunta se pudo haber hecho miles de veces en este foro, incluso Net también está llena de muchas definiciones sobre estos conceptos, pero todos suenan igual y todos utilizan las mismas palabras técnicas. Por ejemplo, las siguientes definiciones
La encapsulación es un proceso de vincular o envolver los datos y los códigos que operan en los datos en una sola entidad. Esto mantiene la seguridad de los datos fuera de la interfaz y el uso indebido. Una forma de pensar acerca de la encapsulación es como un envoltorio protector que evita que el código y los datos sean accedidos arbitrariamente por otro código definido fuera del envoltorio.
Lo que entendí de la definición anterior es que crear variables, marcarlas como privadas y generar getter-setter para esas variables y usar object para acceder a getter y setter. De esta forma, los datos se ocultan dentro del objeto y solo se puede acceder a ellos a través del objeto. Espero tener razón
La abstracción es el proceso de abstracción en Java que se utiliza para ocultar ciertos detalles y solo mostrar las características esenciales del objeto. En otras palabras, se trata de la vista externa de un objeto (interfaz).
Ahora esta es la parte que me confunde siempre. Cada vez que pienso en la abstracción, lo que viene a mi mente es la clase Abstracta (puede ser porque ambas tienen una palabra clave Abstracta). La definición anterior dice que abstracción significa ocultar datos y solo mostrar los detalles requeridos, pero eso es lo que ya estamos haciendo en encapsulación ¿no? entonces, ¿cuál es la diferencia? Además, no obtuve lo que está fuera de la vista lateral del objeto que trata con la vista exterior de un objeto .
¿Puede alguien por favor aclarar esto con algún ejemplo de la vida real o con algunos ejemplos programáticos si es posible?
En palabras simples: haces abstracción al decidir qué implementar. Haces encapsulación cuando ocultas algo que has implementado.
La abstracción se trata de identificar puntos en común y reducir las funciones con las que debe trabajar en diferentes niveles de su código.
por ejemplo, puedo tener una clase de Vehicle
. Un Car
se derivaría de un Vehicle
, como lo haría una Motorbike
. Puedo solicitar a cada Vehicle
la cantidad de ruedas, pasajeros, etc. y esa información ha sido resumida e identificada como común en Cars
y Motorbikes
.
En mi código, a menudo puedo tratar con Vehicles
través de métodos comunes go()
, stop()
etc. Cuando agrego un nuevo tipo de Vehículo más tarde (p. Ej., Scooter
), la mayoría de mi código permanecerá ajeno a este hecho, y la implementación de Scooter
solo se preocupa por las particularidades de Scooter
.
OO Abstracción ocurre durante el diseño de nivel de clase, con el objetivo de ocultar la complejidad de implementación de cómo se implementaron las características ofrecidas por una API / diseño / sistema, en un sentido que simplifica la ''interfaz'' para acceder a la implementación subyacente.
Este proceso puede repetirse a niveles (capas) de abstracción cada vez más "elevados", lo que permite construir sistemas grandes sin aumentar la complejidad del código y la comprensión, en capas superiores.
Por ejemplo, un desarrollador Java puede usar las características de alto nivel de FileInputStream sin preocuparse por cómo funciona (es decir, los identificadores de archivos, las comprobaciones de seguridad del sistema de archivos, la asignación de memoria y el almacenamiento en búfer se administrarán internamente y se ocultan a los consumidores). Esto permite FileInputStream
la implementación de FileInputStream
, y mientras la API (interfaz) a FileInputStream
permanezca constante, el código creado con versiones anteriores seguirá funcionando.
Del mismo modo, al diseñar sus clases, querrá ocultar la implementación interna de los demás en la medida de lo posible.
En la definición 1 de Booch, la encapsulación OO se logra ocultando información , y específicamente alrededor de ocultar datos internos (campos / miembros que representan el estado) propiedad de una instancia de clase, imponiendo el acceso a los datos internos de forma controlada y evitando el acceso directo. cambio externo a estos campos, así como la ocultación de cualquier método de implementación interno de la clase (por ejemplo, haciéndolos privados).
Por ejemplo, los campos de una clase se pueden hacer private
por defecto, y solo si se requiere acceso externo a estos, se expondría get()
y / o set()
(o Property
) de la clase. (En los lenguajes OO modernos, los campos se pueden marcar como readonly
/ final
/ immutable
que restringe aún más el cambio, incluso dentro de la clase).
Ejemplo donde NO se ha aplicado ocultamiento de información (mala práctica) :
class Foo {
// BAD - NOT Encapsulated - code external to the class can change this field directly
// Class Foo has no control over the range of values which could be set.
public int notEncapsulated;
}
Ejemplo donde se ha aplicado la encapsulación de campo :
class Bar {
// Improvement - access restricted only to this class
private int encapsulated;
// The state of Bar (and its fields) can now be changed in a controlled manner
public void setEncapsulatedField(int newValue) {
if (newValue < 100) {
encapsulated = newValue;
}
// else throw ... out of range
}
}
Ejemplo de inicialización inmutable / constructor-only de un campo :
class Baz {
private final int onlyValue;
public void Baz(int immutableValue) {
// ... can check that immutableValue is valid
onlyValue = immutableValue;
}
// Further change of `onlyValue` outside of the constructor is NOT permitted
// even within the same class
}
Re: Abstracción vs Clase abstracta
Las clases abstractas son clases que promueven la reutilización de elementos comunes entre clases, pero que no pueden ser instanciadas directamente con new()
- las clases abstractas deben ser subclasificadas, y solo las subclases concrete
(no abstractas) pueden ser instanciadas. Posiblemente, una fuente de confusión entre Abstraction
y una abstract class
fue que en los primeros días de OO, la herencia se usaba más para lograr la reutilización del código (por ejemplo, con clases base abstractas asociadas). Hoy en día, la composición generalmente se ve favorecida por la herencia , y hay más herramientas disponibles para lograr la abstracción, como a través de interfaces, eventos / delegados / funciones, rasgos / mixins, etc.
Re: Encapsulación vs Ocultar información
Más recientemente, la encapsulation
también se usa comúnmente en un sentido más general al determinar qué métodos, campos, propiedades, eventos y otros bundle
en una clase.
Citando Wikipedia:
En la configuración más concreta de un lenguaje de programación orientado a objetos, la noción se utiliza para referirse a un mecanismo de ocultación de información, un mecanismo de agrupamiento o la combinación de los dos.
Por ejemplo, en la declaración "He encapsulado el código de acceso a datos en su propia clase" , la interpretación de encapsulación es más o menos equivalente al principio de Separación de preocupaciones (el S en SOLIDO), y podría decirse que podría usarse como sinónimo de refactorización
[1] Una vez que hayas visto la imagen del gato encapsulado de Booch, nunca podrás olvidar la encapsulación - p46 de Análisis orientado a objetos y Diseño con aplicaciones, 2da edición