Logo DIE

Abstracción y Encapsulamiento

Unidad de Apoyo para el Aprendizaje

Iniciar

Introducción


La abstracción es la habilidad de ignorar los detalles de las partes para enfocar la atención en un nivel más alto de un problema. Para realizar un programa orientado a objetos se deben obtener las características (atributos) y funcionalidades (métodos) de cada uno de los objetos involucrados en la solución de problemas, a esto se le conoce como abstraer, es decir, es el hecho de pasar de un ente real a un ente lógico (programa).

El encapsulamiento sucede cuando un elemento del objeto (atributo o método) es envuelto en una capa protectora. Encapsular un objeto implica que los datos del objeto están protegidos, “ocultos” dentro de él. Con los datos ocultos, ¿cómo puede el resto del programa acceder a ellos? (el acceso a los datos de un objeto se refiere a leerlos o modificarlos). El programa no puede acceder de manera directa a los datos encapsulados de un objeto, esto se tiene que realizar con ayuda de los métodos del objeto.

En el supuesto de que los métodos de un objeto estén bien escritos, los métodos aseguran que se pueda acceder a los datos de manera adecuada. Al hecho de empaquetar o proteger los datos o atributos con los métodos se denomina encapsulamiento.





Aplicar la abstracción en el diseño de clases que integran una solución, utilizando el encapsulamiento para proteger la información y ocultar la implementación.

Abstracción


Diagrama de bloques

En el análisis hay que concentrarse en ¿qué hace? y no en ¿cómo lo hace?



El principio de abstracción es más fácil de entender con una analogía del mundo real, por ejemplo, la televisión:

Todos estamos familiarizados con sus características y su manejo manual o con el control remoto (encender, apagar, subir volumen, etcétera) incluso sabemos cómo conectarlo con otros aparatos externos como altavoces o reproductores o al Internet

Sin embargo, no todos sabemos cómo funciona internamente, es decir, cómo recibe la señal, cómo la traduce y la visualiza en la pantalla.

Normalmente sucederá que no sepamos cómo funciona el aparato de televisión, pero sí sabemos cómo utilizarlo. Esta característica se debe a que la televisión separa claramente su implementación interna de su interfaz externa. Interactuamos con la televisión a través de su interfaz: los botones de encendido, cambio de canal, volumen, etcétera; pero no conocemos el tipo de tecnología que utiliza, el método de generar la imagen en la pantalla o cómo funciona internamente, es decir, su implementación, ya que ello no afecta a su interfaz.





Encapsulamiento


La encapsulación o encapsulamiento significa reunir en una cierta estructura a todos los elementos que a un cierto nivel de abstracción se pueden considerar pertenecientes a una misma entidad; además es el proceso de agrupamiento de datos y operaciones relacionadas bajo una misma unidad de programación lo que permite aumentar la cohesión de los componentes del sistema.

El encapsulamiento oculta lo que hace un objeto de lo que hacen otros objetos y del mundo exterior, por lo que también se denomina ocultación de datos. Un objeto tiene que presentar “una cara” al mundo exterior, de modo que se puedan iniciar sus operaciones.

Por ejemplo

  • La televisión tiene un conjunto de botones para encender, apagar y cambiar canal.

  • Una lavadora tiene un conjunto de mandos e indicadores que establecen la temperatura, el nivel de agua, etcétera.

Los botones de la televisión y la lavadora constituyen la comunicación con el mundo interior, es decir, son las interfaces.

Diagrama de bloques

La interfaz de una clase representa un “contrato” de prestación de servicios entre ella y los demás componentes del sistema.

De este modo, los clientes sólo necesitan conocer los servicios que éste ofrece y no cómo están implementados internamente.



Por consiguiente, se puede modificar la implementación de una clase sin afectar a las restantes relacionadas con ella.

Reglas de visibilidad


Las reglas de visibilidad complementan o refinan el concepto de encapsulamiento. Los diferentes niveles de visibilidad dependen del lenguaje de programación con el que se trabaje, pero en general siguen el modelo de C++, estos niveles de visibilidad son:

Los atributos privados están contenidos en el interior de la clase ocultos a cualquier otra clase. Ya que los atributos están encapsulados dentro de una clase, se necesitará definir cuáles son las clases que tienen acceso a visualizar y cambiar los atributos.

Esta característica se conoce como visibilidad de los atributos. En general se recomienda visibilidad privada o protegida para los atributos.

Modificadores de acceso


Los modificadores de acceso se utilizan para definir la visibilidad de los miembros de una clase (atributos y métodos) y de la propia clase. En Java existen tres modificadores de acceso:



Diagrama de bloques


Sin embargo, existen cuatro niveles de acceso. Cuando no se especifica ninguno de los tres modificadores anteriores se tiene el nivel de acceso por defecto, que es el nivel de paquete.

La sintaxis para los modificadores de acceso es simplemente anteponerlos a la declaración de atributos y métodos.

Modificador tipoDato nombreVariable;
Modificador tipoDato nombreMetodo(parámetros…)

Ejemplo

private String nombre;
public int operación(int a, int b){

A continuación, se muestra el acceso permitido para cada modificador.

Diagrama de bloques

Diagrama de bloques


Un principio fundamental en la programación orientada a objetos es…

Diagrama de bloques

Esto tiene una gran ventaja: si ninguna otra clase conoce cómo está almacenada la información entonces se puede cambiar fácilmente la forma de almacenarla sin afectar otras clases.





Acceso a miembros


Podemos reforzar la separación del qué hacer del cómo hacerlo, declarando los campos como privados y usando un método de acceso para acceder a ellos.

Los métodos de acceso son el medio para acceder a los atributos privados del objeto. Son métodos públicos del objeto y pueden ser:



Cuando se crea una clase es frecuente que lo primero que se haga sea establecer métodos para consultar sus atributos y estos métodos suelen ir precedidos del prefijo get (getNombre, getValor, etcétera), por lo que muchas veces se alude coloquialmente a ellos como métodos get o getters. Los métodos get son un tipo de métodos consultores, porque sólo consultan y devuelven el valor de los atributos de un objeto.

Se suele proceder de igual forma con métodos que permitan establecer los valores de los atributos. Estos métodos suelen anteponer el prefijo set (setNombre, setValor, etcétera) por lo que muchas veces se alude coloquialmente a ellos como métodos set o setters. Los métodos set son un tipo de métodos modificadores, porque cambian el valor de los atributos de un objeto.

Ejemplo

Diagrama de bloques

Diagrama de bloques
Diagrama de bloques


Parece ser que proporcionar herramientas para establecer y obtener es esencialmente lo mismo que hacer las variables de instancia public.

Si una variable de instancia se declara como public, cualquier método que tenga una referencia a un objeto que contenga esta variable de instancia podrá leer o escribir en ella.

Si una variable de instancia se declara como private, un método set public evidentemente permite a otros métodos el acceso a la variable; pero el método set puede controlar la manera en que el cliente puede tener acceso a la variable.

Para el mismo ejemplo, se puede validar que el radio que se le asigna a un círculo nunca sea negativo modificando su setter:



Diagrama de bloques


Entonces, aunque los métodos set y get proporcionan acceso a los datos privados, el programador restringe su acceso mediante la implementación de los métodos.

Composición


Diagrama de bloques



El concepto de “composición” no fue creado para la programación; suele usarse a menudo para objetos complejos en el mundo real.

Toda criatura viviente y la mayor parte de los productos manufacturados están constituidos por partes. A menudo, cada parte es un subsistema que está integrado por su propio conjunto de sub-partes. Junto, todo el sistema forma una jerarquía de composición.

Por ejemplo

El cuerpo humano está compuesto por varios órganos: cerebro, corazón, estómago, huesos, músculos, etcétera. A su vez, cada uno de estos órganos está constituido por muchas células, y, a su vez, cada una está compuesta por muchos orgánulos, como el núcleo (el “cerebro” de una célula) y las mitocondrias (los “músculos” de una célula). Cada orgánulo está formado por muchas moléculas. Y finalmente, cada molécula orgánica está conformada por muchos átomos.

Cuando una clase A crea una referencia a una clase B en sus variables de instancia, se dice que A está compuesta por la clase B. Esta relación se denomina “relación tiene-un” y se lee como: la clase A tiene un B.

Por ejemplo

Cada cuerpo humano tiene un cerebro y tiene un corazón.

La composición es una forma de reutilización de software, donde una clase tiene como miembros referencias a objetos de otras clases.

Ejemplo

Diagrama de bloques

Diagrama de bloques
Diagrama de bloques


Diagrama de bloques



Sin embargo, se pueden modificar las clases para que no tenga que instanciarse la clase Fecha fuera de la clase Persona, lo que resulta en un mejor diseño de clases.



Diagrama de bloques

Diagrama de bloques
Diagrama de bloques


Diagrama de bloques
ícono

Actividad 1. Sistema de gestión de grupos

El encapsulamiento permite mantener oculta o controlar el acceso a la información de un objeto. En la implementación, el encapsulamiento en Java se lleva a cabo a través de los modificadores de acceso y de los métodos getters y setters.

ícono

Actividad 2. Modificación de sistema de gestión de grupos para el uso de la composición

La composición permite diseñar clases con estructuras más complejas, se puede considerar una relación “tiene un” como ejemplos: una casa “tiene un” conjunto de muebles, una casa “tiene un” número de cuartos, entre otros.

ícono

Autoevaluación. Abstracción y encapsulamiento de programación Java

La abstracción y el encapsulamiento son dos de los conceptos principales del paradigma orientado a objetos. La abstracción permite la definición de clases y el encapsulamiento, el nivel de acceso a los datos.


Fuentes de información

Barnes, D. y Kölling, M. (2007). Programación Orientada a Objetos con Java (3.a ed.). Madrid: Pearson Educación.

Dean, J. y Dean, R. (2009). Introducción a la programación con Java. México: McGraw-Hill.

Deitel, P. y Deitel, H. (2008). Cómo programar en Java (7.a ed.). México: Pearson Educación.

Joyanes, L. (2008). Fundamentos de programación. Algoritmos, estructuras de datos y objetos (4.a ed.). México: McGraw-Hill.


Cómo citar


Lozano, J. A. (2020). Abstracción y encapsulamiento. Unidades de Apoyo para el Aprendizaje. CUAIEED/Facultad de Ingeniería-UNAM. Consultado el (fecha) de (vínculo)