01100 10011 10110 01110 1001 1 11 0

  • Slides: 62
Download presentation
01100 10011 10110 01110 1001 1 11 0 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN

01100 10011 10110 01110 1001 1 11 0 0 1 INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Objetos y Clases Sonia Rueda Depto. de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur, Bahía Blanca

EN ESTA CLASE • • Caso de Estudio: Cuenta Corriente Bancaria El diseño de

EN ESTA CLASE • • Caso de Estudio: Cuenta Corriente Bancaria El diseño de una clase La implementación en Java La verificación de una clase Objetos, variables y referencias Mensajes y métodos Parámetros y resultados Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 2

CASO DE ESTUDIO: CUENTA CORRIENTE Un banco ofrece cajeros automáticos a través de los

CASO DE ESTUDIO: CUENTA CORRIENTE Un banco ofrece cajeros automáticos a través de los cuales los clientes pueden realizar: – depósitos, – extracciones y 01100 – consultar el saldo de su cuenta corriente. 10011 En el momento que se crea una cuenta corriente se establece su código 10110 01110 y el saldo se inicializa en 0. 01100 También es posible crear una cuenta corriente estableciendo su código 10011 y saldo inicial. 10110 01110 Una cuenta bancaria puede tener un saldo negativo hasta un máximo 1001 establecido por el banco. 1 11 0 0 El código no se modifica, el saldo cambia con cada depósito o 1 extracción. Introducción a la Programación Orientada a Objetos 3

EL DISEÑO DE UNA CLASE Cta. Cte. Bancaria <<atributo de clase>> max. Descubierto =

EL DISEÑO DE UNA CLASE Cta. Cte. Bancaria <<atributo de clase>> max. Descubierto = 1000 <<atributos de instancia>> codigo: entero saldo: real <<constructores>> Cta. Cte. Bancaria(c: entero) Cta. Cte. Bancaria(c: entero, s: float) <<comandos>> depositar(mto: real) extraer(mto: real): boolean <<consultas>> obtener. Codigo(): entero obtener. Saldo(): real to. String(): String Asegura codigo > 0 y saldo>=-max. Descubierto Introducción a la Programación Orientada a Objetos 01100 10011 10110 Cta. Cte. Bancaria(c: entero, s: float)0 1 1 1 0 Requiere c >0 y s >= 0 01100 depositar(mto: real) 10011 Requiere mto > 0 10110 extraer(mto: real): boolean 01110 Requiere mto > 0 1001 Si mto > saldo+max. Descubierto extraer retorna false y la extracción no se 1 1 1 0 0 realiza 1 Cta. Cte. Bancaria(c: entero) Requiere c >0 4

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo >= -max. Descubierto //Atributos de clase private static final int max. Descubierto=1000; //Atributos de Instancia /*El código se establece al crear la cuenta corriente bancaria y no cambia */ private int codigo; private float saldo; … } 01100 10011 10110 01110 Las variables codigo y saldo son los atributos de instancia de la 1 0 0 1 1 11 clase y pueden ser usados en cualquiera de los servicios provistos por 0 0 la clase Cta. Cte. Bancaria. 1 Introducción a la Programación Orientada a Objetos 5

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo >= -max. Descubierto //Atributos de clase private static final int max. Descubierto=1000; //Atributos de Instancia /*El código se establece al crear la cuenta corriente bancaria y no cambia */ private int codigo; private float saldo; … } Como se declaran privados, sus valores sólo pueden ser accedidos desde el exterior por los servicios públicos que brinda la clase. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 6

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo

LA IMPLEMENTACIÓN EN JAVA class Cta. Cte. Bancaria{ //Asegura código > 0 y saldo >= -max. Descubierto //Atributos de clase private static final int max. Descubierto=1000; //Atributos de Instancia /*El código se establece al crear la cuenta corriente bancaria y no cambia */ private int codigo; private float saldo; … } La variable max. Descubierto es un atributo de clase, los objetos de la clase comparten un mismo valor. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 todos 1 0 0 1 1 11 0 0 1 7

LA IMPLEMENTACIÓN EN JAVA // Constructores public Cta. Cte. Bancaria(int cod) { codigo =

LA IMPLEMENTACIÓN EN JAVA // Constructores public Cta. Cte. Bancaria(int cod) { codigo = cod; saldo = 0; } public Cta. Cte. Bancaria(int cod, float sal) { 01100 10011 codigo = cod; saldo = sal; 10110 } 01110 … 01100 10011 } La clase Cta. Cte. Bancaria no lee ni muestra datos, toda la entrada y salida la hacen las clases que usan a Cta. Cte. Bancaria. Introducción a la Programación Orientada a Objetos 10110 01110 1001 1 11 0 0 1 8

LA IMPLEMENTACIÓN EN JAVA // Comandos public void depositar(float mto){ //Requiere mto > 0

LA IMPLEMENTACIÓN EN JAVA // Comandos public void depositar(float mto){ //Requiere mto > 0 saldo+=mto; } El comando depositar modifica el valor del atributo de instancia saldo. Es responsabilidad de la clase que usa a Cta. Cte. Bancaria asegurar que mto > 0 Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 9

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /* Requiere mto>0. Si el mto

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /* Requiere mto>0. Si el mto es mayor a saldo+max. Descubierto retorna false y la extracción no se realiza */ boolean puede = true; if (saldo+max. Descubierto >= mto) saldo=saldo-mto; else puede = false; return puede; } La variable local puede se crea cuando se inicia la ejecución método y solo puede ser accedida en ese bloque de código. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 del 1001 1 11 0 0 1 10

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /* Requiere mto>0. Si el mto

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /* Requiere mto>0. Si el mto es mayor a saldo+max. Descubierto retorna false y la extracción no se realiza */ boolean puede = true; if (saldo+max. Descubierto >= mto) saldo=saldo-mto; else puede = false; return puede; } La variable mto es un parámetro formal. Cuando se inicia la ejecución del método se crea una nueva variable y se inicializa con el valor del parámetro real. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 11

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /*Requiere mto>0. Si el mto es

LA IMPLEMENTACIÓN EN JAVA public boolean extraer(float mto){ /*Requiere mto>0. Si el mto es mayor a saldo+max. Descubierto retorna false y la extracción no se realiza*/ boolean puede = true; if (saldo+max. Descubierto >= mto) saldo=saldo-mto; else puede = false; return puede; } Al terminar la ejecución de extraer las variables puede y destruyen. Introducción a la Programación Orientada a Objetos 01100 10011 10110 mto 0 se 1 1 1 0 1001 1 11 0 0 1 12

LA IMPLEMENTACIÓN EN JAVA // Consultas public int obtener. Codigo(){ return codigo; } public

LA IMPLEMENTACIÓN EN JAVA // Consultas public int obtener. Codigo(){ return codigo; } public float obtener. Saldo(){ return saldo; } En cada consulta el tipo que precede al nombre del método compatible con el tipo del resultado que retorna. Introducción a la Programación Orientada a Objetos 01100 10011 101100 10011 es 1 0 1 1 0 01110 1001 1 11 0 0 1 13

LA IMPLEMENTACIÓN EN JAVA public String to. String(){ return codigo+" "+saldo; } El nombre

LA IMPLEMENTACIÓN EN JAVA public String to. String(){ return codigo+" "+saldo; } El nombre to. String () es estandar para referirse a una consulta que retorna una cadena de caracteres cuyo valor es la concatenación de los valores de los atributos del objeto que recibe el mensaje. String es una clase provista por Java. El operador + permite convertir valores de diferentes tipos elementales y concatenarlos. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 14

LA CLASE TESTER La clase tester verifica que la clase cumple con sus responsabilidades

LA CLASE TESTER La clase tester verifica que la clase cumple con sus responsabilidades y los servicios se comportan de acuerdo a la funcionalidad y las restricciones especificadas, para un conjunto de casos de prueba. Los casos de prueba pueden ser: • Fijos. • Leídos de un archivo. • Ingresados por el usuario por consola o a través de una interfaz gráfica. • Generados al azar. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 15

LA CLASE TESTER class test. Saldos { public static void main (String a[]){ Cta.

LA CLASE TESTER class test. Saldos { public static void main (String a[]){ Cta. Cte. Bancaria c 1, c 2; int m=1000; c 1 = new Cta. Cte. Bancaria(111, 750); c 2 = new Cta. Cte. Bancaria(112, 500); c 1. depositar(m); System. out. println(c 1. to. String()); … } } El método main que inicia la ejecución 01100 10011 10110 01110 1001 1 11 0 0 1 16

ALCANCE DE LAS VARIABLES class Cta. Cte. Bancaria{ private static final int max. Descubierto=1000;

ALCANCE DE LAS VARIABLES class Cta. Cte. Bancaria{ private static final int max. Descubierto=1000; private int codigo; private float saldo; //Comandos public void depositar(float mto){ //Requiere mto > 0 saldo+=mto; } } class test. Saldos { public static void main (String a[]){ Cta. Cte. Bancaria c 1, c 2; int m=1000; c 1 = new 01100 Cta. Cte. Bancaria(111, 750); 10011 c 2 = new 10110 Cta. Cte. Bancaria(112, 500); 01110 … 01100 } 10011 } 10110 • main puede acceder a las variables m, c 1 y c 2. • depositar puede acceder a max. Descubierto, saldo y mto. 01110 1001 1 11 0 0 codigo, 1 17

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); … Crea un objeto de software ligado a la variable cb de clase Cta. Cte. Bancaria. 01100 10011 10110 01110 1001 1 11 0 0 1 18

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 … 10011 Envía el mensaje depositar al objeto ligado a la variable cb. El objeto ejecuta el método depositar y el saldo se incrementa en 100. 101100 10011 10110 01110 1001 1 11 0 0 1 19

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 10110 01110 … Envía el mensaje extraer al objeto ligado a la variable cb con parámetro 500. El objeto ejecuta el método extraer y retorna un valor booleano. 01100 10011 10110 01110 1001 1 11 0 0 1 20

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 10110 01110 if(!cb. extraer(1500)) 01100 System. out. println("No pudo extraer "+1500); 10011 … 10110 Envía el mensaje extraer al objeto ligado a la variable cb con parámetro 1500. El objeto ejecuta el método extraer y retorna un valor booleano. 01110 1001 1 11 0 0 1 21

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 10110 01110 if(!cb. extraer(1500)) 01100 System. out. println("No pudo extraer "+1500); 10011 … 10110 Si la condición es true, envía el mensaje println que una cadena en consola. 01110 muestra 1001 1 11 0 0 1 22

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la

OBJETOS, MENSAJES Y MÉTODOS class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 10110 01110 if(!cb. extraer(1500)) 01100 System. out. println("No pudo extraer "+1500); 10011 System. out. println(cb. to. String()); 10110 01110 Envía el mensaje to. String al objeto ligado a la variable cb. 1 0 0 1 Muestra en consola la cadena de caracteres que retorna luego 1 1 1 de que el objeto ejecuta el método to. String de la clase 0 0 1 Cta. Cte. Bancaria. 23

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 1 0 1 1 0 01110 if(!cb. extraer(1500)) System. out. println("No pudo extraer "+1500); 0 1 1 0 0 10011 System. out. println(cb. to. String()); 10110 } 01110 1001 1 11 0 0 1 24

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 1 0 1 1 0 01110 if(!cb. extraer(1500)) System. out. println("No pudo extraer "+1500); 0 1 1 0 0 10011 System. out. println(cb. to. String()); 10110 } 01110 1001 1 11 0 0 1 25

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase

LA CONSOLA class test. Cta. Cte. Bancaria { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); cb. depositar(100); 01100 if(!cb. extraer(500)) 10011 System. out. println("No pudo extraer "+500); 1 0 1 1 0 01110 if(!cb. extraer(1500)) System. out. println("No pudo extraer "+1500); 0 1 1 0 0 10011 System. out. println(cb. to. String()); 10110 } 01110 1001 1 11 0 0 1 26

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte.

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); • Declara la variable cb. • Crea un objeto de clase Cta. Cte. Bancaria. • Liga el objeto a la variable. La creación de un objeto provoca: • Reservar espacio en memoria para almacenar el estado interno del objeto. • Ejecutar constructor con dos parámetros. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 27

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte.

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); Es equivalente al segmento: Cta. Cte. Bancaria cb; cb = new Cta. Cte. Bancaria(123, 600); Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 28

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte.

VARIABLES, OBJETOS y REFERENCIAS La instrucción: Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria(123, 600); Es equivalente al segmento: Cta. Cte. Bancaria cb; cb = new Cta. Cte. Bancaria(123, 600); Y se puede graficar a través de un diagrama de objetos: : Cta. Cte. Bancaria cb codigo=123 saldo=600 Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 29

VARIABLES, OBJETOS y REFERENCIAS El valor de la variable cb es una referencia a

VARIABLES, OBJETOS y REFERENCIAS El valor de la variable cb es una referencia a un objeto de clase Cta. Cte. Bancaria. El estado interno del objeto almacena los valores de dos variables que corresponden a los atributos de instancia del objeto, determinados por su clase. : Cta. Cte. Bancaria cb codigo=123 saldo=600 Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 30

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String a[]){ Cta. Cte. Bancaria cb 1 = new Cta. Cte. Bancaria(123, 600); Cta. Cte. Bancaria cb 2 = new Cta. Cte. Bancaria(124); cb 1. depositar(100); 01100 … 10011 } 10110 // Constructores public Cta. Cte. Bancaria(int cod) { codigo = cod; saldo = 0; } public Cta. Cte. Bancaria(int cod, float sal) { codigo = cod; saldo = sal; } … } 01110 01100 10011 10110 01110 1001 1 11 0 0 1 31

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String a[]){ Cta. Cte. Bancaria cb 1 = new Cta. Cte. Bancaria(123, 600); Cta. Cte. Bancaria cb 2 = new Cta. Cte. Bancaria(124); cb 1. depositar(100); 01100 … 10011 } 10110 // Constructores public Cta. Cte. Bancaria(int cod) { codigo = cod; saldo = 0; } public Cta. Cte. Bancaria(int cod, float sal) { codigo = cod; saldo = sal; } … } 01110 01100 10011 10110 01110 1001 1 11 0 0 1 32

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String a[]){ Cta. Cte. Bancaria cb 1 = new Cta. Cte. Bancaria(123, 600); Cta. Cte. Bancaria cb 2 = new Cta. Cte. Bancaria(124); cb 1. depositar(100); 01100 … 10011 } 10110 cb 1 : Cta. Cte. Bancaria codigo=123 saldo=600 El valor de la variable cb 1 es una referencia a un objeto de Cta. Cte. Bancaria. 01110 01100 10011 10110 01110 1001 clase 1 11 0 0 1 33

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String

VARIABLES, OBJETOS y REFERENCIAS class test. Dos. Cuentas { public static void main (String a[]){ Cta. Cte. Bancaria cb 1 = new Cta. Cte. Bancaria(123, 600); Cta. Cte. Bancaria cb 2 = new Cta. Cte. Bancaria(124); cb 1. depositar(100); 01100 … 10011 } 10110 01110 cb 1 cb 2 01100 10011 codigo=123 codigo=124 10110 saldo=600 saldo=0 01110 1001 La estructura del estado interno de los objetos de clase 1 11 Cta. Cte. Bancaria está conformada por las variables codigo 0 0 1 y saldo. : Cta. Cte. Bancaria 34

ALTERNATIVAS DE DISEÑO Cta. Cte. Bancaria <<Atributos de clase>> max. Descubierto = 1000 <<Atributos

ALTERNATIVAS DE DISEÑO Cta. Cte. Bancaria <<Atributos de clase>> max. Descubierto = 1000 <<Atributos de instancia>> codigo: entero saldo: real <<constructores>> Cta. Cte. Bancaria(c: entero) Cta. Cte. Bancaria(c: entero, s: float) <<comandos>> depositar(mto: real) extraer(mto: real) <<consultas>> puede. Extraer(mto: real): boolean obtener. Codigo(): entero obtener. Saldo(): entero to. String(): String Asegura codigo > 0 y Saldo >= -max. Descubierto Cta. Cte. Bancaria(c: entero) Requiere c >0 01100 10011 Cta. Cte. Bancaria(c: entero, s: float)1 0 1 1 0 Requiere c >0 y s >= 0 01110 depositar(mto: real) 01100 Requiere mto > 0 10011 extraer(mto: real) 10110 requiere mto>0 01110 puede. Extraer(mto) true 1001 1 11 puede. Extraer(mto) 0 0 requiere mto>0 1 Retorna mto <= saldo+max. Descubierto 35

ALTERNATIVAS DE DISEÑO public void extraer(float mto){ /*Requiere puede. Extraer(mto) true*/ saldo=saldo-mto; } public

ALTERNATIVAS DE DISEÑO public void extraer(float mto){ /*Requiere puede. Extraer(mto) true*/ saldo=saldo-mto; } public boolean puede. Extraer(float mto){ /*Requiere mto>0. Retorna mto <= saldo+max. Descubierto */ return mto <= saldo+max. Descubierto; } Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 36

ALCANCE DE LAS VARIABLES class Cta. Cte. Bancaria{ private static final int max. Descubierto=1000;

ALCANCE DE LAS VARIABLES class Cta. Cte. Bancaria{ private static final int max. Descubierto=1000; private int codigo; private float saldo; //Comandos public void depositar(float mto){ //Requiere mto > 0 saldo+=mto; } } class test. Saldos { public static void main (String a[]){ Cta. Cte. Bancaria c 1, c 2; int m=0; c 1 = new 01100 Cta. Cte. Bancaria(111, 750); 10011 c 2 = new 10110 Cta. Cte. Bancaria(112, 500); 01110 … 01100 } 10011 } 10110 • main puede acceder a las variables m, c 1 y c 2. • depositar puede acceder a max. Descubierto, saldo y mto. 01110 1001 1 11 0 0 codigo, 1 37

ALTERNATIVAS DE DISEÑO class test. Una. Cuenta { //Verifica los servicios de la clase

ALTERNATIVAS DE DISEÑO class test. Una. Cuenta { //Verifica los servicios de la clase Cta. Cte. Bancaria public static void main (String a[]){ Cta. Cte. Bancaria cb = new Cta. Cte. Bancaria (123, 600); cb. depositar(100); if(!cb. puede. Extraer(500)) System. out. println("No pueda extraer "+500); 0 1 1 0 0 else 10011 cb. extraer(500); 10110 if(!cb. puede. Extraer(1500)) System. out. println("No pueda extraer "+1500); 0 1 1 1 0 01100 else cb. extraer(1500); 10011 System. out. println (cb. to. String()); } 10110 } 01110 1001 En este diseño cada clase que usa a Cta. Cte. Bancaria asume 1 11 0 0 la responsabilidad de controlar que sea posible extraer el monto, 1 antes de enviar el mensaje extraer. Introducción a la Programación Orientada a Objetos 38

LOS CAMBIOS EN LOS REQUERIMIENTOS Un banco ofrece cajeros automáticos a través de los

LOS CAMBIOS EN LOS REQUERIMIENTOS Un banco ofrece cajeros automáticos a través de los cuales los clientes pueden realizar depósitos, extracciones y consultar el saldo de su cuenta corriente. En el momento que se crea una cuenta corriente se establece su código y el saldo se inicializa en 0. También es posible crear una 0 1 1 0 0 10011 cuenta corriente estableciendo su código y saldo inicial. Una 1 0 1 1 0 cuenta bancaria puede tener un saldo negativo hasta un máximo 01110 01100 establecido por el banco. 10011 El código no se modifica, el saldo cambia con cada depósito o 1 0 1 1 0 extracción. La clase brinda servicios para determinar el código 0 1 1 1 0 1001 de la cuenta con menor saldo entre dos cuentas y cuál es la 1 1 1 cuenta con menor saldo, entre dos cuentas. 0 0 1 Introducción a la Programación Orientada a Objetos 39

LOS CAMBIOS EN EL DISEÑO Cta. Cte. Bancaria <<Atributos de clase>> max. Descubierto =

LOS CAMBIOS EN EL DISEÑO Cta. Cte. Bancaria <<Atributos de clase>> max. Descubierto = 1000 <<Atributos de instancia>> codigo: entero saldo: real <<constructores>> Cta. Cte. Bancaria(c: entero) Cta. Cte. Bancaria(c: entero, s: float) <<comandos>> depositar(mto: real) extraer(mto: real): boolean <<consultas>> obtener. Codigo(): entero obtener. Saldo(): entero to. String(): String mayor. Saldo(cta: Cta. Cte. Bancaria): entero cta_mayor. Saldo(cta: Cta. Cte. Bancaria): Cta. Cte. Bancaria Asegura codigo > 0 y Saldo >= -max. Descubierto 01100 10011 10110 Cta. Cte. Bancaria(c: entero, s: float) 01110 Requiere c >0 y s >= 0 01100 depositar(mto: real) 10011 Requiere mto > 0 10110 extraer(mto: real) 01110 Requiere 0 < mto <= 1001 saldo+max. Descubierto 1 11 0 0 1 Cta. Cte. Bancaria(c: entero) Requiere c >0 40

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ } El método mayor. Saldo recibe como parámetro a un de clase Cta. Cte. Bancaria. Introducción a la Programación Orientada a Objetos 01100 10011 10110 objeto 0 1 1 1 0 1001 1 11 0 0 1 41

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return codigo ; 10110 else 01110 return cta. obtener. Codigo() ; 01100 10011 } Compara el saldo del objeto que recibe el mensaje con el saldo del objeto recibido como parámetro. Retorna el código de la cuenta con mayor saldo. Introducción a la Programación Orientada a Objetos 10110 01110 1001 1 11 0 0 1 42

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return codigo ; 10110 else 01110 return cta. obtener. Codigo() ; 01100 10011 } 10110 1110 Tanto si la expresión lógica computa true o false, el resultado 0 es 1001 un valor entero. 1 11 0 0 El diseñador no indicó qué retorna si las cuentas tienen el 1 mismo saldo, la decisión la tomó el programador. Introducción a la Programación Orientada a Objetos 43

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return codigo ; 10110 else 01110 return cta. obtener. Codigo() ; 01100 10011 } El método tiene dos puntos de salida, aun así no se compromete la legibilidad del código. Introducción a la Programación Orientada a Objetos 10110 01110 1001 1 11 0 0 1 44

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el

LOS CAMBIOS EN LA IMPLEMENTACIÓN public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return codigo ; 10110 else 01110 return cta. obtener. Codigo() ; 01100 10011 } 10110 01110 El método solo accede directamente a los atributos de instancia 1001 del objeto que recibe el mensaje. 1 11 Los atributos del objeto ligado a la variable cta son accedidios 0 0 1 a través de los servicios provistos por su clase. Introducción a la Programación Orientada a Objetos 45

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ } El resultado es un objeto de clase Cta. Cte. Bancaria, o mejor dicho, una referencia a un objeto de clase Cta. Cte. Bancaria. Introducción a la Programación Orientada a Objetos 01100 10011 10110 01110 1001 1 11 0 0 1 46

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return this ; 10110 else 01110 return cta ; 01100 10011 } El condicional compara el saldo de la cuenta corriente que recibe el mensaje con el saldo de la cuenta corriente que se recibe como parámetro. Introducción a la Programación Orientada a Objetos 10110 01110 1001 1 11 0 0 1 47

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){

LOS CAMBIOS EN LA IMPLEMENTACIÓN public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna la cuenta corriente bancaria que tiene mayor saldo. Requiere cta ligada*/ if (saldo > cta. obtener. Saldo()) 01100 10011 return this ; 10110 else 01110 return cta ; 01100 10011 } Cta_mayor. Saldo retorna una referencia a un objeto de clase Cta. Cte. Bancaria. La palabra reservada this permite nombrar al objeto que recibe el mensaje. Introducción a la Programación Orientada a Objetos 10110 01110 1001 1 11 0 0 1 48

LOS CAMBIOS EN LA CLASE TESTER class test. Parametros { public static void main

LOS CAMBIOS EN LA CLASE TESTER class test. Parametros { public static void main (String a[]){ Cta. Cte. Bancaria cb, sm; cb = new Cta. Cte. Bancaria(111, 1000) sm = new Cta. Cte. Bancaria (112, 500); int m = cb. mayor. Saldo(sm); 01100 0011 System. out. println("Codigo de la Cta Mayor Saldo"+ 1 m); 10110 } 01110 } El cambio en la especificación de los requerimientos y en el diseño, obliga a modificar también la clase tester o crear una nueva, para verificar los nuevos servicios. 01100 10011 10110 01110 1001 1 11 0 0 1 49

OBJETOS Y PARÁMETROS int m = cb. mayor. Saldo(sm); Envía el mensaje mayor. Saldo

OBJETOS Y PARÁMETROS int m = cb. mayor. Saldo(sm); Envía el mensaje mayor. Saldo al objeto ligado a la variable cb. El parámetro real es una variable que referencia a un objeto de clase Cta. Cte. Bancaria. La consulta retorna un valor compatible con el tipo del resultado, que se asigna a la variable m. 01100 10011 10110 01110 1001 1 11 0 0 1 50

OBJETOS Y PARÁMETROS int m = cb. mayor. Saldo(sm); public int mayor. Saldo(Cta. Cte.

OBJETOS Y PARÁMETROS int m = cb. mayor. Saldo(sm); public int mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna el código de la cuenta corriente bancaria que tiene mayor saldo. Requiere cta 01100 10011 ligada*/ 10110 if (saldo > cta. obtener. Saldo()) 01110 return codigo; 01100 else 10011 return cta. obtener. Codigo(); 10110 01110 } El método mayor. Saldo recibe como parámetro a un objeto de clase Cta. Cte. Bancaria y retorna un entero. 1001 1 11 0 0 1 51

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); Envía el

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); Envía el mensaje cta_mayor. Saldo al objeto ligado a la variable cb. El parámetro actual es una variable que referencia a un de clase Cta. Cte. Bancaria. La consulta retorna una referencia a un objeto de clase Cta. Cte. Bancaria. 01100 10011 objeto 1 0 1 1 0 01110 01100 10011 10110 01110 1001 1 11 0 0 1 52

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); • Si

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); • Si el objeto ligado al parámetro tiene mayor saldo, el resultado que debe retornar es justamente la referencia a este objeto. 0 1 1 0 0 10011 • Si el objeto que recibe el mensaje tiene mayor saldo, el resultado que debe retornar es la referencia a este objeto. 10 01 11 11 00 01100 10011 10110 01110 1001 1 11 0 0 1 53

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); public Cta.

OBJETOS, PARÁMETROS Y RESULTADOS Cta. Cte. Bancaria cm = cb. cta_mayor. Saldo(sm); public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta){ /*Retorna la cuenta corriente bancaria que 0 1 1 0 0 tiene mayor saldo. Requiere cta ligada*/ 1 0 0 1 1 if (saldo > cta. obtener. Saldo()) 10110 01110 return this; 01100 else 10011 return cta; 10110 } 01110 1001 El valor del parámetro real sm, declarado como variable local 1 1 1 en la clase tester, se asigna al parámetro formal cta, que 0 0 1 solo es visible cta_mayor. Saldo. 54

OBJETOS, PARÁMETROS Y RESULTADOS public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta ){

OBJETOS, PARÁMETROS Y RESULTADOS public Cta. Cte. Bancaria cta_mayor. Saldo(Cta. Cte. Bancaria cta ){ /*Retorna la cuenta corriente bancaria que 0 1 1 0 0 tiene mayor saldo. Requiere cta ligada*/ 1 0 0 1 1 if (saldo > cta. obtener. Saldo()) 10110 01110 return this; 01100 else 10011 return cta; 10110 } 01110 1001 La variable cta solo es visible y puede ser usada durante la 1 1 1 ejecución de cta_mayor. Saldo. Cuando el método termina, 0 la 0 1 variable se destruye. 55

OBJETOS, PARÁMETROS Y RESULTADOS System. out. println (cm. to. String()); Envía el mensaje to.

OBJETOS, PARÁMETROS Y RESULTADOS System. out. println (cm. to. String()); Envía el mensaje to. String al objeto ligado a la variable cm. La variable cm está ligada al objeto que retornó como resultado 01100 en respuesta al mensaje cta_mayor. Saldo enviado en la 1 0 0 1 1 10110 instrucción anterior. 01110 El método to. String retorna la concatenación de los valores 0 1 1 0 0 10011 de los atributos del objeto ligado a la variable cm. 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos 56

IDENTIDAD, IGUALDAD Y EQUIVALENCIA Cada objeto de software tiene una identidad, una propiedad que

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. 01100 Si dos variables son iguales, mantienen una misma referencia, 1 0 0 1 1 10110 entonces están ligadas a un mismo objeto. 01110 01100 Cuando dos objetos mantienen el mismo estado interno, 10011 decimos que son equivalentes, aun cuando tienen diferente 1 0 1 1 0 01110 identidad. 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos 57

IDENTIDAD, IGUALDAD Y EQUIVALENCIA class test. Referencias { public static void main (String a[]){

IDENTIDAD, IGUALDAD Y EQUIVALENCIA class test. Referencias { public static void main (String a[]){ boolean ig 1, ig 2, ig 3; Cta. Cte. Bancaria c 1, c 2, c 3, c 4, c 5; c 1 = new Cta. Cte. Bancaria(111, 750); c 2 = new Cta. Cte. Bancaria(112, 500); c 3 = c 1. cta_mayor. Saldo(c 2); c 4 = c 1; c 5 = new Cta. Cte. Bancaria(111, 750); ig 1 = c 1 == c 3; ig 2 = c 1 == c 4; ig 3 = c 1 == c 5; } } 01100 10011 10110 01110 1001 1 11 0 0 1 58

IDENTIDAD, IGUALDAD Y EQUIVALENCIA c 1 : Cta. Cte. Bancaria codigo=111 saldo=750 c 3

IDENTIDAD, IGUALDAD Y EQUIVALENCIA c 1 : Cta. Cte. Bancaria codigo=111 saldo=750 c 3 c 4 ig 1 = c 1 == c 3; ig 2 = c 1 == c 4; ig 3 = c 1 == c 5; El operador relacional == compara c 2 cta : Cta. Cte. Bancaria codigo=112 saldo=500 : Cta. Cte. Bancaria 01100 codigo=111 10011 saldo=750 101100 10011 10110 01110 1001 1 11 referencias. 0 0 1 c 5 59

IDENTIDAD, IGUALDAD Y EQUIVALENCIA class test. Estado. Interno { public static void main (String

IDENTIDAD, IGUALDAD Y EQUIVALENCIA class test. Estado. Interno { public static void main (String a[]){ Cta. Cte. Bancaria c 1, c 2; c 1 = new Cta. Cte. Bancaria(111, 750); 01100 c 2 = new Cta. Cte. Bancaria(111, 750); 10011 if(c 1. obtener. Codigo()==c 2. obtener. Codigo() &&1 0 1 1 0 c 1. obtener. Saldo()==c 2. obtener. Saldo ()) 0 1 1 1 0 01100 System. out. println(“Igual Estado Interno”); 10011 10110 } 01110 } 1001 El operador relacional == compara valores de variables elementales. 1 11 0 0 1 60

IDENTIDAD, IGUALDAD Y EQUIVALENCIA c 1 : Cta. Cte. Bancaria codigo=111 saldo=750 c 2

IDENTIDAD, IGUALDAD Y EQUIVALENCIA c 1 : Cta. Cte. Bancaria codigo=111 saldo=750 c 2 : Cta. Cte. Bancaria codigo=111 saldo=750 Dos objetos que tienen el mismo estado interno son equivalentes. 01100 10011 10110 01110 1001 1 11 0 0 1 61

EN LA PRÓXIMA CLASE Asumiremos que • Pueden implementar en Java una clase con

EN LA PRÓXIMA CLASE Asumiremos que • Pueden implementar en Java una clase con atributos de tipo elemental, partiendo de un diagrama que incluye atributos de clase y de instancia, constructores, comandos 01100 y consultas. 10011 • Pueden verificar los servicios provistos por una clase para 10110 01110 un conjunto de casos de prueba fijos o leídos por consola. 01100 • Han completado el práctico 2 y comenzado el 3 10011 10110 01110 1001 1 11 0 0 1 Introducción a la Programación Orientada a Objetos 62