Beruflich Dokumente
Kultur Dokumente
Tema 4
Comportamiento: Qu hace?
El comportamiento indica qu sabe hacer el objeto, es decir cules son sus responsabilidades. El comportamiento se especifica a travs del conjunto de mensajes que el objeto sabe responder. Un objeto se define en trminos de su comportamiento, por lo que al modelar con objetos lo primero que se debe establecer es qu sabe hacer cada objeto. El objeto debe verse como una entidad activa, con la capacidad de llevar tareas adelante. Adems, se debe tener en cuenta que para llevar a cabo su trabajo, un objeto puede colaborar con otros objetos. Tambin debe quedar claro que nada impide que distintos objetos puedan tener el mismo comportamiento: slo basta con que entiendan los mismos mensajes. Comnmente al conjunto de mensajes que un objeto puede entender se lo denomina protocolo.
Programacin IV
Tema 4
Hay que tener en cuenta que la implementacin no es esttica, sino que puede cambiar a lo largo del tiempo. Esto significa que el conjunto de mtodos y colaboradores puede cambiar dinmicamente, aunque idealmente esto no debera ocurrir si las entidades estn correctamente definidas.
El estado interno
El estado interno es el conjunto de atributos de un objeto, representado por un conjunto de variables de instancia. Dichas variables de instancia acompaan al objeto durante todo su ciclo de vida. Una variable de instancia puede hacer referencia a una propiedad intrnseca del objeto que representa, o bien a otro objeto que colabora con el objeto primario para que ste lleve a cabo sus responsabilidades. A lo largo de la vida del objeto, las propiedades y colaboradores pueden cambiar. Por ejemplo, al depositar $100 en una cuenta bancaria la variable de instancia saldo cambiar su valor. Este estado interno es privado del objeto. Es una de las caractersticas fundamentales del paradigma, y resulta crucial para lograr software escalable. Por definicin, las variables de instancia (estructura interna) de un objeto son privadas a ste. El nico que puede acceder y manipular sus v.i. es el propio objeto. Si un objeto externo quiere acceder a una v.i. lo tiene que hacer por medio del envo de un mensaje. Esto le da la posibilidad al objeto de decidir qu es lo que quiere publicar, o cmo quiere hacerlo. En la siguiente figura puede observarse un ejemplo concreto: un objeto Caja de Ahorro, cuyo estado interno queda representado por sus v.i.: toma un valor particular en el caso del saldo, e indica una relacin de conocimiento con el objeto Persona, que colabora con l a travs de la variable titular. A su vez puede determinarse el comportamiento (qu hace el objeto), a travs del conjunto de mtodos (depositar(), extraer(), saldo(), etc), que responde a sendos mensajes. Atencin: No se debe confundir el atributo saldo con el mtodo saldo().
Programacin IV
Tema 4
Envo de mensajes
Para poder enviarle un mensaje a un objeto, hay que conocerlo. Esto significa que debe haber una relacin entre ellos. El objeto receptor responde en forma activa, ejecutando el mtodo asociado al mensaje, siempre y cuando ste exista. Como resultado del envo de un mensaje, siempre se retorna un objeto. El mtodo, es decir la implementacin (el cdigo), especifica qu hace el objeto receptor al recibir el mensaje. Cuando un objeto (emisor) le enva un mensaje a otro objeto (receptor), el objeto receptor responde activando el mtodo asociado a este mensaje, siempre que el mensaje recibido forme parte del protocolo del objeto receptor. Caso contrario, pueden darse distintas situaciones, dependiendo del lenguaje: algunos lenguajes pueden evitar esta situacin mediante un sistema de tipos fuerte que chequee estas situaciones en tiempo de compilacin, mientras que otros brindan una mayor libertad en cuanto al envo de mensajes y responden, eventualmente, con un error en tiempo de ejecucin.
Formato de mensajes
Tpicamente un mensaje tiene un nombre, que se recomienda tenga significado en el dominio del problema, dado que esto facilita el futuro entendimiento del sistema. Puede o no tener parmetros, y se invoca sobre un objeto. Los distintos lenguajes de programacin orientados a objeto proponen una sintaxis particular para indicar el envo de un mensaje. El formato aceptado habitualmente es el siguiente: Ejemplo: objeto_receptor.nombre_de_mensaje(parmetros); unaCuenta.depositar(100);
Programacin IV
Tema 4
Mtodos
Un mtodo es la contraparte funcional del mensaje. Por cada mensaje definido como parte del protocolo de un objeto, debe existir un mtodo asociado que exprese la forma de llevar a cabo la tarea solicitada por dicho mensaje, es decir, cmo se hace. El cmo en un mtodo puede implicar bsicamente tres cosas: 1) Modificar el estado del objeto. Esto implica asignar a una v.i. un valor distinto al que tiene. Por ejemplo, en el caso que la cuenta bancaria conociera a su titular, se podra tener un mtodo del estilo: asignarTitular(unaPersona){ titular := unaPersona; } 2) Colaborar con otros objetos. En la mayora de los casos, para llevar a cabo una determinada responsabilidad, el objeto necesita colaborar con otros objetos. Supongamos que, para alquilar una pelcula es necesario saber si el usuario no es deudor. Luego, el mtodo alquilar en el objeto videoClub sera algo de la forma: alquilar(unaPelicula, unCliente){ if (unCliente.esDeudor()) { System.out.println(Error); } else { unaPelicula.alquilarA(unCliente) } En este caso el video club bsicamente funciona como un coordinador de comportamiento del cliente y de la pelcula. 3) Retornar y terminar. Por ltimo, en un mtodo se puede optar por retornar un resultado. Por ejemplo, en el caso de la cuenta bancaria es lgico que le podamos pedir el saldo: double saldo(){ return saldo; }
El objeto receptor procede con la activacin del mtodo saldo() y con su ejecucin.
Programacin IV
Tema 4
El mtodo simplemente retorna el saldo actual de la caja de ahorro (el nmero 600)
Ese valor es el resultado que el emisor obtiene en respuesta al envo del mensaje saldo()
Especificacin de un mtodo
Cada lenguaje de programacin propone su propio modo de especificar un mtodo. Particularmente en Java se utiliza el siguiente (bsico, no completo):
/** Breve comentario del mtodo. * @param tipo_dato parametro1, tipo_dato parametro2. * @return Devuelve una variable de tipo tipo_retorno * @throws No dispara ninguna excepcion. */ tipo_retorno nombreMensaje(tipo_dato parametro1, tipo_dato parametro2){ tipo_dato temp1; tipo_dato temp2; varDeInstancia = parametro1; temp1 = parametro2; temp2 = temp1.unMensaje(parametro1); return temp2; }
La cebecera del mtodo, incluidos los parmetros, recibe el nombre de firma (signature en ingles). Ejemplo: implementacin del mtodo depositar() del objeto caja de ahorro.
/** Agrega unMonto al saldo actual de la cuenta. * @param double unMonto. * @return No devuelve ningn valor. * @throws No dispara ninguna excepcion. */ public void depositar(double unMonto){ saldo = saldo + unMonto; }
Programacin IV
Por ejemplo, si se desea obtener el saldo de una caja de ahorro, se escribir lo siguiente:
/** Retorna el saldo actual de la cuenta. * @return Un valor de tipo double. * @throws No dispara ninguna excepcion. */ double getSaldo(){ return saldo; }
Tema 4
Objeto y Clase
Una clase representa otro nivel de abstraccin. Segn lo expresado, un objeto es una abstraccin de una entidad del modelo del dominio. Dado que generalmente en el dominio del problema aparece un conjunto de objetos que se comportan en forma similar, surge la necesidad de encontrar una forma de definir el comportamiento de todos los objetos en forma general. Por ejemplo, si el objeto que se est analizando es una caja de ahorro, es evidente que en un banco habr miles de objetos de este tipo, uno por cada caja de ahorro existente en el banco. Se puede afirmar que todos estos objetos tendrn el mismo comportamiento, y si hay algn cambio (por ejemplo, el inters devuelto), el mismo se reflejar en todos los objetos de este tipo. Esto lleva a pensar que sera til algn mecanismo que permita agrupar el comportamiento comn a un conjunto de objetos, de manera que pueda ser reutilizado sin tener que ser especificado individualmente. Por otra parte, el estado interno de cada caja de ahorro ser diferente (por ejemplo, tendrn distinto saldo), pero todas compartirn la misma estructura interna (todas conocen su saldo, titular, etc.). Desde el punto de vista de la reutilizacin, es as como surge la nocin de clase: como una herramienta que permite factorizar y reutilizar estructura y comportamiento en comn. Por este motivo, aparece la nocin de clase Caja de Ahorro, la cual se utiliza para describir el comportamiento de todas y cada una de sus ocurrencias (instancias). Cada objeto es un elemento nico de la clase en la que se basa. Una clase es como un molde de un tipo especfico de objeto, por lo tanto un objeto es lo que se crea a partir del molde. La ventaja que representa una clase est en que permite describir en un slo lugar el comportamiento genrico de un conjunto de objetos. Una vez definido este comportamiento, es posible crear objetos que lo reutilicen y se comporten de la manera all descripta. Como definicin de clase se puede tomar la siguiente: Una clase es una descripcin abstracta de un conjunto de objetos. Una clase especifica qu forma tendrn sus instancias (sus variables de instancia) y cmo respondern a los mensajes que se le enven. De esta forma, una clase puede ser vista como una descripcin de sus instancias y como un repositorio de comportamiento. Cuando se le enva un mensaje a un objeto, lo que hace el intrprete es buscar en la clase del objeto receptor un mtodo con el cual responder al envo del mensaje. De sta forma, todos los objetos que comparten una misma clase responden en forma similar al envo de un mensaje. En el caso de la cuenta bancaria, dado que en un banco habr miles de cuentas, lo que se hace es modelar la nocin de cuenta bancaria en una clase. Esta clase definir qu variables tendrn sus instancias, as como los mensajes a los que puede responder. Por ejemplo, la clase se puede llamar CuentaBancaria, y especificar que sus instancias (cada caja de ahorro particular) tiene dos variables (saldo y titular) y que puede responder a los mensajes saldo(), titular(), depositar(unMonto) y extraer(unMonto).
Programacin IV
Tema 4
Dado que las clases son las encargadas de describir a sus instancias, ante la necesidad de crear una nueva instancia, lo lgico es pedrselo a la clase. Por ese motivo, la clase tiene la responsabilidad de crear sus instancias. Por ejemplo, para crear una nueva cuenta bancaria, se debe pedir a la clase CuentaBancaria que retorne una nueva instancia. Es frecuente la confusin entre clases e instancias. Es importante remarcar que una clase es un molde de estructura y comportamiento, as como la encargada de crear a sus instancias. Una vez que se crea una instancia, esta tiene sus propias variables. Por ejemplo, al crear dos cuentas bancarias, cada una tendr su saldo y su titular. Lo nico que comparten es que ambas son instancia de la misma clase, lo que implica que al enviarles un mensaje, el mtodo que se activar se buscar en la clase CuentaBancaria, que es comn a las dos.
En la figura puede observarse una clase CajaDeAhorro, que define el comportamiento y la estructura comn a todas sus instancias. Una CajaDeAhorro sabr extraer(unMonto) de su saldo, depositar(unMonto) y devolver su saldo actual. Adems deber colaborar con un objeto que cumplir el rol de titular de la cuenta. Se observan dos instancias de CajaDeAhorro, cada una con su propio estado interno. Las dos instancias de la clase CajaDeAhorro comparten el mismo comportamiento, definido en la propia clase. Esto evita la repeticin de los mtodos en cada objeto.
Clase y UML
Las clases se especifican por medio de un nombre, la estructura interna que tendrn sus instancias y los mensajes y mtodos asociados que definen su comportamiento. El nombre debe comenzar con mayscula y no contener espacios. Las variables de instancia (v.i.) representan el estado o estructura interna de las instancias de la clase. Por ltimo, se detalla el conjunto de mensajes que entender una instancia de dicha clase, tambin llamado protocolo. La representacin grfica de una clase, utilizando una versin simplificada del lenguaje UML es:
Programacin IV
Tema 4
Programacin IV
Tema 4
En lenguajes como Java o C++ existe la nocin de mtodos static, que indican que son mensajes de clase. Atributos y mensajes estticos se representan en UML con el nombre subrayado.
Atributos estticos
Un atributo esttico es una variable miembro que no se asocia a un objeto (instancia) de una clase, sino que se asocia a la clase misma; no hay una copia del dato para cada objeto sino una sola copia que es compartida por todos los objetos de la clase. Por ejemplo:
class Punto { private int x , y ; static int numPuntos = 0; Punto ( int a , int b ) { x = a ; y = b; numPuntos ++ ; } }
En el ejemplo numPuntos es un contador que se incrementa cada vez que se crea una instancia de la clase Punto. Para declararlo, se coloca el modificador static delante del tipo. El acceso a las variables estticas desde fuera de la clase donde se definen se raliza a travs del nombre de la clase y no del nombre del objeto como sucede con las variables miembro normales (no estticas). En el ejemplo anterior puede escribirse:
int x = Punto.numPuntos;
No obstante tambin es posible acceder a las variables estticas a travs de una referencia a un objeto de la clase. Por ejemplo:
Para los mtodos, la idea es la misma que para los atributos: los mtodos estticos se asocian a una clase, no a una instancia. Por ejemplo:
class Punto { private int x , y ; static int numPuntos = 0; Punto ( int a , int b ) { x = a ; y = b; numPuntos ++ ; } static int cuantosPuntos() { return numPuntos; } }
Programacin IV
Tema 4
El acceso a los mtodos estticos se hace igual que a los atributos estticos, es decir, usando el nombre de la clase, en lugar de usar una referencia:
Formas de conocimiento
A la hora de programar existen diversas formas de conocimiento. No se debe olvidar que, para que un objeto le enve un mensaje a otro debe conocerlo, o sea, nombrarlo. Se dice que se establece una ligadura (binding) entre un nombre y un objeto. Una forma de conocerse entre objetos es mediante una variable de instancia. En UML esto se representara del siguiente modo:
CajaAhorro - saldo: double titular Persona - nombre: string
class Circulo { Punto centro; int radio; . . . Circulo elMayor(Circulo c) { if (radio > c.radio) return this; else return c; } }
El mtodo elMayor() devuelve una referencia al crculo que tiene mayor radio, comparando los radios del Circulo c que se recibe como argumento y el propio. En caso de que el propio resulte mayor el mtodo debe devolver una referencia a si mismo. Esto se consigue con la expresin return this.
Integrando conceptos
10
Programacin IV
Diagrama de Clases en UML:
CajaAhorro Titular - numero: int - saldo: double - numCajas: int + numero(): int + saldo(): double + saldo(double) + titular(): Persona + depositar(double) + cuantasCajas(): int + mostrar() titular Persona - dni: int - nombre: string + dni(): int + nombre(): string + mostrar()
Tema 4
Generar en java las clases representadas en UML, con sus respectivos constructores y mtodos de acceso a sus variables privadas. Generar adems una clase que permita crear una caja de ahorro para Mara Gonzales, cuyo DNI es 25.132.456, con un saldo inicial de $1000, y otra para Juan Dominguez, DNI 17.425.236, sin saldo inicial. Luego mostrar en pantalla el titular con su saldo.
11
Programacin IV
private static int numCajas = 0; public CajaAhorro( Persona t ) { titular = t; saldo = 0; numCajas ++ ; numero = numCajas; } public CajaAhorro( Persona t , double s) { titular = t; saldo = s; numCajas ++ ; numero = numCajas; } /** Retorna el numero de la cuenta. * @return Un valor de tipo int. * @throws No dispara ninguna excepcion. */ public int numero(){ return numero; } /** Retorna el titular de la cuenta. * @return Un objeto de tipo Persona. * @throws No dispara ninguna excepcion. */ public Persona titular(){ return titular; } /** Retorna el saldo actual de la cuenta. * @return Un valor de tipo double. * @throws No dispara ninguna excepcion. */ public double saldo(){ return saldo; } /** Asigna unMonto al saldo actual de la cuenta. * @param double unMonto. * @return No devuelve ningn valor. * @throws No dispara ninguna excepcion. */ public void saldo(double unMonto){ saldo = unMonto; } /** Agrega unMonto al saldo actual de la cuenta. * @param double unMonto. * @return No devuelve ningn valor. * @throws No dispara ninguna excepcion. */ public void depositar(double unMonto){ saldo = saldo + unMonto; } /** Devuelve el nmero de cajas de ahorro creadas. * @return devuelve un entero. * @throws No dispara ninguna excepcion.
Tema 4
12
Programacin IV
*/ public static int cuantasCajas() { return numCajas; } public void mostrar(){ System.out.println("\n" + "**** metodo mostrar() de CajaAhorro titular.mostrar(); System.out.println("Numero de cuenta: " + this.numero()); System.out.println("Saldo: " + this.saldo()); } } // fin clase CajaAhorro
Tema 4
****");
4. Resultado de la ejecucin se crearon: 2 cajas --------- metodo mostrar() de Persona ----------DNI: 25132456 Nombre: Maria Gonzales ********* metodo mostrar() de CajaAhorro ******** --------- metodo mostrar() de Persona ----------DNI: 25132456 Nombre: Maria Gonzales Numero de cuenta: 1 Saldo: 1200.0 ********* metodo mostrar() de CajaAhorro ******** --------- metodo mostrar() de Persona ----------DNI: 17425236 Nombre: Juan Dominguez Numero de cuenta: 2 Saldo: 800.0 5. Generacin documentacin
Class CajaAhorro
java.lang.Object
13
Programacin IV
Tema 4
CajaAhorro
public class CajaAhorro extends java.lang.Object Permite crear y manipular una cuenta de caja de ahorro. Version: 1 Author: Juan Perez
Constructor Summary
CajaAhorro (Persona t) CajaAhorro(Persona t, double s)
Method Summary
static int cuantasCajas ()
Devuelve el nmero de cas de ahorro creadas. Agrega unMonto al saldo actual de la cuenta.
void depositar (double unMonto) void mostrar () int numero () double saldo ()
Retorna el numero de la cuenta. Retorna el saldo actual de la cuenta. Asigna unMonto al saldo actual de la cuenta. Retorna el titular de la cuenta.
Constructor Detail
CajaAhorro
public CajaAhorro(Persona t)
CajaAhorro
public CajaAhorro(Persona t, double s)
Method Detail
14
Programacin IV
Tema 4
cuantasCajas
public static int cuantasCajas()
Devuelve el nmero de cas de ahorro creadas. Returns: devuelve un entero. Throws: No - dispara ninguna excepcion.
depositar
public void depositar(double unMonto)
Agrega unMonto al saldo actual de la cuenta. Returns: No devuelve ningn valor. Throws: No - dispara ninguna excepcion.
mostrar
public void mostrar()
numero
public int numero()
Retorna el numero de la cuenta. Returns: Un valor de tipo int. Throws: No - dispara ninguna excepcion.
saldo
public double saldo()
Retorna el saldo actual de la cuenta. Returns: Un valor de tipo double. Throws: No - dispara ninguna excepcion.
saldo
public void saldo(double unMonto)
Asigna unMonto al saldo actual de la cuenta. Returns: No devuelve ningn valor. Throws: No - dispara ninguna excepcion.
titular
public Persona titular()
Programacin IV
Returns: Un objeto de tipo Persona. Throws: No - dispara ninguna excepcion.
Tema 4
16