Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en...

59
Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí. En esta materia describiremos tres formas de relación: dependencia, asociación y herencia entre clases.

Transcript of Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en...

Page 1: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Relaciones entre Clases

La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí. En esta materia describiremos tres formas de relación: dependencia, asociación y herencia entre clases.

Page 2: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Dependencia entre Clases

Cuando una clase declara una variable local o un parámetro de otra clase, decimos que existe una dependencia entre la primera y la segunda, la relación es de tipo usaUn.

Page 3: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

En una fábrica de autos de juguete una parte de la producción la realizan robots. Cada robot tiene un número de serie y un nombre.En el momento que se crea el robot se establece su número de serie, que nunca va a cambiar.El nombre se le puede asignar al robot cuando se crea o modificarlo más adelante, cuando ya está activo.

Page 4: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Cada robot tiene una carga de energía que se va consumiendo a medida que ejecuta las órdenes que recibe. Cada robot es capaz de conectarse de modo tal que se recargue su energía hasta su capacidad máxima de 5000 unidades. Esta acción puede ejecutarse ante una orden externa o puede iniciarla el robot mismo cuando su energía está por debajo de las 100 unidades. El robot recarga su energía cuando después de armar un juguete, queda por debajo del mínimo.

Page 5: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Cada robot tiene la capacidad para armar autos de juguete y cuenta con piezas de diferentes tipos: ruedas, ópticas y chasis. Inicialmente comienza a trabajar con 100 piezas de cada tipo. La cantidad de piezas se incrementa cuando un robot recibe una orden de abrir una caja de piezas y se decrementa cuando arma un vehículo. Cada caja tiene piezas de todos los tipos. Desarmar una caja cualquiera demanda 50 unidades de energía. Armar un auto consume 70 unidades de energía, 4 ruedas, 6 ópticas y 1 chasis.

Page 6: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<atributos de clase>>energiaMaxima : 5000energiaMinima : 100<<atributos de instancia>>nroSerie:enteronombre:Stringenergia: enteroruedas: enteroopticas: enterochasis: entero

Caja

<<atributos de instancia>>ruedas: enteroopticas: enterochasis: entero

Las clases Robot y String están asociadas.

Page 7: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<constructores>>Robot(nro:entero) Robot(nro:entero,nom:String)<<comandos>>establecerNombre(n:String)establecerRuedas(n:entero)establecerOpticas(n:entero)establecerChasis(n:entero)abrirCaja (c: Caja)recargar()armarAuto()

Caja

<<constructor>>Caja (r,o,ch : entero)<<comandos>>establecerRuedas(n:entero)establecerOpticas(n:entero)establecerChasis(n:entero)

Existe una relación de dependencia entre las clases Robot y Caja.

Requiere que haya piezas disponibles

Page 8: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<consultas>>obtenerNroSerie():enteroobtenerNombre():StringobtenerEnergia (): enteroobtenerChasis () : entero obtenerRuedas () : entero obtenerOpticas () : entero cantAutos() : entero

Caja

<<consultas>>obtenerChasis () : entero obtenerRuedas () : entero obtenerOpticas () : entero equals(c:Caja):boolean

Page 9: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<Responsabilidades>>El constructor establece la energía en el valor máximo y las cantidades de piezas en 100. Todos los servicios que consumen energía deciden recargar cuando energía es menor que la mínima.

Page 10: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

recargar() recarga la energía del robot hasta llegar al máximo. abrirCaja (c:Caja) aumenta las piezas disponibles de acuerdo a las cantidades de la caja. armarAuto() decrementa las piezas disponibles, requiere que la clase cliente haya controlado si hay piezas disponibles antes de enviar el mensaje armarAuto a un robot.cantAutos() entero retorna la cantidad de autos que puede armar el robot con las piezas que tiene disponibles, sin desarmar una caja.

Page 11: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robotclass Robot {

//atributos de claseprivate static final int energiaMaxima = 5000;private static final int energiaMinima = 100;

//atributos de instancia private int nroSerie; private String nombre; private int energia; private int ruedas; private int opticas; private int chasis;…}

Robot

<<atributos de clase>>energiaMaxima : 5000energiaMinima : 100<<atributos de instancia>>nroSerie:enteronombre:Stringenergia: enteroruedas: enteroopticas: enterochasis: entero

Page 12: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robotclass Robot {…//Constructorespublic Robot (int nro){ nroSerie = nro; energia=energiaMaxima; ruedas = 100; opticas = 100; chasis = 100;}public Robot (int nro, String nom){

Robot(nro); nombre = nom;} …}

Robot

<<constructores>>Robot(nro:entero) Robot(nro:entero,

nom:String)

Page 13: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<comandos>>establecerNombre(n:String);establecerRuedas(n:entero)establecerOpticas(n:entero)establecerChasis(n:entero)recargar()

class Robot {…//Comandospublic void establecerNombre(String n){ nombre = n;}public void establecerRuedas(int n){ ruedas = n;}public void establecerChasis(int n){ chasis = n;}public void establecerOpticas(int n){ opticas = n;}public void recargar(){ energia=energiaMaxima;}…}

Page 14: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<comandos>>armarAuto()

class Robot {…public void armarAuto () {/*Requiere que se haya controlado si hay piezas disponibles*/ ruedas -= 4 ; opticas -=6; energia -= 70; chasis --;//Controla si es necesario recargar energía if (energia < energiaMinima) this.recargar(); } …}

Page 15: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

abrirCaja (c: Caja)

class Robot {…public void abrirCaja (Caja caja) {/*Aumenta sus cantidades según las de la caja*/ ruedas += caja.obtenerRuedas(); opticas += caja.obtenerOpticas(); chasis += caja.obtenerChasis(); energia -= 50;/*Controla si es necesario recargar energía*/ if (energia < energiaMinima) this.recargar();}…}

El comando abrirCaja recibe como parámetro un objeto de clase Caja.Las clases Robot y Caja están asociadas por una relación de dependencia.

Page 16: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

obtenerNroSerie(): enteroobtenerNombre():StringobtenerEnergia (): enteroobtenerChasis () : entero obtenerRuedas () : entero obtenerOpticas () : entero

class Robot {

//Consultaspublic String obtenerNombre(){ return nombre;}public int obtenerNroSerie(){ return nroSerie;}public int obtenerEnergia(){ return energia;}public int obtenerRuedas(){ return ruedas;}public int obtenerOpticas(){ return opticas;}public int obtenerChasis(){ return chasis;}…}

Page 17: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Robot

<<consultas>>cantAutos() : enterotoString():String

class Robot {…public String toString(){ return nroSerie+" "+nombre+" "+ ruedas+" "+opticas+" "+

chasis;}…}

Page 18: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

class FabricaJuguetes{…public void producir { Robot unRobot; unRobot = new Robot(111); Caja c = new Caja(100,150,25); … if (unRobot.cantAutos() = 0) unRobot.abrirCaja(c); unRobot.armarAuto(); …}}

Page 19: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Robot

Observemos que los valores de los atributos de instancia se establecen en la creación del objeto y se modifican cuando se arman autos o se abren cajas. Los atributos, los comandos y las consultas de Caja tienen los mismos nombres que en Robot, cuando un objeto reciba un mensaje su clase determina el método que va a ejecutarse. La clase FabricaJuguetes depende de las clases Robot y Caja porque tiene variables locales de esas clases.

Page 20: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Cuando una clase tiene un atributo de instancia de otra clase, decimos que ambas clases están asociadas y la relación es de tipo tieneUn.

Observemos que entre dos clases asociadas también puede haber una relación de dependencia, si los servicios provistos por una de ellas reciben parámetros o declaran variables locales de la clase asociada.

Asociación entre Clases

Page 21: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Plan de Teléfono Móvil

Una empresa de telefonía celular ofrece distintos planes a sus abonados. Un plan tiene un código, un costo mensual y establece un tope para el número de mensajes de texto y un tope de créditos que los abonados consumen con sus llamadas a número dentro de la comunidad y a otros móviles fuera de la comunidad. Una línea tiene un número asociado, un plan y una cantidad de consumos a líneas dentro de la comunidad y a líneas móviles fuera de la comunidad.

Page 22: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

La cantidad de créditos de un plan se consume de modo diferente según la llamada se realice dentro de la comunidad o fuera de ella. Un minuto (o fracción) de llamada dentro de la comunidad consume 1 crédito, un minuto a una línea móvil fuera de la comunidad consume 2 créditos.

Caso de Estudio: Plan de Teléfono Móvil

Page 23: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Linea<<Atributos de instancia>>nro: Stringplan : Plan consumosSms, consumosAComunidad, consumosAMoviles : entero<<Constructor>>Linea(nro:String,p:Plan)

Plan<<Atributos de instancia>>codigo:enterosms,credito:enterocosto:entero<<Constructor>>Plan(c:entero)

Caso de Estudio: Plan de Teléfono Móvil

Page 24: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Linea

<<Comandos>>aumentarSms(c:entero)aumentarACom(c:entero)aumentarAMov(c:entero)

Plan

<<Comandos>>establecerSms(n:entero)establecerCredito(n:entero)establecerCosto(n:entero)

Caso de Estudio: Plan de Teléfono Móvil

Page 25: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Linea<<Consultas>>obtenerNro():StringobtenerConsumosSms():enteroobtenerConsumosAComunidad():enteroobtenerConsumosAMoviles():enteroconsumoCredito():enterosmsDisponibles():enterocreditoDisponible():enterotoString():String

Plan

<<Consultas>>obtenerSms():enteroobtenerCredito():enteroobtenerCosto():enterotoString():String

Caso de Estudio: Plan de Teléfono Móvil

El consumo del crédito se computa como consumosAComunidad+consumosAMoviles*2 y el crédito disponible se calcula como el crédito que corresponde al plan menos el consumoCredito de la línea.

Page 26: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

La clase Linea tieneUn atributo de clase Plan.

La clase Linea también está asociada a la clase String, no dibujamos esta última asociación en el diagrama dado que la clase String está provista por el lenguaje.

Caso de Estudio: Plan de Teléfono Móvil

Page 27: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Linea

<<Responsablidades>>Requiere que se establezca el plan antes de aumentar los consumos o ejecutar las consultas

Caso de Estudio: Plan de Teléfono Móvil

Page 28: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

class Linea {//Atributos de Instanciaprivate String nro; private Plan plan ;private int consumosSMS;private int consumosAComunidad;private int consumosAMoviles;//Constructorpublic Linea (String n){ nro = n;}

Caso de Estudio: Plan de Teléfono Móvil

Page 29: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

//Comandospublic void establecerPlan (Plan p){ plan = p;}public void aumentarSMS (int n){ consumosSMS=+ n;}public void aumentarAComunidad (int n){ consumosSMS=+ n;}public void aumentarAMoviles (int n){ consumosSMS=+ n;}

Caso de Estudio: Plan de Teléfono Móvil

Page 30: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

//Consultaspublic String obtenerNro (){ return nro;}public Plan obtenerPlan(){ return plan;}public int obtenerConsumosSMS (){ return consumosSMS ;}public int obtenerConsumosAComunidad (){ return consumosAComunidad ;}public int obtenerConsumosAMoviles (){ return consumosAMoviles ;}

Caso de Estudio: Plan de Teléfono Móvil

Page 31: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

public int consumoCredito(){ return consumosAComunidad+consumosAMoviles*2;}public int smsDisponibles(){//Requiere el plan ligado return plan.obtenerSMS()-consumosSMS;}public int creditoDisponible(){//Requiere el plan ligado return plan.obtenerCredito()-consumoCredito();}public String toString(){ return nro+” “+consumoSMS+” “+ consumoAComunidad+” “+ consumoAMoviles+” “+plan.toString();}}

Caso de Estudio: Plan de Teléfono Móvil

Page 32: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Cada objeto de clase Linea tiene un atributo de instancia de clase Plan. El atributo mantiene una referencia a un objeto de clase Plan. En la realidad a modelar, probablemente varias líneas correspondan a un mismo plan, en ejecución varias instancias de Linea referenciarán entonces a un mismo objeto de clase Plan. La variable de instancia plan no es visible desde el exterior de la clase Linea.

Caso de Estudio: Plan de Teléfono Móvil

Page 33: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

class ventas{

public static void main(String [] a){

Plan p1 = new Plan(123); p1.establecerSms(100); p1.establecerCredito(200); p1.establecerCosto(150);

Plan p2 = new Plan(124); p2.establecerSms(200); p2.establecerCredito(300); p2.establecerCosto(200); …

Caso de Estudio: Plan de Teléfono Móvil

Page 34: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

class ventas{

public static void main(String [] a){

String lin11 = “2916324567”; String lin12 = “2916324568”; String lin21 = “2912585234”;

Linea l11 = new Linea(lin11,p1); Linea l12 = new Linea(lin12,p1); Linea l21 = new Linea(lin21,p2); …

Caso de Estudio: Plan de Teléfono Móvil

Page 35: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Una asignación a la variable de instancia plan, cambia el valor de la variable, la referencia a un objeto, pero no el estado interno del objeto mismo de clase Plan. En particular el método establecerPlan(Plan p) modifica la variable de instancia plan, esto es el valor de la variable. La clase Linea asume que cuando un objeto reciba el mensaje creditoDisponible() su variable de instancia plan estará ligada.

Caso de Estudio: Plan de Teléfono Móvil

Page 36: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

class ventas{

public static void main(String [] a){

System.out.println(l11.toString()); p1 = p2; System.out.println(l11.toString()); l11.establecerPlan(p2); System.out.println(l11.toString()); p2.establecerCosto(220); System.out.println(l11.toString());

Caso de Estudio: Plan de Teléfono Móvil

Page 37: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

En un negocio se desea mantener información referida a las facturas imputadas a las cuentas corrientes de los clientes. De cada factura se mantiene el número, el monto y el cliente. De cada cuenta corriente se mantiene el nombre del cliente y el saldo.

Caso de Estudio: Factura Cta Cte

Page 38: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Factura<<atributos de instancia>>nroFact : StringmontoFact : realclienteFact : CtaCte

CtaCte<<atributos de instancia>> nombre : Stringsaldo : float

Caso de Estudio: Factura Cta Cte

<< Constructores>>Factura ( nro : String, m : float, cli : Cta_Cte)

<<Constructor>>Cta_Cte (n:String)

Page 39: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Factura<<atributos de instancia>>nroFact : StringmontoFact : realclienteFact : CtaCte

CtaCte<<atributos de instancia>> nombre : Stringsaldo : float

Caso de Estudio: Factura Cta Cte

<<Comandos>>establecerClienteFact(cli:CtaCte)establecerMontoFact(m:real)<<Consultas>>obtenerNroFact():String obtenerClienteFact():CtaCteobtenerMontoFact():real

<<Comandos>>establecerSaldo(m:real)actualizarSaldo (m:real)<<Consultas>>obtenerNombre():StringobtenerSaldo():real

Page 40: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Las clases Factura, String y CtaCte están asociadas, la relación es de tipo tieneUn. Un comando de la clase Factura puede recibir como parámetro una variable de una clase asociada, como por ejemplo CtaCte. Una consulta puede retornar una referencia a un objeto de alguna de las clases asociadas. En este caso se crea también una dependencia, consecuencia de la asociación entre clases.

Caso de Estudio: Factura Cta Cte

Page 41: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

Cuando se emite una factura en cuenta corriente la modificación del saldo del cliente puede hacerse a través un mensaje enviado:•desde un servicio provisto por la clase Factura que registra la venta, como en la primera solución propuesta• desde el método que invoca al servicio de la clase Factura que registra la venta, como en la segunda solución propuesta

Page 42: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

El diseñador del sistema establece la responsabilidad de cada clase.

El implementador debe generar código adecuado para garantizar que cada clase cumple con sus responsabilidades.

Page 43: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Factura<<atributos de instancia>>nroFact : StringmontoFact : realclienteFact : CtaCte

CtaCte<<atributos de instancia>> nombre : Stringsaldo : float

Caso de Estudio: Factura Cta Cte

<<Responsabilidades>>Cuando se crea una factura se actualiza el saldo de la cuenta corriente. Requiere que nro y cli sean referencias ligadas.

<<Responsabilidades>>Requiere que nom sea una referencia ligada.

Alternativa 1

Page 44: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Factura<<atributos de instancia>>nroFact : StringmontoFact : realclienteFact : CtaCte

CtaCte<<atributos de instancia>> nombre : Stringsaldo : float

Caso de Estudio: Factura Cta Cte

<<Responsabilidades>>La clase Cliente es responsable de actualizar el saldo de la cta cte consistentemente. Requiere que nro y cli sean referencias ligadas.

<<Responsabilidades>>Requiere que nom sea una referencia ligada.

Alternativa 2

Page 45: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

public Factura (String n, float m, Cliente cli){/*Crea una factura, guarda número, monto y cliente, y actualiza el saldo de la cuenta corriente del cliente con el mismo monto. Requiere que n y cli estén ligadas */

nroFact = n; montoFact = m; clienteFact = cli; clienteFact.actualizarSaldo (m);}

Alternativa 1

Page 46: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

class Ventas {…String num1 = new String(“A-0001”);String num2 = new String(“A-0002”); Cta_Cte cc = new Cta_Cte (“Gomez”);…Factura f1 = new Factura (num1,1500,cc);Factura f2 = new Factura (num2,1200,cc); …}

Alternativa 1

Page 47: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

public Factura (String n, float m, Cliente cli){/* La clase Cliente es responsable de actualizar el saldo de la cta cte consistentemente. Requiere que n y cli estén ligadas */

nroFact = n; montoFact = m; clienteFact = cli;}

Alternativa 2

Page 48: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

class Ventas {…String num1 = new String(“A-0001”);String num2 = new String(“A-0002”); Cta_Cte cc = new Cta_Cte (“Gomez”);…Factura f1 = new Factura (num1,1500,cc);Factura f2 = new Factura (num2,1200,cc); …}

Alternativa 2

Page 49: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

class CtaCte {//Atributos de Instanciaprivate String nombre;private float saldo;//Constructorespublic CtaCte (String nom){//Requiere nom ligada nombre =nom;}//Comandospublic void actualizarSaldo (float s) { saldo += s;}…}

Page 50: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

La clase CtaCte se implementa de la misma manera, sea cual sea la alternativa de diseño elegida para Factura. Observemos que si el diseñador elige una de las alternativas y cambia de decisión una vez que las clases están implementadas, el cambio va a requerir modificar tanto la clase proveedora, como todas las clases que la usan.

Page 51: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Caso de Estudio: Factura Cta Cte

Una modificación de diseño que cambia las responsabilidades afecta a la colección de clases asociadas. Notemos que si solo se modifica una de las clases, por ejemplo la clase cliente, va a producirse un error de aplicación, que pasa desapercibido para el compilador.

Page 52: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Hemos explicado antes que una variable de un tipo clase mantiene una referencia a un objeto. En el momento que se crea un objeto de una clase, se reserva un área en memoria para mantener su estado interno y se almacena la referencia a esa área de memoria en la variable. La representación a través de referencias surge justamente para modelar adecuadamente la asociación entre clases.

Representación en Memoria

Page 53: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Representación Extendida

Representación en Memoria

String num = new String(“A-0001”);Cta_Cte cc = new Cta_Cte (“Gomez”);cc.establecerSaldo (1500);Factura f = new Factura (num1,1200,cc);cc.actualizarSaldo (1200);

Page 54: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Es decir, el estado interno de un objeto de clase Factura mantiene los atributos de esa clase más los atributos de las clases asociadas. La representación extendida tiene dos inconvenientes importantes. En primer lugar si dos o más objetos de la clase Factura están asociados a una misma instancia de la clase CtaCte, la estructura completa de cada objeto de la clase CtaCte se mantendrá en cada objeto de clase Factura.

Representación en MemoriaRepresentación Extendida

Page 55: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Se multiplica el espacio de almacenamiento requerido y con un importante riesgo de producir inconsistencia. Cuando se genere otra factura de la misma cuenta corriente, es necesario modificar el saldo de todas las facturas anteriores, asociadas a la misma cuenta corriente.

Representación en MemoriaRepresentación Extendida

Page 56: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

El segundo inconveniente de la representación extendida es que si se modifica, por ejemplo, la representación de la clase CtaCte, porque se agrega un atributo de instancia CUIT, este cambio va a afectar a todas las clases que usan los servicios de CtaCte. Los cambios en una clase provocan un impacto en la representación de los objetos de las clases que la usan.Ambos problemas se solucionan usando una representación por referencia.

Representación en MemoriaRepresentación Extendida

Page 57: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

String num1 = new String(“A-0001”);String num2 = new String(“A-0002”);CtaCte cc = new CtaCte (“Gomez”);…Factura f1 = new Factura (num1,1500,cc);cc.actualizarSaldo (1500);Factura f2 = new Factura (num2,1200,cc);cc.actualizarSaldo (1200);

Representación en MemoriaRepresentación por Referencia

Page 58: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Representación en MemoriaRepresentación por Referencia

Page 59: Relaciones entre Clases La construcción de un sistema de software orientado a objetos consiste en definir un conjunto de clases relacionadas entre sí.

Cada objeto de software modela a un objeto del problema identificado en la etapa de diseño. El estado interno de un objeto puede contener referencias a otros objetos, de modo que un sistema complejo puede modelarse a partir de objetos simples. La modificación de la representación de un objeto no afecta a la representación de los objetos que lo referencian. En este caso si cambia la representación interna de la clase CtaCte, la modificación no afecta a la clase Factura.

Representación en MemoriaRepresentación por Referencia