En informática , el ocultamiento de información es el principio de segregación de las decisiones de diseño de un programa informático que tienen más probabilidades de cambiar, protegiendo así otras partes del programa de modificaciones importantes si se modifica la decisión de diseño. La protección implica proporcionar una interfaz estable que proteja el resto del programa de la implementación (cuyos detalles es probable que cambien). Escrito de otra manera, el ocultamiento de información es la capacidad de evitar que ciertos aspectos de una clase o componente de software sean accesibles a sus clientes , utilizando características del lenguaje de programación (como variables privadas) o una política de exportación explícita.
El término encapsulación se utiliza a menudo indistintamente con ocultación de información. Sin embargo, no todo el mundo está de acuerdo con las distinciones entre ambos; se puede pensar que la ocultación de información es el principio y la encapsulación la técnica. Un módulo de software oculta información encapsulándola en un módulo u otro constructo que presenta una interfaz. [1]
Un uso común de la ocultación de información es ocultar la disposición física de almacenamiento de los datos de modo que, si se modifica, el cambio se restrinja a un pequeño subconjunto del programa total. Por ejemplo, si un punto tridimensional ( x , y , z ) se representa en un programa con tres variables escalares de punto flotante y, posteriormente, la representación se cambia a una única variable de matriz de tamaño tres, un módulo diseñado con la ocultación de información en mente protegería el resto del programa de dicho cambio.
En la programación orientada a objetos , la ocultación de información (mediante la anidación de tipos) reduce el riesgo de desarrollo de software al trasladar la dependencia del código de una implementación incierta (decisión de diseño) a una interfaz bien definida . Los clientes de la interfaz realizan operaciones puramente a través de la interfaz, por lo que, si la implementación cambia, los clientes no tienen que cambiar.
En su libro sobre diseño orientado a objetos , Grady Booch definió la encapsulación como "el proceso de compartimentar los elementos de una abstracción que constituyen su estructura y comportamiento; la encapsulación sirve para separar la interfaz contractual de una abstracción y su implementación". [2]
El objetivo es lograr el potencial de cambio: los mecanismos internos del componente se pueden mejorar sin afectar a otros componentes, o el componente se puede reemplazar por uno diferente que admita la misma interfaz pública. La encapsulación también protege la integridad del componente, al evitar que los usuarios configuren los datos internos del componente en un estado inválido o inconsistente. Otro beneficio de la encapsulación es que reduce la complejidad del sistema y, por lo tanto, aumenta la robustez, al limitar las interdependencias entre los componentes del software. [2]
En este sentido, la idea de encapsulación es más general que su aplicación en la programación orientada a objetos. Por ejemplo, una base de datos relacional está encapsulada en el sentido de que su única interfaz pública es un lenguaje de consulta (como SQL ), que oculta toda la maquinaria interna y las estructuras de datos del sistema de gestión de bases de datos. Como tal, la encapsulación es un principio básico de una buena arquitectura de software, en todos los niveles de granularidad.
La encapsulación de software detrás de una interfaz permite la construcción de objetos que imitan el comportamiento y las interacciones de los objetos del mundo real. Por ejemplo, un simple despertador digital es un objeto del mundo real que un profano (no experto) puede utilizar y comprender. Puede entender lo que hace el despertador y cómo utilizarlo a través de la interfaz proporcionada (botones y pantalla), sin tener que entender cada parte del interior del reloj. De manera similar, si el reloj fuera reemplazado por un modelo diferente, el profano podría seguir utilizándolo de la misma manera, siempre que la interfaz funcione de la misma manera.
En el contexto más concreto 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 agrupación o la combinación de ambos. (Consulte Encapsulación (programación orientada a objetos) para obtener más detalles).
El concepto de ocultamiento de información fue descrito por primera vez por David Parnas en 1972. [3] [4] Antes de eso, la modularidad fue discutida por Richard Gauthier y Stephen Pont en su libro de 1970 Designing Systems Programs, aunque la programación modular en sí misma había sido utilizada en muchos sitios comerciales durante muchos años anteriormente, especialmente en subsistemas de E/S y bibliotecas de software , sin adquirir la etiqueta de "ocultamiento de información", pero por razones similares, así como la razón más obvia de reutilización de código . [ aclaración necesaria ]
La ocultación de información sirve como un criterio eficaz para dividir cualquier pieza de equipo, software o hardware, en módulos de funcionalidad. Por ejemplo, un automóvil es una pieza de equipo compleja. Para que el diseño, la fabricación y el mantenimiento de un automóvil sean razonables, la pieza de equipo compleja se divide en módulos con interfaces particulares que ocultan las decisiones de diseño. Al diseñar un automóvil de esta manera, un fabricante de automóviles también puede ofrecer varias opciones y, al mismo tiempo, tener un vehículo que sea económico de fabricar.
Por ejemplo, un fabricante de automóviles puede tener una versión de lujo del automóvil además de una versión estándar. La versión de lujo viene con un motor más potente que la versión estándar. Los ingenieros que diseñan los dos motores diferentes, uno para la versión de lujo y otro para la versión estándar, proporcionan la misma interfaz para ambos motores. Ambos motores encajan en el compartimiento del motor del automóvil, que es el mismo en ambas versiones. Ambos motores se adaptan a la misma transmisión, los mismos soportes de motor y los mismos controles. Las diferencias en los motores son que la versión de lujo más potente tiene una mayor cilindrada con un sistema de inyección de combustible que está programado para proporcionar la mezcla de aire y combustible que requiere el motor de mayor cilindrada.
Además del motor más potente, la versión de lujo también puede ofrecer otras opciones como una mejor radio con reproductor de CD, asientos más cómodos, un mejor sistema de suspensión con neumáticos más anchos y diferentes colores de pintura. Con todos estos cambios, la mayor parte del coche es igual entre la versión estándar y la versión de lujo. La radio con reproductor de CD es un módulo que reemplaza a la radio estándar, también un módulo, en el modelo de lujo. Los asientos más cómodos se instalan en los mismos soportes de asiento que los tipos de asientos estándar. No importa si los asientos son de cuero o plástico, u ofrecen soporte lumbar o no.
Los ingenieros diseñan el coche dividiendo la tarea en partes del trabajo que se asignan a los equipos. Cada equipo diseña su componente según un estándar o interfaz particular que permite al equipo flexibilidad en el diseño del componente y, al mismo tiempo, garantiza que todos los componentes encajen entre sí.
Los fabricantes de vehículos a motor utilizan con frecuencia la misma estructura básica para varios modelos diferentes, en parte como medida de control de costes. Esta " plataforma " también constituye un ejemplo de ocultación de información, ya que el plano de planta puede construirse sin saber si se va a utilizar en un sedán o en un hatchback.
Como se puede ver en este ejemplo, el ocultamiento de información proporciona flexibilidad. Esta flexibilidad permite a un programador modificar la funcionalidad de un programa informático durante la evolución normal a medida que el programa informático cambia para adaptarse mejor a las necesidades de los usuarios. Cuando un programa informático está bien diseñado, al descomponer la solución de código fuente en módulos utilizando el principio de ocultamiento de información, los cambios evolutivos son mucho más fáciles porque los cambios suelen ser locales en lugar de globales.
Los automóviles son otro ejemplo de ello en su interacción con los conductores. Presentan una interfaz estándar (pedales, volante, palanca de cambios, señales, indicadores, etc.) en la que las personas reciben formación y licencia. De este modo, las personas solo tienen que aprender a conducir un automóvil; no necesitan aprender una forma de conducir completamente diferente cada vez que conducen un nuevo modelo. (Es cierto que hay transmisiones manuales y automáticas y otras diferencias similares, pero en general los automóviles mantienen una interfaz unificada).