¿Cuál es la diferencia entre "ocultación de datos" y "encapsulación"?

29

Estoy leyendo "concurrencia de Java en la práctica" y se dice: "Afortunadamente, las mismas técnicas orientadas a objetos que te ayudan a escribir clases bien organizadas y mantenibles, como la encapsulación y la ocultación de datos, también pueden ayudarte a crear hilos seguros clases ".

El problema # 1: nunca escuché sobre la ocultación de datos y no sé de qué se trata.

El problema n. ° 2: siempre pensé que la encapsulación está usando lo privado frente a lo público, y en realidad es la ocultación de datos.

¿Puede explicar qué es la ocultación de datos y en qué se diferencia de la encapsulación?

dhblah
fuente
2
Leer código completo 2ª edición . Contestará muchas de sus preguntas.
Shiplu Mokaddim
Con respecto a la ocultación de información, consulte: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis
Este enlace tiene información útil sobre esta información. Al ocultar un principio de diseño, se especifica que una decisión de diseño debe ocultarse del resto del sistema para evitar un acoplamiento no deseado. Debería informar la forma en que encapsula las cosas, pero, por supuesto, no tiene que hacerlo. La encapsulación es una característica del lenguaje de programación.
Abhijeet

Respuestas:

19

La ocultación de datos e información es una noción más amplia que se encuentra en la informática y la ingeniería de software. Se refiere al hecho de que aquellas partes de un programa de computadora que pueden cambiar no deben ser accesibles desde otros módulos / clientes.

Encapsulación es un término que se encuentra en el paradigma orientado a objetos y se refiere a mantener los datos en campos privados y modificarlos solo a través de métodos.

Por lo tanto, la encapsulación puede verse como una forma de lograr el ocultamiento de datos en sistemas orientados a objetos .

m3th0dman
fuente
1
Gracias por tu respuesta. Todavía no entiendo, por qué si la ocultación de datos es la misma pero un poco más amplia que la encapsulación, en el libro se hace referencia a ellos como si tuvieran una amplitud similar y no uno incluido el otro.
dhblah
Los autores probablemente marcan la diferencia con la ocultación de datos y la ocultación de información en el sentido de que la ocultación de datos solo oculta las estructuras de datos, los campos privados, mientras que la ocultación de información puede referirse a detalles de implementación encapsulados (algoritmos utilizados, por ejemplo), la comunicación se realiza solo a través de interfaces.
m3th0dman el
2
Puede tener uno sin tener el otro: mire Python, donde no hay datos ocultos (no existe un atributo privado o protegido).
Latty
El punto de @ Lattyware es muy verdadero e importante. También se puede tener la encapsulación (por su definición, a lo que me opongo por lo que estoy describiendo aquí) sin ocultar nada, es decir, exponiendo ciegamente un captador y setter trivial para cada miembro. Eso no oculta nada y no evita nada, pero cumple la definición común de encapsulación al pie de la letra.
1
La encapsulación no mantiene los datos en un campo privado, es más información oculta. La encapsulación, de manera general, es el concepto de reunir (encapsular) información / datos y métodos en una clase.
nbro
6

Encapsulación y ocultación de datos son términos relacionados. Es importante entender que surgen en relación con la abstracción . Booch et. Alabama. en Análisis orientado a objetos y diseño con aplicaciones explica,

La abstracción y la encapsulación son conceptos complementarios: la abstracción se centra en el comportamiento observable de un objeto, mientras que la encapsulación se centra en la implementación que da lugar a este comportamiento. La encapsulación se logra con mayor frecuencia mediante el ocultamiento de información (no solo el ocultamiento de datos), que es el proceso de ocultar todos los secretos de un objeto que no contribuyen a sus características esenciales; normalmente, la estructura de un objeto está oculta, así como la implementación de sus métodos.

El d
fuente
5

Crear una clase incluye el concepto de encapsulación. Cuando creas una clase, pones datos y comportamientos dentro de la clase y la clase se convierte en una unidad que llamamos un objeto. Por lo tanto, la ocultación de datos es parte de la encapsulación.

Aleko Gharibashvili
fuente
4

De Wikipedia :

En un lenguaje de programación, la encapsulación se usa para referirse a una de dos nociones relacionadas pero distintas, y a veces a la combinación de las mismas:

  • Un mecanismo de lenguaje para restringir el acceso a algunos de los componentes del objeto.
  • Una construcción de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan en esos datos.

Algunos investigadores y académicos del lenguaje de programación usan el primer significado solo o en combinación con el segundo como una característica distintiva de la programación orientada a objetos, mientras que otros lenguajes de programación que proporcionan cierres léxicos ven la encapsulación como una característica del lenguaje ortogonal a la orientación a objetos.

La segunda definición está motivada por el hecho de que en muchos lenguajes OOP la ocultación de componentes no es automática o puede ser anulada; por lo tanto, la ocultación de información se define como una noción separada por aquellos que prefieren la segunda definición.

Michael Borgwardt
fuente
Gracias por su respuesta. Preguntas de seguimiento: 1) ¿el lenguaje de programación de Java tiene facilidades a las que se refiere la segunda noción relacionada con la encapsulación? 2) No entiendo por qué la anulación de la ocultación de datos es importante. Por ejemplo, en Java puede acceder a cualquier campo (público o privado) a través de la reflexión.
dhblah
@Software Engeneering Learner: las clases como construcciones de código fuente representan la segunda noción. En cuanto a la ocultación de información, el punto es que limitar el alcance de los datos a menudo se basa en mecanismos de lenguaje específicos y separados.
Michael Borgwardt
2

A menudo se usan de manera intercambiable en la discusión, y a menudo creo que trabajan juntos para lograr el mismo propósito, y si bien lo siguiente puede no ser completamente exacto, puede proporcionar alguna distinción significativa, si es necesario hacer una distinción:

Cuando se habla de encapsulación, a menudo se implementa como un mecanismo de procedimiento / funcional. Hay algún tipo de protección para el estado subyacente, y el acceso a través de la protección requiere que se sigan ciertos protocolos para tener acceso (leer o cambiar el estado deseado). La encapsulación también ofrece la oportunidad de que se produzcan efectos secundarios debido al acceso (como el cambio de estado en cascada, o la notificación / aumento de un evento / emisión de una señal cuando se lee o cambia la cosa de interés) para que se puedan iniciar acciones de seguimiento. Nuevamente, a menudo pienso en la encapsulación como un concepto que se implementa como un procedimiento.

Veo que el concepto de ocultar datos es similar en propósito a la encapsulación; sin embargo, el mecanismo es estructural y opera a un nivel diferente. En la práctica, en lugar de proporcionar un mecanismo de protección y efectos secundarios a través del procedimiento, el estado se protege y se ve afectado a través de mecanismos estructurales del lenguaje y el tiempo de ejecución. Estos tipos de guardias serían cláusulas de visibilidad, definiciones de tipo, herencia y similares. Los efectos secundarios que puede aprovechar de los objetos estructuralmente protegidos son nuevamente algo que depende del lenguaje y el tiempo de ejecución: tal vez la activación de objetos, el recuento de referencias o algo por el estilo.

JustinC
fuente
0

A menudo, quizás generalmente, se usan indistintamente. Pero tenga en cuenta que la cita de Booch anterior dice: "La encapsulación se logra con mayor frecuencia mediante la ocultación de información ...", es decir, con mayor frecuencia, pero no siempre en todos los casos.

Tenga en cuenta que Python permite acumular datos en clases, pero no permite variables privadas. Entonces podría decirse que Python proporciona encapsulación sin ocultar datos.

Podrías hacer lo mismo en Java haciendo todas tus variables miembro public, pero además de dar a todos un ataque cardíaco, perderías el beneficio de ocultar datos ... es decir, preservar la semántica de un objeto al restringir el acceso a su estado.

Robar
fuente
0

En OO, la encapsulación es donde se mantiene la información dentro de un objeto. Por ejemplo, a Persontiene una namey los clientes de Persona (es decir, usted) saben que la Persona tiene un nombre, ya sea a través de campos públicos o métodos de acceso. Y, con suerte, no es necesario que también contenga los nombres en una serie global de nombres, etc. Así que este es un gran paso para evitar el código de espagueti inmanejable. Pero el cliente aún necesita saber algo sobre cómo la persona maneja los nombres: por ejemplo, ¿espacio o coma delimitada?

La ocultación de datos es donde Persontiene un campo de nombre, pero, al menos en teoría, nadie lo sabe . El campo es privado sin métodos de acceso público. Los clientes pueden pasar un nombre de un registro de base de datos, XML, HTTP POST, lo que sea, pero el funcionamiento interno de cómo la persona maneja el nombre es un "recuadro negro". Las futuras implementaciones de persona es libre de cambiar, por ejemplo, para cambiar a tener una firstNamey una lastName.

En un mundo ideal, la ocultación de datos es superior a la encapsulación, pero no todos los mundos son ideales. :-)

user949300
fuente