Capitulo 7 – Herencia de Clases (Parte III)

Buenas tardes, hoy en la Parte III del Capitulo 7 veremos la Encapsulación, cual es su uso, como se usa y su objetivo final.

Encapsulation

En esta parte aprenderemos a describir la ocultación de la información (usando atributos privados y métodos privados), la encapsulación, y exponer la funcionalidad de objetos usando métodos públicos; y describir las convenciones JavaBeans para los métodos setter y getter.

La encapsulación es un concepto de almacenamiento de datos con los métodos que operan con esa información. Los objetos son usados como contenedores de la información y del código. Aquí discutiremos los principios de la encapsulación y como se aplicaría como desarrollador.
La encapsulación permite esconder métodos y datos. Este conecpto es llamado “Ocultación de los datos”. Esto hace que sea posible exponer una interface pública mientras que se esconden los detalles de la implementación. Finalmente exploraremos las convenciones JavaBeans para crear métodos setter y getter. Esto son métodos usados para leer y mostrar propiedades de un objeto java.

Good Design With Encapsulation

La teoría fundamental de un lenguaje orientado a objetos es que el software es diseñado creando objetos discretos que interactúan para hacer funcionalidad en la aplicación. La encapsulación es el concepto de almacenar información y métodos juntos en clases discretas. En la mayoría de lenguajes no orientados a objetos no hay asociación entre donde están los datos y donde está el código.
Esto puede incrementar la complejidad del mantenimiento del código porque a menudo las variables que usa el código están separadas del código base. Los bugs en el código pueden ser dificiles de encontrar y de resolver debido a los procedimientos remotos que usan las mismas variables.
La encapsulación intenta solventar estos problemas. Esto crea un código fácil de leer y código mas facil de mantener agrupando variables relacionadas y métodos en las clases. El software orientado a objetos es muy modular, y la encapsulación es el término usado para crear estos módulos.
Una clase bien encapsulada es aquella que tiene un porpósito singular y limpio. Esta clase contendría los métodos y variables que son necesarios para cumplir su propósito. Por ejemplo, si una clase fuera destinada a representar una televisión, debería contener variables como “currentChannel”, “volume”, y “isPoweredOn”. Una clase Television no debería contener métodos como playDVD(), esto debería ser contenido en una clase DVD separada.
La encapsulación trata sobre crear clases bien definidas que tienen un prpósito limpio. Estas clases contienen toda la información y métodos necesarias para realizar sus funciones a las que ha sido destinada.
La encapsulación se define ligeramente de manera diferente según la fuente. A veces se la define como la manera de reunir la información y sus métodos en una clase. Otras fuentes lo definirán como la ocultación de información y detalles de implementación.

Access Modifiers

Es la palabra clave que define que puede tener acceso a los métodos o instance variables. Hay 3 modificadores de acceso que son: private, protected y public. Todos ellos cambian el nivel de acceso por defenco. El nivel de acceso por defecto no usa ninguna palabra clave ni a un método ni a una instance variable cuando ni private, ni protected ni public es usado, y la área se deja en blanco. Los modificadores de acceso son un importante concepto en los lenguajes orientados a objetos. Esto provee o permite que los detalles de la implementación están escondidas en una clase. El desarrollador puede elegir especificamente que partes de la clase son accesibles a otros objetos.
La mayoría de ejemplos que usamos desde el principio usan el nivel de acceso por defenco. Los puntos que veremos a continuación serán cubiertos en las siguientes subsecciones:

  • The access Modifiers
  • Information Hiding
  • Exposing subject functionality
-The Access Modifiers

Java tiene 3 modificadores de acceso: private, protected y public. Hay tambien un nivel de acceso por defecto, que es conocido como package-private. Cada nivel de acceso tiene diferentes restricciones que premiten o deniegan a otras clases el acceso a métodos o instance variables. Tambien se pueden aplicar los modificadores de acceso cuando se define una clase. El compilador de Java producirá un error si un método restringido o instance variable restringida son accedidas por código no autorizado.

El modificador de acceso private es el mas restrictivo, y uno de los mas comunes. Cualquier método o instance variable que esté marcada como private solo peude ser accedida por otros métodos de la misma clase. Las subclases no pueden tener acceso a las instance variables o métodos que son private.
Lo siguiente es un ejemplo del modificador private siendo usado:

  private int numberOfPoiunts;
  private int calculateAverage(){}

El modificador de acceso por defecto es el segundo mas restrictivo. Es a menudo conocido como package-private. Este nivel de acceso permite acceso a todos sus métodos e instance variables del código que esté en el mismo package. No tiene ninguna palabra clave que indique su uso. Un método o instance variable se establece por defecto cuando el modificador de acceso es emitido. Lo siguiente es un ejemplo de este modificador de acceso:

  int maxSpeed;
  float calculateAcceleration(){}

El modificador de acceso protected es el tercero mas restrictivo. Es casi igual que el método de acceso por defecto pero añade la habilidad a las subclases fuera del paquete a acceder a sus métodos y variables. Esto significa que el método que puede tener acceso a esta información debe estar en el mismo package o estar en una subclase de la clase que contiene los datos protected. Recordemos que una subclase es una clase que es extendida por otra. Lo siguiente es un ejemplo del uso del modificador de acceso protected:

  protected booleanactive;
  protected getFirstChar(){}

El último modificador de acceso es el public. Este es el menos restrictivo y el segundo modificador de acceso mas común. El modificador de acceso public no provee restricción sobre que puede tener acceso a los métodos e instance variables. Cualquier método puede tener acceso a un método público o instance variable sin tener en cuenta que tipo de package esta conteniendo o que superclase es extendida. Un item marcado como public es accesible por todo el mundo. Lo siguiente es un ejemplo del uso del modificador de acceso public:

  public int streetAddress;
  public int findZipCode(){}
-Information Hiding

Es el concepto de esconder los detalels de la implementación de una clase. esto se logra usando modificadores de acceso para el uso restrictivo. El avance de esconder información es porque el desarrollador puede controlar como es accedida la información.
Las instance variables son usadas para almacenar ele stado de un objeto. Si se permitiera que objetos de fuera tuvieran acceso a todo el set completo de instance variables, el riesgo de introducir bugs sería incrementado. Un desarrollador puede crear una nueva clase que intente usar de manera incorrecta las características internas de otra clase. Incluso si este enfoque funcionara a la primera, esto requiere que la estructura de los datos interna de la clase no cambiaran. Este concpto tambien se aplica a los métodos. No todos los métodos deberían ser accesibles por clases externas. A menudo una de clase estará compuesta por mas métodos usados internamente para realizar tareas que por métodos diseñados para objetos externos.

-Exposing Object Functionality

Una vez que todos los detalles internos de la implementación están ocultas, la clase debe tener un set de métodos públicos que exponeen su funcionalidad a otros objetos. En la mayoría de las clases, todos las instance variables usarán el modificador de acceso private. Los métodos public serán lo súnicos métodos requeridos que otras clases pueden usar. Cualquier método usado internamente y no sea requerido por una clase externa no debería ser public. Los métodos que son públicos pueden ser comparados con los botones que hay en la parte exterior de una redio. Solo hay unos pocos pero permiten que la radio sea controlada. Sin embargo, dentro de la radio hay muchos cables y controles que no deberían ser alterados y no necesiran ser alterados para controlr la radio. Los botones de fuera serían como los métodos public, mientras que los componentes internos son como los métodos private y las instance variables.
Anteriormente en este capítulo hablamos sobre las interfaces. Si una clase implementa una interface, requiere implementar cada método en la interface como público. Son interfaces porque representan la interface que otras clases deben usar para trabajar con esta clase. Los métodos públicos de cualquier clase puede ser pensada como una interface de la clase. Los objetos externos no tienen conocimiento sobre los detalles fundamentales de la clase. Solo pueden ver y usar los interfaces públicas que el objeto les presenta.

Setters and getters

Los setters y getters son el concepto final sobre la ocultación de información y encapsulación. Como discutimos previamente, es buen diseño hacer todas las instance variabbles como private. Esto significa que las clases externas no tienen manera de acceder a estas variables. Algunas veces un objeto externo puede necesitar leer un valor de estas variables para determinar su estado, o puede necesitar establecer un valor. Para lograr esto, se crea un método público para que se peuda coger oe stablecer un valor. Estos son llamados getters y setters. Pueden ser tan simples como unas pocas lineas que establecen un valor o retornar una variable. El siguiente ejemplo es una clase que tiene una instance variable y un setter y un getter:

public class ScoreBoard{
  private int score;
  public int getScore(){
    return this.score;
  }
  public void setScore(int score){
    this.score = score;
  }
}

En este ejemplo vemos que hay una instance variable con acceso private, llamada score. Los 2 métodos que se presentan son un getter y un setter para la variable score. En este caso, la clase está dando acceso de lectura y escritura a la variable a través de estos métodos. En algunos casos, una clase puede tener uno o el otro. El getter y setter en el ejemplo es simple y solo establece o retorna un valor.
SIn embargo, si la clase tuviera que realizar una acción cada vez que la variable score fuera cambiada, esto podría realizarse desde el setter. Por ejemplo, cada vez que la puntuación cambiara, la clase debería grabarla en un log. Esto puede hacerse bien y correctamente con un setter. Esto es el beneficio de mantener las variables como private. Esto da el control a la clase de como una instance variable debe ser accedida.
Los getter y setter son maneras estándar de crear acceso a una instance variable de una clase. Cuando los desarrolladores están trabajando en una clase, estos esperan encontrar getters y setters. Cuando se crea un getter, el nombre debería empezar con un ‘get’ en letras minusculas, seguido del nombre de la variable sin espacios y la primera letra en mayuscula. La única excepción a esto es cuando un valor booleano es retornado. Ene ste caso, env ez de usar ‘get, se usa ‘is’ con la mismas reglas aplicadas al nombre de la variable. Cuando se crea un setter, se sigue una misma convención. El setter debería empezar con la palabra ‘set’, seguido del nombre de la variable con la primera letra en mayúscula.

Variable Type and Name Getter and Setter Name
int boatNumber public int getBoatNumber()

public void setBoatNumber(int boatnumber)
boolean boatRunning public boolean isBoatRunning()

public void setBoatRunning(boolean boatrunning)
Object position public Object getPosition

public void setPosition(Object Position)

Y hasta aquí el tema de la encapsulación, espero que haya servido para empaparse bien para que se usa, como se usa, cual es su finalidad y la nomenclatura idónea para los métodos setter y getter.

Mañana pongo la última parte de este Cpaítulo, en el que se verán ejemplos avanzados sobre lo dado en este Capitulo 7, perfecto para ver todo esto llevado a la práctica.

Cualquier corrección o aporte es bienvenido.

Saludos!!!