03/02/031 Estrategias de Comunicación para Implementar un Diseño en Java Artur Boronat Moll...

Post on 11-Apr-2015

105 views 1 download

Transcript of 03/02/031 Estrategias de Comunicación para Implementar un Diseño en Java Artur Boronat Moll...

03/02/03 1

Estrategias de Comunicación Estrategias de Comunicación para Implementar un Diseño para Implementar un Diseño

en Javaen Java

Artur Boronat Moll

Laboratorio de Sistemas de Información

Facultad de InformáticaUniversidad Politécnica de Valencia

03/02/03 2

Introducción (I)Introducción (I)

Objetivo: Implementar el diseño de un sistema usando un lenguaje OO (java)

Modalidades: acoplamiento normal (por datos) acoplamiento común (vbles globales) cluster de información

03/02/03 3

Introducción (II)Introducción (II)

Dos aproximaciones: A partir de un diseño estructurado (procedural) A partir de un diseño OO

03/02/03 4

COORDINADOR

PREPRODUCTOR PRECONSUMIDOR

PRODUCTOR

(obtiene una cadena del usuario)

CONSUMIDOR(muestra por pantalla

la información introducida)

SISTEMA

Introducción (III)Introducción (III)

03/02/03 5

APROXIMACIÓN APROXIMACIÓN ESTRUCTURADAESTRUCTURADA

Acoplamiento normal Acoplamiento común Cluster de información

03/02/03 6

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA (1.1) Acoplamiento Normal(1.1) Acoplamiento Normal

Acoplamiento normal

COORDINADOR

PREPRODUCTOR PRECONSUMIDOR

PRODUCTOR

(obtiene una cadena del usuario)

CONSUMIDOR(muestra por pantalla

la información introducida)

dato

dato dato

dato

03/02/03 7

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA

(1.2) Acoplamiento Normal(1.2) Acoplamiento Normal import java.lang.System;import java.io.InputStreamReader;import java.io.BufferedReader;import java.io.IOException;

public class DProcParam { /* Diseño procedural: acoplamiento normal (por datos) */ public static String preProductor() throws

IOException { // Llama al módulo de creación del dato return productor(); }

...

03/02/03 8

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA (1.3) Acoplamiento Normal(1.3) Acoplamiento Normal

...public static String productor() throws IOException { // Lee un dato introducido por el usuario BufferedReader keyboardInput; // Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido keyboardInput = new BufferedReader(new

InputStreamReader(System.in)); return keyboardInput.readLine(); } ...

03/02/03 9

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA (1.4) Acoplamiento Normal(1.4) Acoplamiento Normal

... public static void preConsumidor( String dato ) { // Llama al módulo que muestra el dato consumidor( dato ); }

public static void consumidor( String dato ) { // Muestra el dato por pantalla System.out.println( "La cadena introducida es: " +

dato ); } ...

03/02/03 10

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA (1.5) Acoplamiento Normal(1.5) Acoplamiento Normal

... public static void main( String args[] ) throws

IOException { // Actua de módulo coordinador String dato = preProductor(); preConsumidor( dato ); }}

03/02/03 11

APROXIMACIÓN ESTRUCTURADA APROXIMACIÓN ESTRUCTURADA (1.6) Acoplamiento Normal(1.6) Acoplamiento Normal

Inconvenientes: Flujo de datos vagabundos

Observación: si se quisiera devolver más de un parámetro del mismo tipo: devolver vector de elementos de diferente tipo: diferentes métodos de

obtención estáticos

03/02/03 12

Aprox. Estructurada (2.1)Aprox. Estructurada (2.1)Acoplamiento comunAcoplamiento comun

Acoplamiento común (vbles globales)

COORDINADOR

PREPRODUCTOR PRECONSUMIDOR

PRODUCTOR

(obtiene una cadena del usuario)

CONSUMIDOR(muestra por pantalla

la información introducida)

dato

03/02/03 13

Aprox. Estructurada (2.2)Aprox. Estructurada (2.2)Acoplamiento comunAcoplamiento comun

public class DProcGlobal { /* Diseño procedural: acoplamiento común o por variables globales */ public static String dato;

public static void preProductor() throws IOException { // Llama al módulo de creación del dato productor(); }...

03/02/03 14

Aprox. Estructurada (2.1)Aprox. Estructurada (2.1)Acoplamiento comunAcoplamiento comun

... public static void productor() throws IOException { // Lee un dato introducido por el usuario

// Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido BufferedReader keyboardInput = new BufferedReader

(new InputStreamReader(System.in)); dato = keyboardInput.readLine(); } ...

03/02/03 15

Aprox. Estructurada (2.4)Aprox. Estructurada (2.4)Acoplamiento comunAcoplamiento comun

... public static void preConsumidor() { // Llama al módulo que muestra el dato consumidor(); }

public static void consumidor() { // Muestra el dato por pantalla System.out.println( "La cadena introducida es: " + dato ); }...

03/02/03 16

Aprox. Estructurada (2.5)Aprox. Estructurada (2.5)Acoplamiento comunAcoplamiento comun

... public static void main( String args[] ) throws IOException { // Actua de módulo coordinador preProductor(); preConsumidor(); }}

03/02/03 17

Aprox. Estructurada (2.6)Aprox. Estructurada (2.6)Acoplamiento comunAcoplamiento comun

Ventajas: Se elimina el flujo de datos vagabundos

Inconvenientes: Acoplamiento global prescindible

03/02/03 18

Aproximación Estructurada (3.2)Aproximación Estructurada (3.2)Cluster de informaciónCluster de información

Cluster (cúmulo) de información

COORDINADOR

PREPRODUCTOR PRECONSUMIDOR

PRODUCTOR CONSUMIDOR

dato

Inicializar Dato

Obtener Dato

dato dato

03/02/03 19

Aproximación Estructurada (3.2)Aproximación Estructurada (3.2)Cluster de informaciónCluster de información

public class DProcCluster { /* Diseño procedural: cúmulo (cluster) de información */

public static void preProductor() throws IOException { // Llama al módulo de creación del dato productor(); }

...

03/02/03 20

Aproximación Estructurada (3.3)Aproximación Estructurada (3.3)Cluster de informaciónCluster de información...

public static void productor() throws IOException { // Lee un dato introducido por el usuario String dato_local; // Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido BufferedReader keyboardInput = new BufferedReader

(new InputStreamReader(System.in)); dato_local = keyboardInput.readLine(); //almacenamos el dato en el cluster ProcCluster.setDato( dato_local ); } ...

03/02/03 21

Aproximación Estructurada (3.4)Aproximación Estructurada (3.4)Cluster de informaciónCluster de información

... public static void preConsumidor() { // Llama al módulo que muestra el dato consumidor(); }

public static void consumidor() { // Muestra la información por pantalla System.out.println( "La cadena introducida es: " +

ProcCluster.getDato() ); }

...

03/02/03 22

Aproximación Estructurada (3.5)Aproximación Estructurada (3.5)Cluster de informaciónCluster de información

... public static void main( String args[] ) throws IOException { // Actua de módulo coordinador preProductor(); preConsumidor(); }} //fin clase DProcCluster...

03/02/03 23

Aproximación Estructurada (3.6)Aproximación Estructurada (3.6)Cluster de informaciónCluster de información

... class ProcCluster { private static String dato;

public static void setDato( String nuevoDato ) { dato = nuevoDato; }

public static String getDato() { return dato; }} // fin clase ProcCluster

03/02/03 24

Aproximación Estructurada (3.7)Aproximación Estructurada (3.7)Cluster de informaciónCluster de información

Ventajas No hay flujos de datos vagabundos Buen acoplamiento

03/02/03 25

APROXIMACIÓN ORIENTADA A OBJETOS APROXIMACIÓN ORIENTADA A OBJETOS (1.1)(1.1)

Acoplamiento normal Acoplamiento común Cluster de información

03/02/03 26

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.1) Acoplamiento normalOBJETOS (1.1) Acoplamiento normal

Diagrama de clases

PRODUCTOR

- dato

+ preProducir( ): String- producir( )

CONSUMIDOR

- dato

+ preConsumir (dato: String)- consumir( )

COORDINADOR

+ coordinar( )

1

1

1

1

03/02/03 27

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.2) Acoplamiento normalOBJETOS (1.2) Acoplamiento normal

Interacción entre objetos

preProducir

producir

PRODUCTOR

preConsumir

consumir

CONSUMIDOR

coordinar

COORDINADOR

dato

dato

03/02/03 28

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.3) Acoplamiento normalOBJETOS (1.3) Acoplamiento normal

Diagrama de secuencia

03/02/03 29

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.4) Acoplamiento normalOBJETOS (1.4) Acoplamiento normal

public class DOOParam { /* Diseño OO: acoplamiento normal (por datos) - Tercera aproximación: métodos no estáticos en las clases Productor y Consumidor, y con atributos - Clase coordinador */

public static void main( String args[] ) throws IOException { Coordinador c = new Coordinador(); c.coordinar(); }} //fin clase DOOParam

03/02/03 30

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.5) Acoplamiento normalOBJETOS (1.5) Acoplamiento normal

class Coordinador { // Clase raíz encargada de coordinar el productor y el // consumidor private Productor p; private Consumidor c;

public Coordinador() { p = new Productor( this ); c = new Consumidor( this ); }...

03/02/03 31

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.6) Acoplamiento normalOBJETOS (1.6) Acoplamiento normal

... public void coordinar() throws IOException { // Actua de módulo coordinador String dato;

dato = p.preProducir(); c.preConsumir( dato ); }} // fin clase Coordinador

03/02/03 32

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.7) Acoplamiento normalOBJETOS (1.7) Acoplamiento normal

class Productor { // Clase encargada de leer información del usuario private Coordinador coo; private String dato; public Productor( Coordinador nuevoCoo) { coo = nuevoCoo; } public String preProducir() throws IOException {

// Llama al módulo de creación del dato producir(); return dato; } ...

03/02/03 33

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.8) Acoplamiento normalOBJETOS (1.8) Acoplamiento normal

... private void producir() throws IOException {

// Lee un dato introducido por el usuario BufferedReader keyboardInput; // Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido keyboardInput = new BufferedReader (new

InputStreamReader (System.in)); dato = keyboardInput.readLine(); }} //fin clase Productor

03/02/03 34

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.9) Acoplamiento normalOBJETOS (1.9) Acoplamiento normal

class Consumidor { //Clase encargada de mostrar la información introducida por pantalla

private Coordinador coo; private String dato;

public Consumidor(Coordinador nuevoCoo) { coo = nuevoCoo; }...

03/02/03 35

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.10) Acoplamiento normalOBJETOS (1.10) Acoplamiento normal

... public void preConsumir(String dato) { // Llama al módulo que muestra el dato this.dato = dato; consumir(); } private void consumir() { // Muestra el dato por pantalla System.out.println( "La cadena introducida es: " + this.dato ); }} // fin clase Consumidor

03/02/03 36

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (1.11) Acoplamiento normalOBJETOS (1.11) Acoplamiento normal

Ventaja: No hay flujo de datos vagabundos

Observación: más de un parámetro del mismo tipo: devolver vector (en el return) diferente tipo:

pasar como parámetro la referencia al objeto (teniendo en cuenta que modificamos su estado)

si los atributos del objeto no tienen valor aún, crear una nueva instancia (desde un método estático - productor), llenarla con los datos y devolver su referencia (en el return)

03/02/03 37

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.1) Acoplamiento comunOBJETOS (2.1) Acoplamiento comun

Diagrama de clases

PRODUCTOR

+ preProducir( )- producir( )

CONSUMIDOR

+ preConsumir ( )- consumir( )

COORDINADOR

+ coordinar( )

1

1

1

1

+ dato

03/02/03 38

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.2) Acoplamiento comunOBJETOS (2.2) Acoplamiento comun

Interacción entre objetos

dato

preProducir

producir

PRODUCTOR

preConsumir

consumir

CONSUMIDOR

coordinar

COORDINADOR

03/02/03 39

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.3) Acoplamiento comunOBJETOS (2.3) Acoplamiento comun

Diagrama de secuencia

03/02/03 40

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.4) Acoplamiento comunOBJETOS (2.4) Acoplamiento comun

class CoordinadorGlobal { private ProductorGlobal p; private ConsumidorGlobal c; public String dato; public CoordinadorGlobal() { p = new ProductorGlobal( this ); c = new ConsumidorGlobal( this ); } public void coordinar() throws IOException { p.preProducir(); c.preConsumir(); }} // fin clase CoordinadorGlobal

03/02/03 41

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.5) Acoplamiento comunOBJETOS (2.5) Acoplamiento comun

class ProductorGlobal { // Clase encargada de leer información del usuario private CoordinadorGlobal coo;

public ProductorGlobal( CoordinadorGlobal nuevoCoo) { coo = nuevoCoo; }

public void preProducir() throws IOException { // Llama al módulo de creación del dato producir(); } ...

03/02/03 42

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.6) Acoplamiento comunOBJETOS (2.6) Acoplamiento comun

... private void producir() throws IOException { // Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido BufferedReader keyboardInput = new BufferedReader

(new InputStreamReader(System.in)); coo.dato = keyboardInput.readLine(); }} //fin clase ProductorGlobal

03/02/03 43

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.7) Acoplamiento comunOBJETOS (2.7) Acoplamiento comun

class ConsumidorGlobal { //Clase encargada de mostrar la información introducida por pantalla private CoordinadorGlobal coo;

public ConsumidorGlobal(CoordinadorGlobal nuevoCoo) { coo = nuevoCoo; }...

03/02/03 44

APROXIMACIÓN ORIENTADA A APROXIMACIÓN ORIENTADA A OBJETOS (2.8) Acoplamiento comunOBJETOS (2.8) Acoplamiento comun

... public void preConsumir () { // Llama al módulo que muestra el dato consumir(); }

private void consumir() { // Muestra el dato por pantalla System.out.println( "La cadena introducida es: " + coo.dato ); }} // fin clase ConsumidorGlobal

03/02/03 45

Aproximación OO (3.1)Aproximación OO (3.1)Cluster de informaciónCluster de información

Diagrama de clases

1 1

PRODUCTOR

+ preProducir( )- producir( )

CONSUMIDOR

+ preConsumir ( )- consumir( )

COORDINADOR

+ coordinar( )

11

CLUSTER

+ setDato(String dato)+ getDato: String

- dato

1

1 1

1

03/02/03 46

Aproximación OO (3.2)Aproximación OO (3.2)Cluster de informaciónCluster de información

Interacción entre objetos

preProducir

producir

PRODUCTOR

preConsumir

consumir

CONSUMIDOR

coordinar

COORDINADOR

dato

datosetDato

getDato

CLUSTER

03/02/03 47

Aproximación OO (3.3)Aproximación OO (3.3)Cluster de informaciónCluster de información

Diagrama de secuencia

03/02/03 48

Aproximación OO (3.4)Aproximación OO (3.4)Cluster de informaciónCluster de información

class ProductorCluster { // Clase encargada de leer información del usuario private CoordinadorCluster coo;

public ProductorCluster( CoordinadorCluster nuevoCoo) { coo = nuevoCoo; }

public void preProducir() throws IOException { // Llama al módulo de creación del dato producir(); } ...

03/02/03 49

Aproximación OO (3.5)Aproximación OO (3.5)Cluster de informaciónCluster de información

... private void producir() throws IOException { // Se pide al usuario que introduzca una cadena System.out.print("Escribe una cadena: "); System.out.flush(); // Se lee el dato introducido BufferedReader keyboardInput = new BufferedReader

(new InputStreamReader(System.in)); //Guardamos la información en el cluster OOCluster.setDato( keyboardInput.readLine() ); }} // fin clase ProductorCluster

03/02/03 50

Aproximación OO (3.6)Aproximación OO (3.6)Cluster de informaciónCluster de información

class ConsumidorCluster { //Clase encargada de mostrar la información introducida //por pantalla

private CoordinadorCluster coo;

public ConsumidorCluster(CoordinadorCluster nuevoCoo) { coo = nuevoCoo; } ...

03/02/03 51

Aproximación OO (3.7)Aproximación OO (3.7)Cluster de informaciónCluster de información

... public void preConsumir() { // Llama al módulo que muestra el dato consumir(); }

private void consumir() { // Muestra el dato por pantalla System.out.println( "La cadena introducida es: " +

OOCluster.getDato() ); }} // fin clase ConsumidorCluster

03/02/03 52

Aproximación OO (3.8)Aproximación OO (3.8)Cluster de informaciónCluster de información

class OOCluster {

private static String dato;

public static void setDato( String nuevoDato ) { dato = nuevoDato; }

public static String getDato() { return dato; }} // fin clase ProcCluster

03/02/03 53

ConclusionesConclusiones

Java (como otros lenguajes) permite diferentes enfoques de programación (OO y/o procedural)

Es importante evaluar las alternativas de comunicación mediante el diseño (previo a la codificación)