Clase06 - Departamento de Ciencias e Ingeniería de la

Anuncio
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
xy.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
Descargar