27
ENCAPSULAMIENTO JONATHAN SALGUERO 4 SISTEMAS PUYO – ECUADOR

Enclausulamiento java

Embed Size (px)

Citation preview

Page 1: Enclausulamiento java

ENCAPSULAMIENTOJONATHAN SALGUERO

4 SISTEMAS PUYO – ECUADOR

Page 2: Enclausulamiento java

DEFINICIÓN DE ENCAPSULAMIENTO

El encapsulamiento es la característica de autonomía de la OO. Esta característica permite generar componentes autónomos de software tomando una parte de funcionalidad y ocultando los detalles de la implementación al mundo exterior.

Los términos módulo, componente o bean se suelen utilizan en lugar de “componente encapsulado de software”.

Una vez encapsulada, una entidad de software se puede visualizar como una caja negra.

2

Interfaz

Interfaz

MensajeMensajeIn

terfa

zInterfaz

Page 3: Enclausulamiento java

INTERFAZ E IMPLEMENTACIÓN

U

na interfaz lista los servicios proporcionados por un componente. La

interfaz actúa como un contrato con el mundo exterior que define

exactamente lo que una entidad externa puede hacer con el objeto.• Una interfaz es equivalente a la API (Interfaz de Programación de

Aplicaciones) para un objeto.

L

a implementación define la manera en que un objeto proporciona

realmente un servicio. La implementación define los detalles internos

del componente. 3

Page 4: Enclausulamiento java

INTERFAZ E IMPLEMENTACIÓN: EJEMPLO

public class Log {

public void debug( String mensaje ) {

print( "DEBUG", mensaje );

}

public void info( String mensaje ) {

print( "INFO", mensaje );

}

public void warning( String mensaje ) {

print( "WARNING", mensaje );

}

public void error( String mensaje ) {

print( "ERROR", mensaje );

}

public void fatal( String mensaje ) {

print( "FATAL", mensaje );

System.exit( 0 );

}

private void print( String mensaje, String severidad ) {

System.out.println( severidad + ": " + mensaje );

}

}

4

Page 5: Enclausulamiento java

INTERFAZ E IMPLEMENTACIÓN:EJEMPLO

La clase Log da a sus objetos una forma para enviar mensajes de depuración, informativos, de advertencia y de error durante la ejecución.

La interfaz pública de Log contiene estos métodos:

public void debug ( String mensaje )

public void info ( String mensaje )

public void warning ( Sting mensaje )

public void error ( String mensaje )

public void fatal ( String mensaje )

Todo lo demás en la definición de la clase Log, aparte de estos cinco métodos, es implementación.

La implementación define el cómo se realiza algo. Pero, la interfaz oculta completamente el cómo, en vez de ello, define un contrato con el mundo exterior.

5

Page 6: Enclausulamiento java

INTERFAZ E IMPLEMENTACIÓN:EJEMPLO

Lo importante es lo que la interfaz no dice. Estos métodos

public void degub ( String mensaje )

public void info ( String mensaje )

public void warning ( Sting mensaje )

public void error ( String mensaje )

public void fatal ( String mensaje )

no indican que se va a imprimir un mensaje en la pantalla.L

a implementación se encarga de decidir qué hacer con el mensaje. La implementación podría enviar el mensaje a la pantalla, descargarlo a un archivo, escribirlo en una base de datos o enviarlo a un cliente de monitoreo de red.

6

Page 7: Enclausulamiento java

INTERFAZ E IMPLEMENTACIÓN:EJEMPLO

La interfaz pública no contiene

private void print ( String mensaje, String severidad )

pues el objeto Log restringe el acceso a print () para sí mismo.T

res niveles de acceso:• Public: Permite acceso a todos los objetos.• Protected: Permite acceso a la instancia y a cualquiera de las

subclases.• Private: Sólo permite acceso a la instancia.

Un comportamiento que se quiera poner a disposición del mundo exterior debe tener acceso público. Por el contrario, lo que se desee ocultar del mundo exterior debe tener acceso protegido o privado.

7

Page 8: Enclausulamiento java

CARACTERÍSTICAS DE UN ENCAPSULAMIENTO EFICAZ

U

n encapsulamiento eficaz permite escribir componentes autónomos de software.

L

as tres características de un encapsulamiento eficaz son:• Abstracción.• Ocultamiento de la implementación.• División de la responsabilidad.

8

Page 9: Enclausulamiento java

ABSTRACCIÓNL

a abstracción es el proceso de simplificar un problema complejo. L

a abstracción permite resolver un problema una vez y utilizar la solución posteriormente en todo el dominio del problema.

Ejemplo 1

• Imaginemos una cola de personas ante un cajero en un banco.• Tan pronto como el cajero está listo, la primera persona de la cola avanza a la

ventanilla.• La gente mantiene este orden: primero en entrar, primero en salir.

Ejemplo 2

• Consideremos un establecimiento de venta rápida de hamburguesas.• Conforme una hamburguesa llega al final de la banda transportadora, es colocada tras

la última hamburguesa por preparar.• Así, la primera hamburguesa que se toma es también la primera que se preparó.

Ambos dominios son un ejemplo de una cola primero en entrar, primero en salir (orden de elementos tipo FIFO).

9Entrada Salida

Page 10: Enclausulamiento java

OCULTAMIENTO DE LA IMPLEMENTACIÓN

E

l ocultamiento de la implementación presenta dos beneficios:• Proteger al objeto de los usuarios.

• Mediante los Tipos Abstractos de Datos.

• Proteger a sus usuarios del objeto.• Mediante la utilización de código moderadamente ligado.

10

Page 11: Enclausulamiento java

TIPOS ABSTRACTOS DE DATOS

U

n Tipo Abstracto de Dato (TDA) es un conjunto de datos y un

conjunto de operaciones que se realizan con esos datos.

L

os TDA permiten definir nuevos tipos del lenguaje mediante el

ocultamiento de los datos internos y el estado en una interfaz

bien definida. Esta interfaz presenta al TDA como una sola

unidad indivisible.

L

a creación de la clase Articulo de la Lección 1 añade un nuevo

tipo de dato.

A

continuación, vamos a ver un ejemplo de esta misma clase pero

sin encapsular.

11

Page 12: Enclausulamiento java

ARTICULOSINENCAPSULAR.JAVA

p

ublic class ArticuloSinEncapsular {

public double precio_unitario;

public double descuento; // porcentaje de descuento que se aplicará al precio

public int cantidad;

public String descripcion;

public String id;

public ArticuloSinEncapsular( String id, String descripcion, int cantidad, double precio ) {

this.id = id;

this.descripcion = descripcion;

if ( cantidad >= 0 )

this.cantidad = cantidad;

else

this.cantidad = 0;

this.precio_unitario = precio;

}

….

}

12

Page 13: Enclausulamiento java

ARTICULOSINENCAPSULAR.JAVA

T

odas los atributos son públicos.

¿

Qué pasaría si alguien escribiera el siguiente programa:

EjemploArticuloSinEncapsular.java, donde se crean objetos de la

nueva clase Articulo?

13

Page 14: Enclausulamiento java

EJEMPLOARTICULOSINENCAPSULAR.JAVA

public class EjemploArticuloSinEncapsular extends Object {

public static void main( String [] args ) {

ArticuloSinEncapsular monitor = new ArticuloSinEncapsular( "electrónicos-012", "Monitor SVGA de 17\"", 1, 2500.00 );

monitor.descuento = 1.25; // inválido, ¡el descuento debe ser menor a 100%!

double precio = monitor.getTotalAjustado();

System.out.println( "Total incorrecto: " + precio + “ € ");

monitor.setDescuento( 1.25 ); // inválido

// no obstante, el monitor atrapará el error

precio = monitor.getTotalAjustado();

System.out.println( "Total correcto: " + precio + “ € ");

}

}

14

Page 15: Enclausulamiento java

EJEMPLOARTICULOSINENCAPSULAR.JAVA

E

l resultado de la ejecución es el siguiente:

Total incorrecto: -625.0 €

Total correcto: 2500.0 €

Process exited with exit code 0.

S

e crea un objeto de la clase ArticuloSinEncapsular y se aplica un

descuento inválido. Por tanto, el resultado es un precio ajustado

erróneo.

15

Page 16: Enclausulamiento java

¿CÓMO PROTEGER A LOS USUARIOS MEDIANTE EL OCULTAMIENTO DE LA

IMPLEMENTACIÓN?

E

l ocultamiento de la implementación conduce a un diseño más

flexible porque evita que los usuarios del objeto dependan

estrechamente de la implementación del objeto.

A

sí, el ocultamiento de la implementación no sólo protege al

objeto, sino también a aquellos que lo utilizan pues fomenta la

creación de código moderadamente ligado al objeto.• El código moderadamente ligado es independiente de la implementación

de otros componentes.• El código estrechamente ligado depende intensamente de la

implementación de otros componentes.

16

Page 17: Enclausulamiento java

¿CÓMO PROTEGER A LOS USUARIOS MEDIANTE EL OCULTAMIENTO DE LA

IMPLEMENTACIÓN?E

l encapsulamiento y el ocultamiento de la implementación no son mágicos. Si se realizan cambios en una interfaz, será necesario actualizar el código dependiente de esa interfaz. Mediante el ocultamiento de los detalles y la escritura de software para una interfaz, se crea código moderadamente ligado.

El código estrechamente ligado choca con el propósito del encapsulamiento: crear objetos independientes y reutilizables.

17

Page 18: Enclausulamiento java

EJEMPLO DE OCULTAMIENTO DE LA

IMPLEMENTACIÓNp

ublic class Cliente {

// ... diversos métodos para el cliente ...

public Articulo [] articulos; // este arreglo contiene cualquier artículo seleccionado}

------------------------------------------------------------------------------------------------------------------------

...

public static void main ( String [] args ) {

Cliente cliente = new Cliente();

// … elige algunos artículos …

// asigna precio a los artículos

double total = 0.0;

for (int i = 0; i < cliente.articulos.length; i++) {

Articulo articulo = cliente.articulos[i]:

total = total + articulo.getTotalAjustado();

}

}

18

Page 19: Enclausulamiento java

EJEMPLO DE OCULTAMIENTO DE LA

IMPLEMENTACIÓNE

l método main() toma un cliente, agrega algunos artículos y da el total del pedido. Aquí, el arreglo Articulo forma parte de la interfaz externa de Cliente.

Todo funciona, pero ¿qué pasa si deseamos cambiar la forma en que el cliente selecciona los artículos?

Supongamos que queremos agregar la clase Canasta. Si esto modifica la implementación, tendremos que actualizar todo el código que accede directamente al arreglo Articulo.

En el ejemplo anterior en la clase Cliente se debe hacer privado el arreglo Articulo, y dar acceso a los artículos a través de accesores.

19

Page 20: Enclausulamiento java

DIVISIÓN DE LA RESPONSABILIDAD

Para generar código moderadamente desligado, hay que contar con una división apropiada de la responsabilidad.

El ocultamiento de la implementación y la responsabilidad van de la mano.

Un objeto tiene la responsabilidad de saber cómo llevar a cabo su trabajo.

Si la implementación se deja abierta a todo el mundo exterior, un usuario podría empezar a actuar sobre ella, duplicando en consecuencia la responsabilidad. 20

Page 21: Enclausulamiento java

ARTICULODEFECTUOSO.JAVA

public class ArticuloDefectuoso {

private double precio_unitario;

private double precio_ajustado;

private double descuento; // porcentaje de descuento que se aplicará al precio

private int cantidad;

private String descripcion;

private String id;

public ArticuloDefectuoso( String id, String descripcion, int cantidad, double precio ) {

this.id = id;

this.descripcion = descripcion;

if ( cantidad >= 0 )

this.cantidad = cantidad;

else

this.cantidad = 0;

this. precio_unitario = precio;

}

21

Page 22: Enclausulamiento java

ARTICULODEFECTUOSO.JAVA

public double getPrecioUnitario () {

return precio_unitario;

}

// aplica un porcentaje de descuento al precio

public void setDescuento( double descuento ) {

if( descuento <= 1.00 ) {

this.descuento = descuento;

}

}

public double getDescuento() {

return descuento;

}

public int getCantidad() {

return cantidad;

}

public void setCantidad ( int cantidad ) {

this.cantidad = cantidad;

}

22

Page 23: Enclausulamiento java

ARTICULODEFECTUOSO.JAVA

public String getIDProducto() {

return id;

}

public String getDescripcion() {

return descripcion;

}

public double getPrecioAjustado() {

return precio_ajustado;

}

public void setPrecioAjustado ( double precio) {

precio_ajustado = precio;

}

}

23

Page 24: Enclausulamiento java

ARTICULODEFECTUOSO.JAVA

A

rticuloDefectuoso.java ya no contiene la responsabilidad de

calcular el precio ajustado.

¿

Entonces cómo generará un precio ajustado?

C

onsideremos el siguiente programa:

EjemploArticuloDefectuoso.java.24

Page 25: Enclausulamiento java

EJEMPLOARTICULODEFECTUOSO.JAVA

public class EjemploArticuloDefectuoso extends Object {

public static void main( String [] args ) {

// crea los artículos

ArticuloDefectuoso leche = new ArticuloDefectuoso( "lácteos-011", "1 Litro de leche", 2, 2.50 );

// aplica cupones

leche.setDescuento( 0.15 );

// obtiene precios ajustados

double precio_leche = leche.getCantidad() * leche.getPrecioUnitario();

double descuento_leche = leche.getDescuento() * precio_leche;

leche.setPrecioAjustado( precio_leche - descuento_leche );

System.out.println( "Su leche cuesta: " + leche.getPrecioAjustado() + " € " );

}

}

25

Page 26: Enclausulamiento java

EJEMPLOARTICULODEFECTUOSO.JAVA

C

uando trabajamos con objetos que no dividen apropiadamente la responsabilidad, al final

lo que tenemos es código procedural orientado a datos.

E

l método main() para calcular el precio ajustado es propio de la programación

procedural. Hay que indicar paso a paso al objeto leche lo que debe hacer.

26

Page 27: Enclausulamiento java

MEJOR DEFINICIÓN DE ENCAPSULAMIENTO

El encapsulamiento eficaz se compone de:

• Abstracción más• Ocultamiento de la implementación más• Responsabilidad.

Si eliminamos

• La abstracción, el rdo será código no reutilizable.• El ocultamiento de la implementación, el rdo será código frágil y

estrechamente ligado.• La responsabilidad, el rdo será código orientado a datos y con una

lista de procedimientos (procedural).

27