INTERACCION ENTRE OBJETOS Corina Flores Villarroel UMSS -
Contenido Este capítulo se discutirán conceptos relacionados con: Abstracción y encapsulamiento, Modularización, composición Creación de objetos, Diagramas de objetos, Llamadas a métodos, Depuradores
Contenido 1. El ejemplo de las fechas 2. Abstracción y modularización 3. Diagramas de clases 4. Diagramas de objetos 5. Tipos primitivos 6. Tipos objeto Objetos que crean objetos 7. Constructores múltiples 8. Métodos públicos vs. privados
Introducción Hasta el momento ya sabemos! qué son los objetos, cómo se implementan, así también conocemos qué es un campo (datos de un obj.), constructores y métodos. En este capítulo nos ocuparemos de construir aplicaciones interesantes, en el que será preciso la participación de objetos entre sí, de manera que combinados puedan cooperar para ejecutar tareas comunes.
Características asociadas Las caracteristicas asociadas a POO se traducen en: Abstracción Encapsulación Ocultamiento Modularización
Características asociadas Abstracción: Consiste en captar las características esenciales de un objeto, así como su comportamiento. Por ejemplo, veamos un celular Qué características podemos abstraer de los celulares? O lo que es lo mismo Qué características semejantes tienen todos los celulares?
Características asociadas Y en cuanto a su comportamiento Por ejemplo, veamos un celular Qué tareas pueden realizar los celulares? O lo que es lo mismo Qué tareas semejantes saben hacer todos los celulares?
Características asociadas En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones. Por ejemplo, en Java tenemos: public class Celular { // atributos // métodos
Características asociadas Encapsulación: Consiste en unir en la Clase las características y comportamientos, esto es, los atributos y métodos. Celular Es tener todo esto es una sola entidad. Marca Modelo Pantalla Llamar() Enviar_mensaje() Colgar() Encapsulación en tiempo de desarrollo
Características asociadas Encapsulación: La utilidad del encapsulamiento va por la facilidad de manejar la complejidad, ya que tendremos a las Clases como cajas negras, donde sólo se conoce el comportamiento (interfaz publica) pero no los detalles internos. Encapsulación en tiempo de ejecución.
Características asociadas Encapsulación: Es un mecanismo de control. Los datos de un objeto, sólo pueden modificarse por medio de los metodos de ese objeto. Entonces, 1. La modificación de un atributo o campo debe realizarse por medio de un método. 2. La consulta del valor de un atributo o campo debe tambien realizarse por medio de un método especialmente destinado a esto
Características asociadas Por ej.: Si desariamos modificar de marca el celular, tendriamos un método como public void setmarca(string m){ Marca = m; Y si quisieramos consultar la marca del celular, tendriamos que tener un metodo como public String getmarca(){ return Marca;
Características asociadas Ocultamiento: Es la capacidad de ocultar los detalles internos del comportamiento de una Clase y exponer sólo los detalles que sean necesarios para el resto de las clases. El ocultamiento permite 2 cosas: 1. Restringir y controlar el uso de una clase (algunos comportamiento privados). 2. Validar algunas condiciones antes de modificar el estado de un objeto. En Java el ocultamiento se logra usando las palabras reservadas: private y protected delante de las atributos y métodos.
El ejemplo de la fecha Se desea mostrar una fecha en la pantalla teniendo en cuenta el siguiente formato: DD/MM/AAAA Dia Mes Año
Abstracción La fecha, con el formato especificado puede ser implementado con una sola clase? SI! Sin embargo, analizaremos antes el problema para ver su complejidad.
Abstracción La complejidad es parte inherente de los programas, tratarlos es IMPORTANTE! El hombre está seriamente limitado para tratar la complejidad. Puede tener en mente 7 asuntos ó elementos simultáneamente. Sin embargo, cualquier tipo de problema, excepto los más simples, manejan más de 7 elementos. Qué hacer? Solución!! agrupar elementos relacionados y manejar éstos en grupos como una sola unidad.
Modularización Proceso de dividir un todo en partes bien definidas que pueden ensamblarse y examinarse separadamente, y que interaccionan en formas bien definidas Modularización Cada parte se denomina módulo. El mecanismo principal de modularización en la Programación Orientada a Objetos es la clase
Modularización Cuándo es útil aplicar modularización? 1. Cuando existe un grupo de instrucciones o una tarea específica que deba ejecutarse en más de una vez. 2. Cuando un problema es complejo o extenso, la solución se divide o segmenta en módulos que ejecutan partes o tareas específicas. Dicha solución se organiza de forma similar a como lo hacen las empresas cuando se estructuran con base en las funciones para realizar sus actividades Existe un módulo directivo o de control, que se encarga de distribuir el trabajo a los demás módulos
Composición Permite que la clase todo controle la existencia de las parte. Es decir la clase todo creara al principio las clases parte. Composición Cada parte colabora entre si. Y todas completan el trabajo.
Modularizando: Problema de la fecha Veamos cómo esta formada 18 Marzo 2011 Se observa que esta compuesto por tres partes El dia El mes El año
Modularizando: Problema de la fecha El dia, se desplaza entre 1 a 31,o 1 a 30 o 1 a 28-29 dependiendo del mes que se trate. El mes, en cambio de 1 a 12 El año, se representa con cuatro digitos por ejemplo: 1999 El problema se puede resolver con una clase que represente un contador con límite. Para cada contador se puede crear una instancia de la clase
Modularizando: Problema de la fecha Comencemos dibujando el modelo de la clase que nos permitirá abstraer la representación. Dia public class Dia { private int limitedia; private int valor; // constructores y métodos
Modularizando: Problema de la fecha Podemos completar la fecha, teniendo en cuenta a éste como un objeto que tiene internamente tres números (dia, mes,año). Entonces, cada uno puede ser un campo de la fecha de esta manera. Mes Dia public class Mes { private Dia dia; private Dia mes; private String mensaje; private String nombremes; // constructores y métodos
Modularizando: Problema de la fecha public class Mes { private Dia dia; private Dia mes; private String mensaje; // constructores y métodos Tipo de Campos dato 1. Nombre de una clase puede ser usado como tipo 2. Si el tipo de un campo es una clase, entonces el campo puede contener objetos de esa clase. DD MM
Sobrecarga de constructores Cuando dos o más constructores tienen el mismo nombre pero diferentes parámetros. El compilador decide qué constructor invocar dependiendo de los parámetros usados public Mes() { dia = new Dia(); //31 mes = new Dia(); //12 actualizarmensaje(); public Mes(int dia1, int mes1) { dia = new Dia(); mes = new Dia(); setfecha(dia1, mes1);
Diagrama de clases Diagrama de clase: muestra las clases y sus relaciones - vista estática de la aplicación: en edición.
Diagrama de objetos Diagrama de objetos: muestra los objetos y sus relaciones - vista dinámica de la aplicación: en ejecución. Mes1: Mes dia : Dia 12 Cuando su tipo de una variable o campo es de tipo objeto, el valor no se almacena en el espacio de la variable o campo - se almacena una referencia al objeto que tiene su propio espacio public Mes(Dia d) { dia = d; limitemes = 12; valormes = 0; actualizarmensaje();
Paso de parámetros a métodos Dos tipos: 1. Paso por valor: Cuando, se realiza una copia de los valores que se pasan en los parámetros, con los cuales se trabaja dentro del método. Es por ello que cualquier cambio que sufran dentro, no repercute fuera del método. 2. Paso por referencia: No realiza copia, solo se pasa una referencia al objeto, por lo que las modificaciones de dentro de los métodos afectan a los parámetros y esos cambios permanecen al final de los métodos.
Paso de parámetros a métodos. Paso por valor: public void setvalormes(int reemplazavalor) {.. Tipo Primitivo float double boolean Java se realiza una copia del valor para el método y cualquier cambio a dicho valor no afecta a la variable original Paso por referencia: public Mes(Dia d) { Tipo Objeto Cuando se pasa un objeto como parametro, solo se referencia al objeto, los cambios al objeto referenciado sí son visibles y afectan fuera del método.
Ejercicio Se pide examinar el código de los programas ClockDisplay y NumberDisplay Estos programas pueden encontrar en la página de la materia publicado en la siguiente dirección y bajo el nombre Capítulo 3 del libro. http://www.cs.umss.edu.bo/ Buscar a la docente y luego material de estudio
Tipos primitivos En java, existe una clasificación génerica denominada tipos primitivos de datos que esta dado por lo siguiente: 4 tipos de enteros byte short int long 2 tipos de reales 1 tipo caracter 1 tipo lógico float double char boolean
Tipos primitivos Los tipos primitivos no usan métodos para ser creados Las expresiones de tipos primitivos usan normalmente operadores como: + / - * % Por ej.: valor < 10 Los valores de tipos primitivos son almacenados directamente en la variable dia1: Dia limitedia valor 31 0
Tipos objeto Los tipos objetos son aquellos construidos por el programador, por ejemplo las clases. Ej.: la clase Mes El standar de Java System, define también algunas clases, por ejemplo a String como un tipo objeto. Ej.: String nombre; int n1; nombre = Pedro ; n1=nombre.length(); Devuelve la longitud de la cadena en caracteres
Tipos objeto Las constantes y valores de tipos objeto, se construyen en la clase misma a través de métodos o usando el constructor. public Mes( ) { dia mes = new Dia(31); = new Dia(12); actualizarmensaje(); Las expresiones de tipos objeto usan métodos públicos provistos por la clase private void actualizarmensaje() { mensaje = dia.getdia() + "/" ;
Operadores lógicos Los operadores lógicos permiten aplicar el álgebra de Boole. Operan sobre valores booleanos (true ó false) y producen un nuevo valor booleano como resultado. Los tres más importantes son: Operador Significado && y lógico o lógico! no lógico
Clase Dia Observando el método setvalormes( ) encontramos a public void setvalorm(int reemplazavalor) { if((reemplazavalor >0) && (reemplazavalor <= 12)) { valormes = reemplazavalor; Cuando un valor ingresa éste es verificado si está en el rango indicado (> 0 y < 12) solo cuando ambas condiciones son V se ejecutará el cuerpo de if.
Clase Mes Veamos el método getmes(), Supongamos que value es 5, por la sentencia, retornará la cadena 05 forzando a la conversión de un valor entero a cadena public String getdia() { if(value < 10) { return "0" + valor; else { return "" + valor; El operador + tiene otro significado diferente que depende del tipo de operandos.
Objetos que crean objetos public class Mes { private Dia dia; private Dia mes; public Mes() { dia = new Dia(31); mes = new Dia(12); actualizarmensaje(); // más métodos Al escribir el constructor de Mes se crea y almacena dos objetos del tipo Dia. Cuando el constructor de Mes se ejecuta, automáticamente se crea los objetos
Constructores Múltiples public class Mes { public Mes() { dia = new Dia(31); mes = new Dia(12); actualizarmensaje(); public Mes(int dia1, int mes1) { dia = new Dia(31); mes = new Dia(12); setfecha(dia, mes); // más métodos La clase Mes, tiene dos Constructores, ellos permiten dos formas de inicializar un objeto Mes, uno con dos parámetros y otro sin parámetros. Una clase puede contener más de un constructor con distinto número de parámetros, a esto se conoce como sobrecarga de constructores o métodos.
Llamadas a métodos Llamadas a métodos internos public Mes(int dia1, int mes1) { dia = new Dia(dia1); mes = new Dia(mes1); setfecha(dia1, mes1); Esta es una llamada al método setfecha(). El método se encuentra en la misma clase Mes, a esto se conoce como llamada a métodos internos. La sintaxis es: nombremétodo(lista_parámetros)
Llamadas a métodos Llamadas a métodos externos public void setfecha(int d, int m) { dia.setvalord(d); mes.setvalorm(m); actualizarmensaje(); Podemos observar una llamada al método: setvalord(); Cuando el objeto dia, llama a métodos implementados fuera de la clase desde donde realiza la invocacion, se conoce como llamada a métodos externos. La sintaxis es: nombreobjeto.nombremétodo (lista_parámetros)
Métodos públicos vs. privados En el problema de la fecha encontramos a una mayoría de los métodos declarados como públicos. Excepto el método actualizarmensaje(). Pongamos atención! private void actualizarmensaje() { mensajecompleto = mes.getfecha() + "/" + getvaloranho() ;
Métodos públicos vs. privados private void actualizarmensaje() { mensajecompleto = mes.getfecha() + "/" + getvaloranho() ; Este método es responsable de actualizar la cadena a mostrar en pantalla, es decir, el dia, mes y año separados por / Los valores de la fecha pueden cambiar de acuerdo al gusto del usuario Para completar su trabajo el método actualizarmensaje(), debe además recurrir a otro método como getfecha() método que devuelve el nombre del mes en formato cadena para el objeto mes
Métodos públicos vs. privados Métodos privados son aquellos de soporte que ayudan a completar la tarea encomendada al método que los contiene. Sirven solamente para uso dentro del método.