43
Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java DIAGRAMA DE CLASES Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenimiento. Un diagrama de clases esta compuesto por los siguientes elementos: Clase: atributos, métodos y visibilidad. Relaciones: Herencia, Composición, Agregación, Asociación y Uso. Elementos Clase Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.). En UML, una clase es representada por un rectángulo que posee tres divisiones: Nombre de la Clase Atributos Operaciones En donde: Superior: Contiene el nombre de la Clase Intermedio: Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public). Inferior: Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public). Cortez Alberto

Ing Directa Cortez 2009

Embed Size (px)

DESCRIPTION

Apunte del profesor Alberto Cortez - Cátedra: Programación 2 - Universidad Tecnologica Nacional - Facultad Regional Mendoza

Citation preview

Page 1: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

DIAGRAMA DE CLASES

Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser asociativas, de herencia, de uso y de contenimiento.

Un diagrama de clases esta compuesto por los siguientes elementos:

Clase: atributos, métodos y visibilidad. Relaciones: Herencia, Composición, Agregación, Asociación y Uso.

Elementos

Clase

Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.).

En UML, una clase es representada por un rectángulo que posee tres divisiones:

Nombre de la ClaseAtributosOperaciones

En donde:

Superior: Contiene el nombre de la Clase Intermedio: Contiene los atributos (o variables de instancia) que

caracterizan a la Clase (pueden ser private, protected o public). Inferior: Contiene los métodos u operaciones, los cuales son la forma como

interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public).

Fundamentos de la Asociación

Cortez Alberto

Page 2: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro.

Ejemplo de Asociación unidireccional 1 a 1 navegable desde Persona hacia DomicilioUna persona tiene un domicilio

Especifica la navegación de la relación en un solo sentido entre las clases conectadas. La clase hacia donde se dirige la navegación de la relación se convierte en una variable de instancia de la clase que da origen a la relación.Una persona tiene 1 sòlo domicilio

clase Persona

public class Persona {// declaración de los atributos private String nombre;

private String apellido;

// declaración de la variable de referencia del tipo Domicilio// gracias a ella podremos navegar hacia la clase Domicilio

private Domicilio mDomicilio;

// Constructor vacío de la clase public Persona () { }

public Persona (String pnombre, String papellido) { nombre= pnombre; apellido = papellido;

Cortez Alberto

Page 3: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

}

public Persona (String pnombre, String papellido, Domicilio pdomi ) { nombre= pnombre; apellido = papellido; mDomicilio= pdomi; }

// Declaración de los métodos get y set para cada atributo de la clase

public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public Domicilio getDomicilio () { return mDomicilio; }

public void setDomicilio (Domicilio val) { this.mDomicilio = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

clase Domicilio

package aso_unidireccional;

public class Domicilio {// declaración de los atributos

private String nombreCalle;

private int numero;

// Constructor vacío de la clase public Domicilio () { } // Constructor sobrecargado de la clase public Domicilio (String pnombreCalle, int pnumero) { nombreCalle= pnombreCalle;

Cortez Alberto

Page 4: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

numero=pnumero; }

public String getNombreCalle () { return nombreCalle; }

public void setNombreCalle (String val) { this.nombreCalle = val; }

public int getNumero () { return numero; }

public void setNumero (int val) { this.numero = val; }

}

MAIN

package aso_unidireccional;

/** * * @author ACortes */public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) {

// PRIMERA ESTRATEGIA// Creo un objeto de tipo persona y utilizo un constructor sobrecargado Persona per1 = new Persona("Rod ","Gonzales");// Creo un objeto de tipo domiilio usando el constructor vacìo Domicilio dom1 = new Domicilio(); // Asigno los valores del domicilio a la varible creada dom1.setNumero(239); dom1.setNombreCalle("Suipacha");

// La variable per1 del tipo Persona y la variable dom1 del tipo DOmicilio // todavìa NO ESTAN RELACIONADAS con datos (Gonzales no vive todavia en la calle suipacha)

// La asignaciòn del domicilio completo a la varible per1 la ralizaremos // enviàndo la varible dom1 como paràmetro, porque la seteamos previamente con nùmero y calle

// EN ESTE MOMENTO ESTAMOS RELACIONANDO la variable dom1 a per1 per1.setDomicilio(dom1);

Cortez Alberto

Page 5: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

// Una vez cargados los contenidos podemos imprimr por consola

System.out.println("La siguiente persona "+per1.getNombre()+" "+per1.getApellido()+ " vive en "+per1.getDomicilio().getNombreCalle()+ " " + per1.getDomicilio().getNumero());

// Debemos observar que la NAVEGABILIDAD LA REALIZAMOS DE LA SIGUIENTE FORMA// per1.getDomicilio() esto significa que puedo llegar a la variable referenciada y una vez// ahì con er1.getDomicilio().getNombreCalle() obtengo la calle de la variavle per1

// Hagamos el siguiente experimento: Destruyamos referencias esto s elogra haciendo las //variables = null

per1 = null;

// Con esto perdemos los datos de la variable per1 del tipo Persona pero sigue viva la // variable dom1 de tipo Domicilio. // Veamos como lo podemos verificar, imprimamos las varibles per1 y valores de la variable domicilio // independiente, ya no sabe que la calle suipacha es de la per1.

System.out.println("Nombre de la persona "+per1.getNombre());// Nota para que funcione el programa debe comentar la instrucción de arriba

// Nos darà este mensaje de error porque se perdiò la referencia a per1 gracias a per1=null// Exception in thread "main" java.lang.NullPointerException // at javaapplication11.Main.main(Main.java:51)// Java Result: 1// BUILD SUCCESSFUL (total time: 2 seconds)

System.out.println("Los datos de la variable domicilio"+ dom1.getNombreCalle());// Vemos como SÎ se puede imprimir la calle porque estamos llegando a su nombre a travès de dom1 y no de per1

}

}

Resultado de la aplicación unidireccional NEVEGABLE desde Persona a Domicilio

run:La siguiente persona Rod Gonzales vive en Suipacha 239BUILD SUCCESSFUL (total time: 2 seconds)

CONCLUSIONES SOBRE LA RELACION 1 A 1 NAVEGABLE DESDE LA CLASE PERSONA A DOMICILIOUn aspecto muy importante a tener en cuenta es que debemos realizar el modelado y el proceso abstracción los más aproximado a la realidad posible.Esto quiere decir que una persona SÎ o SÎ vive en un domicilio, esto lo podemos demostrar en el ejercicio visto si en vez de hacer per1= null, hubiéramos hecho dom1=null, realizando esta segunda acción llevaría a la destrucción del objeto de tipo

Cortez Alberto

Page 6: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Domicilio y esto llevaría a advertir que la Persona en cuestión no tienen domicilio asignado.Por eso cuando modelamos es muy importante advertir la relación fuerte que existe entre alguna clases, en este caso particular de la relación entre la persona y el domicilio a mi criterio lo más acertado es usar otro tipo de relación que se llama composición.Composición significa que la vida de una variable depende de la otra y lo observamos en el ejemplo que si destruyo la variable de tipo persona, todavía puedo mostrar datos del domicilio aunque no esté relacionado con la persona en cuestión.Vuelvo a insistir lo más acorde hubiese sido representar la relación entre la clase persona y domicilio a través de una COMPOSICION, esto quiere decir que si se destruye el objeto persona con null, automáticamente se destruye el objeto asociado a esa variable del tipo domicilio.

Y para que esto suceda e hay un proceso previo que debe entenderse en la composición y es que en la clase asociada o compuesta debe tener dentro de su método constructor la creación de la clase componente a través de la sentencia new().Lo veremos en el siguiente ejemplo.

Fundamentos de la COMPOSICION

Ejemplo de Asociación unidireccional COMPOSICION de 1 a 1 navegable desde Persona hacia DomicilioUna persona esta compuesta de un domicilio

Veremos un ejemplo similar al ejercicio anterior pero con la variante de representarlo a través de la asociación de Composición.

Se reprenda en UMl con un rombo relleno en el objeto compuesto

Cortez Alberto

Page 7: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

CLASE PERSONA

package javaapplication11;

public class Persona {// declaración de los atributos private String nombre;

private String apellido;

// declaración de la variable de referencia del tipo Domicilio// gracias a ella podremos navegar hacia la clase Domicilio

private Domicilio mDomicilio;

// Constructor vacío de la clase public Persona () { System.out.println("Pasé por el constructor de persona y desde aquí creé un domicilio relacionado"); mDomicilio = new Domicilio(); }

public Persona (String pnombre, String papellido) { System.out.println("Pasé por el constructor de persona y desde aquí creé un domicilio relacionado"); nombre= pnombre; apellido = papellido; mDomicilio = new Domicilio(); }

Cortez Alberto

Page 8: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

public Persona (String pnombre, String papellido, Domicilio pdomi ) { System.out.println("Pasé por el constructor de persona y desde aquí creé un domicilio relacionado"); nombre= pnombre; apellido = papellido; mDomicilio= pdomi; }

// Declaración de los métodos get y set para cada atributo de la clase

public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public Domicilio getDomicilio () { return mDomicilio; }

public void setDomicilio (Domicilio val) { this.mDomicilio = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

DOMICILIO

package javaapplication11;

public class Domicilio {// declaración de los atributos

private String nombreCalle;

private int numero;

// Constructor vacío de la clase public Domicilio () { }

Cortez Alberto

Page 9: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

// Constructor sobrecargado de la clase public Domicilio (String pnombreCalle, int pnumero) { nombreCalle= pnombreCalle; numero=pnumero; }

public String getNombreCalle () { return nombreCalle; }

public void setNombreCalle (String val) { this.nombreCalle = val; }

public int getNumero () { return numero; }

public void setNumero (int val) { this.numero = val; }

}

MAIN

package javaapplication11;

/** * * @author Administrador */public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) { // PRIMERA ESTRATEGIA// Creo un objeto de tipo persona y utilizo un constructor sobrecargado, automàticamente se creò // un objeto del tipo domicilio Persona per1 = new Persona("Rod ","Gonzales");// El new del constructor del objeto domicilio se realizò dentro del costructor de la clase Persona.

// Como ya se creo un espacio de memoria que representa al domicilio de la variable per1// puedo invocando al objeto per1, luego al método que me referencia a la variable domicilio // y luego utilizando el correspondiente método set asignar los datos al domicilio.// Debemos observar que la NAVEGABILIDAD LA REALIZAMOS DE LA SIGUIENTE FORMA// per1.getDomicilio() esto significa que puedo llegar a la variable referenciada y una vez// ahì con per1.getDomicilio().setNombreCalle() para setear los datos del domicilio de la variable per1

Cortez Alberto

Page 10: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

per1.getDomicilio().setNumero(239); per1.getDomicilio().setNombreCalle("Suipacha");

// La variable de tipo Persona ya tiene todos los datos almacenado // Una vez cargados los contenidos podemos imprimr por consola

System.out.println("La siguiente persona "+per1.getNombre()+" "+per1.getApellido()+ " vive en "+per1.getDomicilio().getNombreCalle()+ " " + per1.getDomicilio().getNumero());// Debemos observar que la NAVEGABILIDAD LA REALIZAMOS DE LA SIGUIENTE FORMA// per1.getDomicilio() esto significa que puedo llegar a la variable referenciada y una vez// ahì con er1.getDomicilio().getNombreCalle() obtengo la calle de la variavle per1

// Hagamos el siguiente experimento: Destruyamos referencias esto se logra haciendo las variables = null per1 = null; // Con esto perdemos los datos de la variable per1 del tipo Persona y en consecuencia MUERA LA // variable REFERENCIA DE de tipo Domicilio. // Veamos como lo podemos verificar, imprimamos las varibles per1 y valores de la variable domicilio // COMO DESTRUIMOS LA VARIABLE COMPUESTA DESTRUIMOS TODOS LOS COMPONENTES // Intentemos imprimir a travès de per1 los datos del domicilio // Aquì es totalmente distinto al ejercicio anterior que existà por sus propìos medios una variable del tipo domicilio

System.out.println("Los datos de la variable domicilio"+ per1.getDomicilio().getNombreCalle());

// PARA QUE FUNCIONE EL PROGRAMA COMENTE LA INSTRUCCION ANTERIOR // run:

// Pasè por el constructor de persona y desde aquì creè un domicilio relacionado// La siguiente persona Rod Gonzales vive en Suipacha 239// Exception in thread "main" java.lang.NullPointerException// at javaapplication11.Main.main(Main.java:54)// Java Result: 1

}

}

Fundamentos de la Agregaciòn

Relación de Agregación: (TODO/PARTE)Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye.

Acà debemos tener en cuenta que ambas variables pueden existir por sì misma.

Veremos que la destrucción de la variable de tipo computadora no interfiere en la vida en memoria de una varible de tipo MODEM.La agregación la representamos a travès de un mètodo que tiene la clase computadora llamado AgregarModem que recibe en sus parámetros un objeto de tipo MODEM.

Cortez Alberto

Page 11: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Ejemplo de Agregaciòn unidireccional de 1 a 1 navegable desde Computadora hacia ModemUn modem es parte de una computadora

Se representa en UMl con un rombo sin relleno en el objeto que agrega

clase Computadora

package aso_agregaciíon;

public class Computadora {// Declaración de atributos private String modelo;

private String tipo;// declaración de la variable que relaciona a la Clase modem private Modem mModem;

// Construntor vacío public Computadora () { }

public Computadora (String pmodelo,String ptipo) { modelo = pmodelo; tipo = ptipo; }

// Método que pasa como parámetro un objeto modem cuando se lo quiere agregar

public void AgregarModemAlaComputadora (Modem unmodem) {

Cortez Alberto

Page 12: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

mModem= unmodem; }// Declaración de los métodos set y get de los atributos public Modem getModem () { return mModem; }

public void setModem (Modem val) { this.mModem = val; }

public String getModelo () { return modelo; }

public void setModelo (String val) { this.modelo = val; }

public String getTipo () { return tipo; }

public void setTipo (String val) { this.tipo = val; }

}

Clase Modem

package aso_agregaciíon;

public class Modem {

private String marca;

public Modem () { }

public Modem (String pmarca) { marca = pmarca; }

public String getMarca () { return marca; }

public void setMarca (String val) { this.marca = val; }

}

Cortez Alberto

Page 13: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

MAIN

package aso_agregaciíon;

/** * * @author ACortespublic static void main(String[] args) { // Creo un objeto independiente del Tipo Modem llamado modem1 Modem modem1 = new Modem("Motorola");

// Creo un objeto independiente del Tipo Computadora llamado compu1 Computadora compu1 = new Computadora("HP TX1030LA","Notebook");

// Hasta ahora los objetos no s econocen entre sì

// Le paso como parámetros el objeto modem1 al metodo correspondiente de la Clase computadora compu1.AgregarModemAlaComputadora(modem1);// aquí se plantea la asociacion

// Accedo a mostrar los datos de la variable compu1 a través de los métodos // puedo llegar a conocer la marca del modem porque lo agregué pasándolo como parámetro System.out.println("Computadora: " + compu1.getModelo() + "TIPO: " + compu1.getTipo()); // vemos como puedo acceder a conocer la marca del modem d ela computadora porque se planteò la asociciòn previamente System.out.println("MODEM: " + compu1.getModem().getMarca());

// si destuimos la variable computadora perdemos la referncia a la marca // del modem que tiene esta computadora , pero los modem siguen exisiendo en forma independiente compu1=null; // observemos como accedemos a la variable de tipo modem a traves de su propia variable System.out.println("la compu no existe màs sòlo existen los modem " + modem1.getMarca() );

}

}

Resultado de la aplicación Agregacion entre la computadora y el modem

run:Computadora: HP TX1030LATIPO: NotebookMODEM: Motorolala compu no existe màs sòlo existen los modem MotorolaBUILD SUCCESSFUL (total time: 0 seconds)

Cortez Alberto

Page 14: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Otro Ejemplo de Asociación unidireccional COMPOSICION de 1 a 1 navegable desde Auto hacia MotorUn auto está compuesto de un motorVemos que es una relación de Composición ya que un auto sin motor no funciona!!!Ahora una computadora sin MODEM puede funcionar tranquilamente!!!

Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye (el Objeto base se construye a partir del objeto incluido, es decir, es "parte/todo").

Clase Auto

package aso_composicion;

public class Auto {// Declaracion de atributos private String marca;

private String patente;// Declaracion de la variable que hace referencia a otra clase private Motor mMotor;// Declaracion del constructor vacio // Dentro de este constructor se debe CREAR EL OBJETO REFENCIADO. // el objeto de referencia se crea en el mismo momento que se // CREA el objeto compuesto public Auto () { // creo el objeto componente Motor motor = new Motor(); // Le asigno los valores a través de los métodos set del motor

Cortez Alberto

Page 15: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

}

public Auto (String pmarca,String ppatente) { // creo el objeto componente marca = pmarca; patente = ppatente; mMotor = new Motor(); // Le asigno los valores a través de los métodos set del motor

}

public Auto (String pmarca,String ppatente,String pcilindrada,String pcarburador,String pbujias) { // creo el objeto componente marca = pmarca; patente = ppatente; mMotor = new Motor(pcilindrada,pcarburador,pbujias); // Le asigno los valores a través de los métodos set del motor

} public Motor getMotor () { return mMotor; }

public void setMotor (Motor val) { this.mMotor = val; }

public String getMarca () { return marca; }

public void setMarca (String val) { this.marca = val; }

public String getPatente () { return patente; }

public void setPatente (String val) { this.patente = val; }

}

Clase Motorpackage aso_composicion;

public class Motor {

private String cilindrada;

private String carburador;

Cortez Alberto

Page 16: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

private String bujias;

public Motor () { }

public Motor (String pcilindrada,String pcarburador,String pbujias) { cilindrada = pcilindrada; carburador = pcarburador; bujias = pbujias; }

public String getBujias () { return bujias; }

public void setBujias (String val) { this.bujias = val; }

public String getCarburador () { return carburador; }

public void setCarburador (String val) { this.carburador = val; }

public String getCilindrada () { return cilindrada; }

public void setCilindrada (String val) { this.cilindrada = val; }

}

MAIN/* * To change this template, choose Tools | Templates * and open the template in the editor. */

package aso_composicion;

/** * * @author ACortes */public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) {

// ###### ESTRATEGIA NRO 1 // Creo un objeto del Tipo Auto y como en el constructor del mismo // está la construccion del motor se crea también el motor en la misma acción

Cortez Alberto

Page 17: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Auto auto1 = new Auto("RENAULT", "CRQ656");// creo tambien la variable de tipo Motor // Le asigno los valores a los atributos de auto1 // Acà vemos como gracias a la referencia puedo a travès d eauto cargar los datos del motor para ese auto auto1.getMotor().setCilindrada("1.6 cm3"); auto1.getMotor().setCarburador("SOLEX 32 P DIS"); auto1.getMotor().setBujias("fg 455");

// Accedo a los datos a través del objeto auto1 y como hice una //referencia puedo acceder// a la clase motor

System.out.println("Auto: " + auto1.getMarca() + " PATENTE: " + auto1.getPatente());

System.out.println("MOTOR DEL AUTO: " + " CARBURADOR: " + auto1.getMotor().getCarburador() + " CILINDRADA: " + auto1.getMotor().getCilindrada() + " BUJIAS: " + auto1.getMotor().getBujias());

// ##### NUEVA ESTRATEGIA NRO 2// Preferimos crear un objeto deL tipo auto y pasAr todos sus datos por paràmetros // Asì vemos un còdigo disciplinado y ordenado (Màs compacto) que la Estrategia 1

Auto auto2 = new Auto("BMW", "MDZ", "2.2 cm3", "SOLEX 420 P BM", "fg 45");

System.out.println("Auto: " + auto2.getMarca() + " PATENTE: " + auto2.getPatente());

System.out.println("MOTOR DEL AUTO: " + " CARBURADOR: " + auto2.getMotor().getCarburador() + " CILINDRADA: " + auto2.getMotor().getCilindrada() + " BUJIAS: " + auto2.getMotor().getBujias());

}

}

Resultado de la aplicación Composición de la Clase Auto y Motor

run:Auto: RENAULT PATENTE: CRQ656MOTOR DEL AUTO: CARBURADOR: SOLEX 32 P DIS CILINDRADA: 1.6 cm3 BUJIAS: fg 455Auto: BMW PATENTE: MDZMOTOR DEL AUTO: CARBURADOR: SOLEX 420 P BM CILINDRADA: 2.2 cm3 BUJIAS: fg 45BUILD SUCCESSFUL (total time: 0 seconds)

Asociación Bidireccional:Implica la navegación en ambos sentidos entre las clases.Supongamos el caso de un modelo del Sistema Bancario un gerente quiere acceder desde una información de Persona a la cuenta que tiene asociada, pero también si desea desde una cuenta conocer la persona que es titular también lo pueda hacer.

Esto significa que ambas clases deben referenciarse, esto quiere decir que por ejemplo la clase Persona debe tener un tipo de dato de la clase cuenta como un atributo , para que desde allí se pueda acceder a la cuenta de la persona.

Cortez Alberto

Page 18: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Por el otro lado en la clase Cuenta debe existir como atributo de la misma un tipo de dato de la clase Persona para que desde allí pueda accederse a los datos de un cliente conociendo su cuenta.

clase Persona

package relaciones;

public class Persona {

private int dni;

private String nombre;

private String apellido;

private Cuenta mCuenta;

public Persona () {

Cortez Alberto

Page 19: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

}

public Persona (int pdni,String pnombre,String papellido) { dni=pdni; nombre=pnombre; apellido=papellido; }

public Persona (int pdni,String pnombre,String papellido, int pid, String ptipo,double pbalance) { dni=pdni; nombre=pnombre; apellido=papellido; mCuenta= new Cuenta(pid,ptipo,pbalance); }

public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public int getDni () { return dni; }

public void setDni (int val) { this.dni = val; }

public Cuenta getCuenta () { return mCuenta; }

public void setCuenta (Cuenta val) { this.mCuenta = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

Clase Cuenta

package relaciones;

public class Cuenta {

private int id;

private String tipo;

Cortez Alberto

Page 20: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

private double balance;

private Persona mPersona;

public Cuenta () { }

public Cuenta (int pid, String ptipo,double pbalance) { id=pid; tipo=ptipo; balance=pbalance; }

public double getBalance () { return balance; }

public void setBalance (double val) { this.balance = val; }

public int getId () { return id; }

public void setId (int val) { this.id = val; }

public Persona getPersona () { return mPersona; }

public void setPersona (Persona val) { this.mPersona = val; }

public String getTipo () { return tipo; }

public void setTipo (String val) { this.tipo = val; }

}

MAIN

package relaciones;

public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) {

Cortez Alberto

Page 21: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

// Una persona quiere abrir una cuenta en un banco (Se crearà su lejago y su cuenta simultàneamente) // Deberà proveer toda su informaciòn personal y el tipo de cuenta y el saldo inicial Persona per1 = new Persona(17456879,"Juan","Perez"); Cuenta cue1 = new Cuenta(2345,"CA",3456);

per1.setCuenta(cue1);// asocio la cuenta a la persona cue1.setPersona(per1);// asocio la persona a la cuenta

System.out.println("Cliente: " + per1.getApellido() + " DNI: " + per1.getDni());

System.out.println("Nro de Cuenta : " + per1.getCuenta().getId() + " Balance: " + per1.getCuenta().getBalance());

System.out.println("----------------------------------"); System.out.println("Cuenta: " + cue1.getId() + " Tipo: " + cue1.getTipo()); System.out.println("Pertenece a : " + cue1.getPersona().getApellido());

}

}

RESULTADO DE LA APLICACIÓN: Relaciones Bidireccionales. Accediendo desde la clase Persona a su cuenta.Y conocida una cuenta saber a quìen pertenecerun:Cliente: Perez DNI: 17456879Nro de Cuenta : 2345 Balance: 3456.0----------------------------------Cuenta: 2345 Tipo: CAPertenece a : PerezBUILD SUCCESSFUL (total time: 0 seconds)

Cortez Alberto

Page 22: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Ejemplo de Asociación navegable en una direcciòn 1 a * (Muchos) – Utilizando ArrayListEn este caso determinamos que una persona puede tener varios autos, no conocemos la cantidad fija por eso lo representamos con una estructura dinàmica llamada Arraylist. Es un contenedor de datos

Clase Auto

public class Auto {

private String marca;

private String patente;

public Auto () { } public Auto ( String pmarca,String ppatente ) { marca = pmarca; patente = ppatente; } public String getMarca () { return marca; }

public void setMarca (String val) { this.marca = val; }

Cortez Alberto

Page 23: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

public String getPatente () { return patente; }

public void setPatente (String val) { this.patente = val; }

}

Clase Persona

import java.util.ArrayList;

public class Persona {// Declaro los atributos private String nombre;

private String apellido;// Declaro la variable de refeerncia del tipo contenedor dinámico que la vincula con // la Clase Auto. private ArrayList<Auto> mAuto;

// Constructor vacio public Persona () { // Creo el contenedor de autos para una persona determinada mAuto= new ArrayList<Auto>(); }

// Constructor vacio public Persona (String pnombre, String papellido) { nombre = pnombre; apellido = papellido;

// Creo el contenedor de autos para una persona determinada mAuto= new ArrayList<Auto>(); }// Agregar un auto a una persona // Utilizando el método ADD de la clase ArrayList de las colecciones

public void AgregarUnAuto(Auto auto){

mAuto.add(auto);}

// Declaracion de los métodos set y get de los atributos public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public ArrayList<Auto> getAuto () { return mAuto; }

Cortez Alberto

Page 24: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

public void setAuto (ArrayList<Auto> val) { this.mAuto = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

MAIN

public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) { // Creo una variable del tipo Persona llamada p Persona p = new Persona("PEREZ","JUAN"); // Asigno el nombre y el appelido d ela persona creada

// creo en forma independiente 3 autos Auto auto1 = new Auto("FORD","CRQ234"); Auto auto2 = new Auto("RENAULT","FGH456"); Auto auto3 = new Auto("CHEVROLET","UYT498"); // Agrego al contenedor ArrayList correspondiente de la clase persona, // pasándole como parámetros al método los autos creados, para asocialos con la persona

p.AgregarUnAuto(auto1); p.AgregarUnAuto(auto2); p.AgregarUnAuto(auto3); // System.out.println("NOMBRE COMPLETO: " + p.getNombre() + " " + p.getApellido()); // Acà vemos como funciona la navegabilidad, llegamos a travès del objeto persona a su contenedor a travès // de la variable y luego dentro del contenedor accedemos a la posiciòn determinada por el subindice y desde ahí // al atributo deseado, patente, marca, etc System.out.println("AUTO1: " + p.getAuto().get(0).getMarca() + " " + p.getAuto().get(0).getPatente()); System.out.println("AUTO2: " + p.getAuto().get(1).getMarca() + " " + p.getAuto().get(1).getPatente()); System.out.println("AUTO3: " + p.getAuto().get(2).getMarca() + " " + p.getAuto().get(2).getPatente()); }

}

Cortez Alberto

Page 25: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Resultado de la aplicación relación 1 a muchos con ArrayList

run:NOMBRE COMPLETO: PEREZ JUANAUTO1: FORD CRQ234AUTO2: RENAULT FGH456AUTO3: CHEVROLET UYT498BUILD SUCCESSFUL (total time: 0 seconds)

Ejemplo de Asociación 1 a * Utilizando el contenedor VectorUn profesor dicta varias càtedras

Código Fuente de la Clase Profesor

package unoamuchos2;

import java.util.Vector;

public class Profesor { private String nombre;

// Declaracion de la variable de contenedor de referencia del Tipo Vector private Vector<Catedras> mCatedras;

// Constructor vacío

public Profesor () { // Creación del contenedor Vector en el momento de la cracion del profesor mCatedras = new Vector<Catedras>(); }

// Método agregar Materias al profesor, recibe las cátedras por parámetros // utiliza el método ADD de la colección para agregar al objeto profesor

public void AgregarMateriasAlProfesor(Catedras catedra){ mCatedras.add(catedra); } public Vector<Catedras> getCatedras () {

Cortez Alberto

Page 26: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

return mCatedras; }

public void setCatedras (Vector<Catedras> val) { this.mCatedras = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

Clase Catedras

package unoamuchos2;

public class Catedras {

private String nombre;

private int anio;

public Catedras () { }

public int getAnio () { return anio; }

public void setAnio (int val) { this.anio = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

}

MAIN

/* * To change this template, choose Tools | Templates

Cortez Alberto

Page 27: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

* and open the template in the editor. */

package unoamuchos2;

/** * * @author ACortes */public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) { // Creo un objeto del tipo profesor Profesor profe = new Profesor(); // Asignamos su nombre profe .setNombre("Facundo Cortez");

// Creamos materias de nuestro plan de estudio y les asignamos el nombre y anio Catedras c = new Catedras(); c.setNombre("PROGRAMACION"); c.setAnio(2); Catedras c2 = new Catedras(); c2.setNombre("PROGRAMACION II"); c2.setAnio(2); Catedras c3 = new Catedras(); c3.setNombre("PROGRAMACION III"); c3.setAnio(3); Catedras c4 = new Catedras(); c4.setNombre("LABORATORIO II"); c4.setAnio(2); Catedras c5 = new Catedras(); c5.setNombre("LABORATORIO III"); c5.setAnio(3); // Asignamos las cátedras al profesor creado // vemos que sólamente 2 profe .AgregarMateriasAlProfesor(c); profe .AgregarMateriasAlProfesor(c5);

// Muestro por pantalla las cátedras que ses profe dicta // Utilizamos la nueva instruccion FOR que recorre secuencialmente la colección

System.out.println("NOMBRE PROFESOR: " + profe.getNombre()); for(Catedras catedra : profe.getCatedras()){ System.out.println("Catedras que Dicta: " + catedra.getNombre() + " AÑO: " + catedra.getAnio());

} }}

Cortez Alberto

Page 28: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Resultado de la aplicación relación 1 a muchos con Vector

run:NOMBRE PROFESOR: Facundo PerezCatedras que Dicta: PROGRAMACION AÑO: 2Catedras que Dicta: LABORATORIO III AÑO: 3BUILD SUCCESSFUL (total time: 0 seconds)

Ejemplo de Asociación 1 a * Utilizando el contenedor ArrayListUn Alumno cursa varias materias

CLASE ALUMNO

package optimizacion;

import java.util.ArrayList;

public class Alumno {

private int legajo;

Cortez Alberto

Page 29: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

private String nombre;

private String apellido;

private ArrayList<Materias> mMaterias;

public Alumno () { // Se debe crear un contenedor de materias // para cada alumno// esto es una composiciòn para el alumno mMaterias = new ArrayList<Materias>();

}

// COnstructor sobrecargadp para evitar el uso de set public Alumno(int plegajo, String pnombre, String papellido) { mMaterias = new ArrayList<Materias>(); legajo = plegajo; nombre = pnombre; apellido = papellido;

}

public void setMateriasCursa (Materias val) { mMaterias .add(val); }

public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public int getLegajo () { return legajo; }

public void setLegajo (int val) { this.legajo = val; }

public ArrayList<Materias> getMaterias () { return mMaterias; }

public void setMaterias (ArrayList<Materias> val) { this.mMaterias = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

Cortez Alberto

Page 30: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

}

CLASE MATERIAS

package optimizacion;

public class Materias {

private int id;

private String nombre;

private int horasCursado;

// Constructor vacìo public Materias () { }

// COnstructor sobrecargado public Materias(int pid, String pnombre, Integer phorasCursado){ id = pid; nombre = pnombre; horasCursado = phorasCursado; }

public int getId () { return id; }

public void setId (int val) { this.id = val; }

public String getNombre () { return nombre; }

public void setNombre (String val) { this.nombre = val; }

/** * @return the horasCursado */ public int getHorasCursado() { return horasCursado; }

/** * @param horasCursado the horasCursado to set */ public void setHorasCursado(int horasCursado) { this.horasCursado = horasCursado; }

Cortez Alberto

Page 31: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

}

Resultado de la aplicación relación 1 a muchos con ARRAYLISTrun:NOMBRE ALUMNO: AlbertoMATERIA 1: Diagramacion Logica HORAS :4MATERIA 2: Programacion I HORAS :5MATERIA 3: Sistemas I HORAS :3----------------------NOMBRE ALUMNO: juanMATERIA 1: Diagramacion Logica HORAS :4MATERIA 2: Programacion I HORAS :5----------------------NOMBRE ALUMNO: JosèMATERIA Diagramacion Logica HORAS :4MATERIA Sistemas I HORAS :3BUILD SUCCESSFUL (total time: 2 seconds)

Relación de Herencia:Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected). La forma de implementar esta relación es acompañar a la cabecera de la definición de la subclase con la palabra extends.

FUNDAMENTOS - Relación de Herencia: Ejemplo de la creación de los constructores.

Clase Abuelo

Cortez Alberto

Page 32: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

package herencia1;

public class Abuelo {

public Abuelo () { System.out.println("Se crea un abuelo"); }

}

Clase Padrepackage herencia1;

public class Padre extends Abuelo {

public Padre () { System.out.println("Se crea un padre"); }

}

Clase Hijo

package herencia1;

public class Hijo extends Padre {

public Hijo () { System.out.println("Se crea un hijo"); }

}

Resultado de la aplicación de Herencia de constructores

Se crea un abueloSe crea un padreSe crea un hijo

Ejemplo de HERENCIA ENTRE 2 CLASES Un PROFESOR ES PERSONA

Cortez Alberto

Page 33: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

Clase Persona

package herencia;

public class Persona {

private String Nombre;

private String apellido;

private long dni;

public Persona () { }

public String getNombre () { return Nombre; }

Cortez Alberto

Page 34: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

public void setNombre (String val) { this.Nombre = val; }

public String getApellido () { return apellido; }

public void setApellido (String val) { this.apellido = val; }

public long getDni () { return dni; }

public void setDni (long val) { this.dni = val; }

}

Clase Profesor

package herencia;

public class Profesor extends Persona {

private int legajo;

public Profesor () { }

public int getLegajo () { return legajo; }

public void setLegajo (int val) { this.legajo = val; }

}

MAIN

/* * To change this template, choose Tools | Templates * and open the template in the editor. */

package herencia;

/** * * @author ACortes */

Cortez Alberto

Page 35: Ing Directa Cortez 2009

Programacion II -Ingeniería Directa – Diagrama de Clases –Aplicación en Java

public class Main {

/** * @param args the command line arguments */ public static void main(String[] args) { // Creo un objeto del Tipo profesor y como se produce la herencia de una clase Persona // primero se activa el constructor de persona creándome las variables correspondientes a dicha Clase // es por eso que creando un objeto profesor podemos acceder // a los atributos y métodos de la clase Persona. // recordemos que los atributos de la superclase los podemos declarar como protected Profesor profe = new Profesor(); // Accedo a los métodos que heredarán de persona todos los objetos del tipo Profesor profe.setApellido("Cortez"); profe.setNombre("GOnzalo"); profe.setDni(29112619);

// Solamente este método lo especifico de profesor profe.setLegajo(233988);

// Impimo el legajo correspondiente System.out.println("Profesor: Apellido: " + profe.getApellido() + " Nombre: " + profe.getNombre() + " DNI: " + profe.getDni() + " LEGAJO: " + profe.getLegajo());

}}

Resultado de la aplicación de Herencia

Profesor: Apellido: Cortez Nombre: GOnzalo DNI: 29112619 LEGAJO: 233988

Cortez Alberto