En los sistemas de software, la encapsulación se refiere a la agrupación de datos con los mecanismos o métodos que operan sobre ellos. También puede referirse a la limitación del acceso directo a algunos de esos datos, como los componentes de un objeto. [ 1 ] En esencia, la encapsulación impide que el código externo se ocupe del funcionamiento interno de un objeto.
La encapsulación permite a los desarrolladores presentar una interfaz consistente e independiente de su implementación interna. Por ejemplo, se puede usar para ocultar los valores o el estado de un objeto de datos estructurado dentro de una clase . Esto impide que los clientes accedan directamente a esta información, lo que podría exponer detalles de implementación ocultos o violar la invariancia de estado que mantienen los métodos.
La encapsulación también anima a los programadores a colocar todo el código relacionado con un conjunto de datos determinado en la misma clase, lo que facilita su comprensión por parte de otros programadores. La encapsulación es una técnica que fomenta el desacoplamiento .
Todos los sistemas de programación orientada a objetos (POO) admiten la encapsulación, [ 2 ] [ 3 ] pero la encapsulación no es exclusiva de la POO. Las implementaciones de tipos de datos abstractos , módulos y bibliotecas también ofrecen encapsulación. Los teóricos de los lenguajes de programación han explicado esta similitud en términos de tipos existenciales . [ 4 ]
Significado
En los lenguajes de programación orientados a objetos y otros campos relacionados, la encapsulación se refiere a una de dos nociones relacionadas pero distintas, y a veces a la combinación de ambas: [ 5 ] [ 6 ]
- Un mecanismo de lenguaje para restringir el acceso directo a algunos de los componentes del objeto . [ 7 ] [ 8 ]
- Una construcción de lenguaje que facilita la agrupación de datos con los métodos (u otras funciones) que operan sobre esos datos. [ 1 ] [ 9 ]
Algunos investigadores y académicos de lenguajes de programación utilizan 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 algunos lenguajes de programación que proporcionan cierres léxicos consideran la encapsulación como una característica del lenguaje ortogonal a la orientación a objetos.
La segunda definición refleja que, en muchos lenguajes orientados a objetos y otros campos relacionados, los componentes no se ocultan automáticamente y esto puede modificarse. Por lo tanto, quienes prefieren la segunda definición consideran la ocultación de información como un concepto independiente.
Las características de encapsulación se implementan mediante clases en la mayoría de los lenguajes orientados a objetos, aunque también existen otras alternativas.
La encapsulación también puede referirse a contener un proceso repetitivo o complejo en una sola unidad para su invocación. La programación orientada a objetos facilita esto tanto a nivel de método como de clase. Esta definición también es aplicable a la programación procedimental . [ 10 ]
Encapsulación y herencia
Los autores de Patrones de Diseño analizan extensamente la tensión entre herencia y encapsulación, y afirman que, según su experiencia, los diseñadores abusan de la herencia. Sostienen que la herencia suele romper la encapsulación, ya que expone una subclase a los detalles de la implementación de su padre. [ 11 ] Como describe el problema del yo-yo , el uso excesivo de la herencia y, por ende, de la encapsulación, puede volverse demasiado complejo y difícil de depurar.
Ocultación de información
Según la definición de que la encapsulación "puede usarse para ocultar miembros de datos y funciones miembro", la representación interna de un objeto generalmente se oculta fuera de su definición. Normalmente, solo los propios métodos del objeto pueden inspeccionar o manipular directamente sus campos. Ocultar los detalles internos del objeto protege su integridad al impedir que los usuarios establezcan los datos internos del componente en un estado inválido o inconsistente. Una supuesta ventaja de la encapsulación es que puede reducir la complejidad del sistema y, por lo tanto, aumentar la robustez , al permitir al desarrollador limitar las interdependencias entre los componentes de software.
Algunos lenguajes como Smalltalk y Ruby solo permiten el acceso a través de métodos de objeto, pero la mayoría de los demás (por ejemplo, C++ , C# , Delphi o Java [ 12 ] ) ofrecen al programador cierto control sobre lo que se oculta, normalmente a través de palabras clave como publicy private. [ 8 ] El estándar ISO C++ se refiere a protected, privatey publiccomo " especificadores de acceso " y que no "ocultan ninguna información". La ocultación de información se logra proporcionando una versión compilada del código fuente que se interconecta a través de un archivo de cabecera.
Casi siempre existe una forma de eludir dicha protección , generalmente mediante la API de reflexión (Ruby, Java, C#, etc.), a veces mediante mecanismos como la modificación de nombres ( Python ) o el uso de palabras clave especiales, como en C++. Los sistemas que proporcionan seguridad basada en capacidadesfriend a nivel de objeto (que se adhieren al modelo de capacidad de objeto ) son una excepción y garantizan una encapsulación sólida.
Ejemplos
Restricción de campos de datos
Lenguajes como C++ , C# , Java , [ 12 ] PHP , Swift y Delphi ofrecen formas de restringir el acceso a los campos de datos.
![]()
A continuación se muestra un ejemplo en C# que ilustra cómo se puede restringir el acceso a un campo de datos mediante el uso de una privatepalabra clave:
clase Programa { clase pública Cuenta { privado decimal _saldoCuenta = 500.00m ;public decimal CheckBalance () { return _accountBalance ; } }static void Main () { Account myAccount = new (); decimal myBalance = myAccount . CheckBalance ();/* Este método principal puede comprobar el saldo mediante el método público * "CheckBalance" proporcionado por la clase "Account" * pero no puede manipular el valor de "accountBalance" */ } }A continuación se muestra un ejemplo en Java :
public class Employee { private BigDecimal salary = new BigDecimal ( 50000.00 ); public BigDecimal getSalary () { return this . salary ; }public static void main () { Employee e = new Employee (); BigDecimal sal = e . getSalary (); } }La encapsulación también es posible en lenguajes no orientados a objetos. En C , por ejemplo, se puede declarar una estructura en la API pública a través del archivo de cabecera para un conjunto de funciones que operan sobre un elemento de datos que contiene miembros de datos que no son accesibles para los clientes de la API con la externpalabra clave. [ 13 ]
// Archivo de cabecera "api.h" #pragma oncetypedef struct Entity Entity ; // Estructura opaca con miembros ocultos// Funciones API que operan sobre objetos 'Entity' Entity * openEntity ( int id ); int processEntity ( Entity * e ); void closeEntity ( Entity * e );Los clientes llaman a las funciones de la API para asignar, operar y liberar objetos de un tipo de datos opaco . El contenido de este tipo es conocido y accesible únicamente para la implementación de las funciones de la API; los clientes no pueden acceder directamente a su contenido. El código fuente de estas funciones define el contenido real de la estructura:
// Archivo de implementación "api.c"#incluir "api.h"typedef struct Entity { int ent_id ; // Número de ID char ent_name [ 20 ]; // Nombre ... y otros miembros ... } Entity ;// Implementaciones de funciones API Entity * openEntity ( int id ) { // ... }int processEntity ( Entity * e ) { // ... }void closeEntity ( Entity * e ) { // ... }Deformación de nombres
A continuación se muestra un ejemplo de Python , que no admite restricciones de acceso a variables. Sin embargo, la convención es que una variable cuyo nombre esté precedido por un guion bajo debe considerarse privada. [ 14 ]
clase Car : def __init __ ( self ) - > None : self._maxspeed = 200def drive ( self ) -> None : print ( f "La velocidad máxima es { self . _maxspeed } ." )redcar : Car = Car () redcar.drive () # Esto imprimirá 'La velocidad máxima es 200. 'redcar . _maxspeed = 10 redcar . drive () # Esto imprimirá 'La velocidad máxima es 10.'Véase también
Citas
- 1 2 Rogers, Wm. Paul (18 de mayo de 2001). "La encapsulación no es ocultar información" . JavaWorld . Recuperado el 20 de julio de 2020 .
- ↑ "¿Qué es la programación orientada a objetos (POO)?" . Arquitectura de aplicaciones . Consultado el 2 de marzo de 2024 .
- ↑ "Encapsulación en Programación Orientada a Objetos (POO)" . www.enjoyalgorithms.com . Consultado el 2 de marzo de 2024 .
- ↑ Pierce 2002 , § 24.2 Abstracción de datos con existenciales
- ↑ Scott, Michael Lee (2006). Pragmática de los lenguajes de programación (2.ª ed.). Morgan Kaufmann. pág. 481. ISBN 978-0-12-633951-2
Los mecanismos de encapsulación permiten al programador agrupar los datos y las subrutinas que operan sobre ellos en un solo lugar, y ocultar los detalles irrelevantes a los usuarios de una abstracción
. - ↑ Dale, Nell B.; Weems, Chip (2007). Programación y resolución de problemas con Java (2.ª ed.). Jones & Bartlett. pág. 396. ISBN 978-0-7637-3402-2.
- ↑ Mitchell, John C. (2003). Conceptos en lenguajes de programación . Cambridge University Press. pág. 522. ISBN 978-0-521-78098-8.
- 1 2 Pierce, Benjamin (2002). Tipos y lenguajes de programación . MIT Press. pág. 266. ISBN 978-0-262-16209-8.
- ↑ Connolly, Thomas M.; Begg, Carolyn E. (2005). «Cap. 25: Introducción a los sistemas de gestión de bases de datos orientados a objetos § Conceptos orientados a objetos». Sistemas de bases de datos: un enfoque práctico para el diseño, la implementación y la gestión (4.ª ed.). Pearson Education. pág. 814. ISBN 978-0-321-21025-8.
- ↑ McDonough, James E. (2017). «Encapsulación». Diseño orientado a objetos con ABAP: un enfoque práctico . Apress . doi : 10.1007/978-1-4842-2838-8 . ISBN 978-1-4842-2837-1– vía O'Reilly .
- ↑ Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John (1994). Patrones de diseño . Addison-Wesley. ISBN 978-0-201-63361-0.
- 1 2 Bloch 2018 , págs. 73–77, Capítulo §4 Punto 15 Minimizar la accesibilidad de las clases y los miembros.
- ↑ King, KN (2008). Programación en C: Un enfoque moderno (2.ª ed.). WW Norton & Company. pág. 464. ISBN 978-0393979503.
- ↑ Bader, Dan. "El significado de los guiones bajos en Python" . Mejora tus habilidades en Python . Consultado el 1 de noviembre de 2019 .
Referencias
- Bloch, Joshua (2018). «Java eficaz: Guía del lenguaje de programación» (tercera ed.). Addison-Wesley. ISBN 978-0134685991.
- Programación orientada a objetos
- Principios de programación
