Post on 22-Jan-2016
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Objetos y ReferenciasCaso de estudio: Cta. Cte. Bancaria
Dr. Luciano H. Tamargo
http://cs.uns.edu.ar/~lt
Depto. de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur, Bahía Blanca
2015
Introducción a la Programación Orientada a Objetos IPOO - 2015
2
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema.
Introducción a la Programación Orientada a Objetos IPOO - 2015
3
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
EL CONCEPTO DE VARIABLE
• Una variable tiene un nombre, un alcance y un tipo de dato.
• El nombre es un identificador que cumple algunas reglas sintácticas que impone el lenguaje.
• El alcance depende de la declaración.
• En Java una variable puede declararse como un atributo de clase o local a un bloque de código.
• El tipo de una variable puede ser elemental o una clase.
• La representación interna en memoria es diferente en cada caso.
Introducción a la Programación Orientada a Objetos IPOO - 2015
4
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema.
Introducción a la Programación Orientada a Objetos IPOO - 2015
5
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
LA MEMORIA
• Podemos pensar que la memoria es una estructura de celdas o bloques de memoria, cada una de las cuales tiene una dirección y un contenido.
0000 0010001
0001 1101000
0010 1110110
0011 0110001
0100 0110101
…
dirección contenido
Introducción a la Programación Orientada a Objetos IPOO - 2015
6
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema.
Introducción a la Programación Orientada a Objetos IPOO - 2015
7
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPOS ELEMENTALES
• El tipo de dato elemental es un conjunto de valores atómicos y un conjunto de operaciones que pueden aplicarse sobre el conjunto de valores.
• Un tipo de dato elemental permite factorizar propiedades y establecer chequeos para prevenir errores.
• En ejecución, una variable de tipo elemental almacena un valor y ocupa una celda o bloque de memoria.
Introducción a la Programación Orientada a Objetos IPOO - 2015
8
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPOS ELEMENTALES
• Cuando en ejecución se alcanza una declaración de variable de tipo elemental, se reserva una celda o bloque de memoria.
• Cuando se asigna un valor a la variable este valor se almacena directamente en el bloque de memoria.
• Esto es, el bloque de memoria que corresponde a la variable mantiene un valor dentro del conjunto de valores que determina el tipo de dato.
Representación en memoria
int i = 3;Int j;
i 3
j
Introducción a la Programación Orientada a Objetos IPOO - 2015
9
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPOS ELEMENTALES
• La instrucción de asignación modifica el contenido del bloque de memoria que corresponde a la variable.
• En verdad esta es una visión abstracta, en memoria se almacena la representación binaria de cada valor.
Representación en memoria
int i = 3;Int j;j = I + 1;
i 3
j 4
Introducción a la Programación Orientada a Objetos IPOO - 2015
10
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPOS ELEMENTALES
• Los operadores relacionales comparan el contenido de los bloques de memoria.
Representación en memoria
int i = 3;Int j;j = I + 1;boolean b1 = 1 == j;boolean b2 = i < j;
i 3
j 4
b1 false
b2 true
Introducción a la Programación Orientada a Objetos IPOO - 2015
11
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema.
Introducción a la Programación Orientada a Objetos IPOO - 2015
12
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
• El valor de una variable de un tipo clase es una referencia.
• Una referencia puede ser nula o estar ligada a un objeto.
• No vamos a visualizar la representación interna de objetos y referencias graficando la memoria, sino dibujando diagramas de objetos.
Representación en memoria
Un diagrama de objetos es una representación gráfica adecuada para modelar la declaración de variables, la creación de objetos, la evolución de las referencias y la modificación de sus estados internos.
class CtaCteBancaria{//Requiere código>0 y saldo >= -maxDescubierto//Atributos de claseprivate static final maxDescubierto=1000;//Atributos de Instancia/*El codigo se establece al crear la cuenta corriente bancaria y no cambia */private int codigo;private float saldo;…}// Constructorespublic CtaCteBancaria(int cod) {
codigo = cod; saldo = 0;}public CtaCteBancaria(int cod, float sal) {
codigo = cod; saldo = sal;}
14
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
CtaCteBancaria cb;
cb = new CtaCteBancaria(111,1000);
cb :CtaCteBancariacodigo=111saldo=1000
• Reserva un bloque de memoria para la variable cb.• Reserva un bloque en memoria para mantener el estado
interno del objeto.• Invoca al constructor que inicializa el estado interno del
objeto.• Liga la variable cb al objeto, almacenando en cb la dirección
del bloque de memoria que mantiene el estado interno del objeto.
15
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
La declaración de cada variable reserva un bloque de memoria que mantiene inicialmente una referencia nula o referencia no ligada.
CtaCteBancaria cb1;
CtaCteBancaria cb2;
cb1
cb2
16
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
cb1 = new CtaCteBancaria (111,1000);
cb1
cb2
public CtaCteBancaria(int cod, float sal) {
codigo = cod; saldo = sal;}
:CtaCteBancariacodigo=111saldo=1000
17
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
cb1 = new CtaCteBancaria (111,1000);
cb2 = new CtaCteBancaria (112);
cb1
cb2
public CtaCteBancaria(int cod) {
codigo = cod; saldo = 0;}
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=0
18
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
cb1 = new CtaCteBancaria (111,1000);
cb2 = new CtaCteBancaria (112);
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=0
La declaración de cada objeto reserva un nuevo bloque de memoria, cuya dirección se asigna a cada variable. Las variables cb1 y cb2 están ligadas.
19
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
CtaCteBancaria cb3 = cb2;
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=0
Como las variables de tipo clase mantienen referencias, el operador de asignación asigna referencias.
cb3
20
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
:CtaCteBancariacodigo=112saldo=0
VARIABLES DE TIPO CLASE
Representación en memoria
cb2.depositar(250);
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
El mensaje depositar modifica el atributo saldo del objeto ligado a las variables cb2 y cb3.
cb3
21
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
Representación en memoria
System.out.println (cb3.toString());
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
cb3
112 250.0
22
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
CtaCteBancaria cb4 = cb2.cta_mayorSaldo(cb1);
Representación en memoria
cb1
cb2
cta:CtaCteBancaria
codigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
cb3
cb4
public CtaCteBancaria cta_mayorSaldo(CtaCteBancaria cta){/*…*/ if (saldo > cta.obtenerSaldo()) return this; else return cta;}
23
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
CtaCteBancaria cb4 = cb2.cta_mayorSaldo(cb1);
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
cb3
cb4
24
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
CtaCteBancaria cb4 = cb1.cta_mayorSaldo(cb2);
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
cb3
cb4
public CtaCteBancaria cta_mayorSaldo(CtaCteBancaria cta){/*…*/ if (saldo > cta.obtenerSaldo()) return this; else return cta;}
cta
25
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
VARIABLES DE TIPO CLASE
cb3 = new CtaCteBancaria(cb1.obtenerCodigo(),
cb1.obtenerSaldo());
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=111saldo=1000
:CtaCteBancariacodigo=112saldo=250
cb3 :CtaCteBancariacodigo=111saldo=1000
Introducción a la Programación Orientada a Objetos IPOO - 2015
26
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema.
Introducción a la Programación Orientada a Objetos IPOO - 2015
27
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
• Cada objeto de software tiene una identidad, una propiedad que lo distingue de los demás.
• La referencia a un objeto puede ser usada como propiedad para identificarlo.
• Si varias variables están ligadas a un mismo objeto, todas mantienen una misma referencia, esto es, comparten una misma identidad.
28
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
CtaCteBancaria cb1,cb2,cb3;
cb1 = new CtaCteBancaria(101,500);
cb2 = new CtaCteBancaria(101,500);
cb3 = cb2;
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=101saldo=500
:CtaCteBancariacodigo=101saldo=500
cb3
29
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
cb2 == cb3;
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=101saldo=500
:CtaCteBancariacodigo=101saldo=500
cb3
Computa true ya que cb2 y cb3 tienen una misma identidad, es decir, el valor de las dos variables es la dirección de un mismo bloque de memoria.
30
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
cb2 == cb1;
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=101saldo=500
:CtaCteBancariacodigo=101saldo=500
cb3
Computa false ya que los objetos tienen distinta identidad, es decir, las variables mantienen referencias a distintos objetos.
31
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
cb2.obtenerCodigo() == cb1.obtenerCodigo() &&
cb2.obtenerSaldo() == cb1.obtenerSaldo();
Representación en memoria
cb1
cb2
:CtaCteBancariacodigo=101saldo=500
:CtaCteBancariacodigo=101saldo=500
cb3
Computa true ya que los objetos tienen el mismo estado interno
Introducción a la Programación Orientada a Objetos IPOO - 2015
32
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
• El operador relacional compara el contenido de las variables, si las variables son de tipo clase, se comparan referencias, esto es, identidades.
• Para comparar el estado interno de los objetos debemos comparar los valores de los atributos.
• Un objetivo de la POO es reducir el impacto de los cambios.
• Si se agrega un atributo titular de clase String a la clase CtaCteBancaria, la expectativa es modificar solo la clase CtaCteBancaria.
Introducción a la Programación Orientada a Objetos IPOO - 2015
33
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
• Para comparar el estado interno de los objetos podemos agregar una consulta a la clase CtaCteBancaria:
class CtaCteBancaria {…public boolean equals(CtaCteBancaria cta){ return codigo == cta.obtenerCodigo() &&
saldo == cta.obtenerSaldo();}…}
Introducción a la Programación Orientada a Objetos IPOO - 2015
34
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
IDENTIDAD, IGUALDAD Y EQUIVALENCIA
• La clase tester verifica el servicio equals provisto por la clase CtaCteBancaria.
• Los objetos ligados cb1 y cb2 tienen distinta identidad pero pueden considerarse equivalentes, en el sentido de que modelan a un mismo objeto del problema.
• La comparación por equivalencia es una operación binaria, un operando es el objeto que recibe el mensaje, el otro operando es el objeto que pasa como parámetro.
if (cb1.equals(cb2))
Introducción a la Programación Orientada a Objetos IPOO - 2015
35
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
TEMARIO
• El concepto de variable.• La memoria.• Variables de tipos elementales.• Variables de tipo clase.• Identidad, Igualdad y Equivalencia.• Los cambios en el sistema
Introducción a la Programación Orientada a Objetos IPOO - 2015
36
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
ALTERNATIVAS DE DISEÑO
• El diseñador del sistema decidió modificar la signatura del método extraer y sugiere que el método no retorne valor alguno.
• Además, sugiere agregar a las responsabilidades de la clase que se verifique si se puede realizar la extracción antes de utilizar el método extraer.
• Analice el impacto del cambio y modifique la clase CtaCteBancaria y todas las clases afectadas.
37
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
ALTERNATIVAS DE DISEÑO
CtaCteBancaria<<Atributos de clase>>maxDescubierto = 1000<<Atributos de instancia>>codigo: enterosaldo: real<<constructores>>CtaCteBancaria(c:entero)CtaCteBancaria(c:entero,s:float)<<comandos>> depositar(mto:real)extraer(mto:real)<<consultas>>puedeExtraer(mto:real):booleanobtenerCodigo():enteroobtenerSaldo():enterotoString():String
Requiere codigo > 0 y Saldo >= -maxDescubierto
Requiere que se haya controlado si se puede extraer
Requieren mto > 0
Introducción a la Programación Orientada a Objetos IPOO - 2015
38
0 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 00 1 1 0 01 0 0 1 11 0 1 1 00 1 1 1 01 0 0 11 1 10 0 1
ALTERNATIVAS DE DISEÑO
• El software para los cajeros automáticos fue desarrollado e instalado correctamente y un tiempo después surge la necesidad de realizar un cambio.
• Cuando el titular de una cuenta corriente desea retirar un monto y su saldo más el máximo en descubierto no alcanzan a cubrirlo, se entrega el monto que deja a la cuenta con un saldo de –máximo en descubierto.
• El diseñador decide mantener la signatura del método extraer, el comando retorna false si la operación no pudo completarse, aunque el cliente haya podido realizar una extracción parcial.
• Analice el impacto del cambio e implemente las modificaciones pertinentes.