Tecnología de Programación Diego C. Martínez Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Lenguaje de modelado unificado UML (Unified Modeling Language) es un lenguaje gráfico para el diseño completo de sistemas. Procura abarcar diferentes aspectos del diseño, tanto estáticos como dinámicos, por lo que incluye varios tipos de diagramas, entre ellos: Diagrama de Casos de Uso Diagramas de Clase y Objetos Diagrama de Estados Diagramas de Secuencia Diagramas de Colaboración Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur UML - Diagramas de clases El diagrama de clases es un diagrama de la estructura estática del sistema. Un diagrama de clases describe los tipos de objetos en el sistema y las dependencias estáticas que existen entre ellos. Se describe la estructura de la clase (nombre, atributos, operaciones, responsabilidades) y se muestran las relaciones existentes entre las clases. Las relaciones más comunes son la asociación, la agregación, la composición y la generalización. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Asociaciones, agregaciones Asociación Los objetos se conocen unos a otros para poder trabajar juntos Agregación Los objetos juntos conforman una unidad con significado. Composición Cada parte puede conformar solo un objeto agregado FunciónTeatral evento 1 acepta Reserva 0..* Equipo Jugador 1 11 Libro Capitulo 1 0..* Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Asociaciones, agregaciones y los lenguajes OO Para las agregaciones y composiciones algunos lenguajes ofrecen un mecanismo diferente para el tratamiento de objetos. Se denomina usualmente manipulación de objetos con semántica por valor en contraposición a la semántica por referencia. En la semántica por valor, un objeto puede literalmente contener a otro objeto. Este último se denomina subobjeto del primero. semántica por referencia semántica por valor Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Manipulación de objetos con semántica por referencia En la semántica por referencia, la creación de objetos es explícita, por medio de algún operador que requiere la invocación de un constructor: celdita = new Celda() celdita = !!crearCelda() Efectos (pasos) de la creación explícita de un objeto: 1o: Crear una nueva instancia de la clase correspondiente 2o: Inicializar cada campo de la nueva instancia acorde a los valores por defecto. 3o: Ejecutar la implementación del constructor. 4o: Asociar una referencia a este objeto recién creado. punto2D -x:real -y:real <<consultas>> ... <<constructor>> punto2D(cx,cy:real) punto2D(cx,cy:real) { x cx y cy } P1 new punto2D(2,3) Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Manipulación de objetos con semántica por valor En la semántica por valor, la creación de objetos puede ser implícita. El objeto es creado automáticamente cuando se crea el objeto que lo contiene. en C++: Punto p1(2,3); El constructor es invocado implícitamente al momento de la creación (automática) del objeto por valor. Efectos (pasos) de la creación implícita de un objeto: 1o: Crear una nueva instancia de la clase correspondiente 2o: Inicializar cada campo de la nueva instancia acorde a los valores por defecto. 3o: Ejecutar la implementación del constructor. 4o: Asociar una referencia a este objeto recién creado. El constructor puede invocarse explícitamente, pero no provoca la creación de un nuevo objeto, sino la reinicialización del original. No es posible declarar como subobjeto de una clase A, un objeto de tipo B que a su vez tiene un subobjeto de tipo A Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Operaciones clásicas con referencias Comparación de Referencias La comparación de referencias es una operación que devuelve verdadero, si la referencia es idénticamente la misma, falso en caso contrario. La denotaremos en diseño con el símbolo = Clonación Es una operación de creación e inicialización en base a un objeto modelo. Se realiza por medio de una función predefinida. nuevo = viejo.clone(); No todos los lenguajes poseen una función predefinida de clonación. Se puede usar en ese caso un constructor por copia... Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Operaciones clásicas con referencias Clonación en Java y creación por copia en C++ class Vector{ private int x; private int y; private int z; public Vector(int x,int y, int z); { this.x = x; this.y = y; this.z = z; } } Java Vector a = new Vector(1,2,3); Vector b = (Vector)a.clone(); class Vector{ public: Vector(); Vector(const Vector& other): x(other.x), y(other.y), z(other.z){} private: int x, y, z; }; Vector a; Vector b(a); Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur C++ Operaciones clásicas con referencias Copia La copia es una operación entre dos referencias, en la que los campos de una toman los valores provistos en los campos de otra. Usualmente: nuevo.copy(viejo) Puede haber librerías en el lenguaje, o debe ser implementado por el programador. ¡ No puede utilizarse sobre referencias nulas ! Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Operaciones clásicas con referencias Comparación de objetos La comparación de objetos es una operación entre dos referencias, que devuelve verdadero si los campos de ambos objetos referenciados contiene exactamente los mismos valores, aunque se trate de objetos diferentes. falso en caso contrario. Es una comparación superficial. Usualmente unobjeto.equals(otroobjeto) Java tiene equals. C++ no posee una operación para comparar identidades. PHP tiene los dos niveles de comparación : == e === Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Operaciones clásicas con referencias Clonación y comparación en profundidad Son las operaciones correspondientes (clonación y comparación) aplicadas recursivamente a todos los niveles de referencias entre objetos. No todos los lenguajes las implementan. X deep_clone(Y) X.deep_equals(Y) Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Usando las dos semánticas de manipulación Es posible asociar o comparar entidades con semántica diferente. Se denominan operaciones híbridas. Resultado de una asignación con origen y y destino x x y x referencia referencia expandido Copia de referencias xy.clone() expandido x.copy(y) x.copy(y) y y no puede ser nula Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Usando las dos semánticas de manipulación Es posible asociar o comparar entidades con semántica diferente. Se denominan operaciones híbridas. Resultado de una comparación con origen y y destino x x = y referencia expandido referencia Comparación de identidades x.equals(y) expandido x.equals(y) x.equals(y) x y Falso si y es nula Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Una traza... Punto(cx,cy:Entero) { x cx y cy } Clase Linea con referencias Linea(p1,p2:Punto2D) { punto1 p1 punto2 p2 } Clase Triangulo con subobjetos Triangulo(p1,p2,p3:Punto2D) { punto1 p1 punto2 p2 punto3 p3 } ¿Verdadero o falso?: • • • • • ¿ ¿ ¿ ¿ ¿ p1=p2 ? l.deep_equal(l2) ? l2.deep_equal(l3) ? t = t2 ? t.equals(t2) ? p1 p2 p3 l t p1 l2 l3 t2 p3 new Punto(2,4) new Punto(12,28) new Punto(1,3) new Linea(p1,p2) new Triangulo(p1,p2,p3) p2.clone() l.clone() l.deep_clone() t t.punto1 Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Semántica por referencia El manejo por referencia provee: Posibilidad de compartir información Modelamiento de la relación “conoce” o “tiene acceso a” entre objetos Manejo de agrupación de datos con identidad Eficiencia en el espacio de memoria Problemas: Dynamic aliasing Posibilidad de referencias colgadas Problema de la persistencia de objetos Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Semántica por valor El manejo por valor provee: Manejo de agregación de datos Modelado de la relación “contiene” o “es parte de” entre objetos Eficiencia en el tiempo de acceso Problemas: Duplicación de información Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de objetos UML provee también diagramas para reflejar la estructura dinámica formada por objetos en algún momento de la ejecución. El diagrama de objetos muestra las instancias de las clases. ventanaPrincipal:Frame botonAceptar:Button botonCancelar:Button cartelAviso:Label texto = “Bienvenido” fondo = 000000 colorTexto = FFFFFF nombre del objeto Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur tipo del objeto Diagramas de interacción Los diagramas de interacción son modelos que describen cómo un grupo de objetos colabora para realizar una tarea particular. Típicamente captura el comportamiento de un caso de uso del sistema, o de alguna operación interna que requiere varios objetos, siempre desde el punto de vista de los mensajes entre los objetos. Hay dos tipos de diagramas de interacción: • Diagramas de secuencia • Diagramas de colaboración. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de secuencia unObjeto:claseA <<creates>> otroObjetoMas otroObjeto:claseB unaConsulta() unMensaje() resultado otraConsulta() unMensajeLocal() Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de colaboración objetoA 1:unMensaje() objetoC [condicion falsa] 1.1.1: otraAccion() objetoB objetoD [condicion verdadera] 1.1.2: unaAccion() 1.1: verificarCondicion() Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de interacción - ejemplo Para ilustrar los dos diagramas seguiremos el ejemplo de Martin Fowler en el libro UML Distilled, para el siguiente caso de uso: la preparación para despachar la compra de productos en una orden de compra. 1. La ventana de Ingreso de Orden envía un mensaje “prepare” a una Orden. 2. La Orden envía entonces un mensaje “prepare” a cada Línea de Orden en esa Orden. 3. Cada Línea de Orden controla el Stock Item correspondiente. 4. Si el control retorna “true”, la Linea de Orden quita la cantidad apropiada de Stock Item y crea un item de entrega (delivery). 5. Si el Stock Item cae por debajo del nivel de reposición, ese Stock Item solicita una reposición (reorder). Los diagramas de secuencia y colaboración nos ayudarán a comprender mejor este proceso y visualizarlo correctamente. Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de secuencia • La ventana de Ingreso de Orden envía un mensaje “prepare” a una Orden. • La Orden envía entonces un mensaje “prepare” a cada Linea de Orden en esa Orden. • Cada Linea de Orden controla el Stock Item correspondiente. • Si el control retorna “true”, la Linea de Orden quita la cantidad apropiada de Stock Item y crea un item de entrega (delivery). • Si el Stock Item cae por debajo del nivel de reposición, ese Stock Item solicita una reposición (reorder). unIngresoDeOrden unaOrden unaLineaOrden unStockItem prepare() prepare() tiempo hasStock:=check() [hasStock] remove() needToReorder:= needsReorder () [needToReorder] new unROItem [hasStock] new Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur aDelivery Item Diagramas de colaboración En los diagramas de colaboración se muestran los objetos ejemplo, junto con los mensajes enviados entre ellos, indicando la secuencia, en un caso de uso particular. unIngresoDeOrden 1:prepare() unaOrden 2*:[para todas las lineas] prepare() 5:needsReorder:= needsToReorder() 3:hasStock:= check() 4 [hasStock]: remove() unaLineaOrden 7 [hasStock] :new unDeliveryItem unStockItem 6 [needsReorder]: new unReordenItem Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur Diagramas de colaboración Puede usarse otro tipo de numeración denominada Decimal… unIngresoDeOrden 1:prepare() unaOrden 1.1:[para todas las lineas] prepare() 1.1.2.1:needsReorder:= needsToReorder() 1.1.1:hasStock:= check() 1.1.2 [hasStock]: remove() unaLineaOrden 1.1.3 [hasStock] :new unDeliveryItem unStockItem 1.1.2.2 [needsReorder]: new unReordenItem Departamento de Ciencias e Ingeniería de la Computación - Universidad Nacional del Sur