idp 03 modelo funcional
TRANSCRIPT
-
8/13/2019 IDP 03 Modelo funcional
1/79
Mster en Ingeniera del Software, Mtodos Formalesy Sistemas de Informacin
TEMA 3: MODELOFUNCIONAL
INGENIERA DE LA PROGRAMACIN
-
8/13/2019 IDP 03 Modelo funcional
2/79
Contenidos
Expresiones Navegaciones Propiedade Operaciones de coleccin Resolucin de propiedades OCL avanzado y pseudocdigo
2
-
8/13/2019 IDP 03 Modelo funcional
3/79
self.pasajeros->size()
-
8/13/2019 IDP 03 Modelo funcional
4/79
Expresiones1
-
8/13/2019 IDP 03 Modelo funcional
5/79
edad > 18
Persona
nombre: String
edad: Integer
....
contextPersona
inv: edad > 18
Contexto de una expresin
Las expresiones se pueden mostrar en undiagrama UML o en un documento detexto acompaante
La definicin del contexto de unaexpresin OCL especifica la entidad delmodelo UML para la que se define laexpresin OCL.
5
-
8/13/2019 IDP 03 Modelo funcional
6/79
Tipo e instancia contextual
El tipo contextual de una expresin OCL secorresponde con la entidad del modelo parala cual se define la expresin OCL.
Una expresin OCL se evala para un nicoobjeto, el cual es siempre una instancia deltipo contextual (instancia contextual).
A veces es necesario referirnos
explcitamente a la instancia contextual, porello utilizamos la palabra reservada self
6
-
8/13/2019 IDP 03 Modelo funcional
7/79
Tipos y operaciones bsicos7
Tipo OperacionesBoolean and, or , xor, not, implies, if-then-else-endifInteger +, -, *, /, abs, div, mod, max, minReal +, -, *, /, abs, floor, round, max, min, ,
=String size, concat, substring, toInteger, toReal
-
8/13/2019 IDP 03 Modelo funcional
8/79
Tipos de expresiones OCL
Invariantes Pre/post-condiciones Valores iniciales Valores derivados De consulta Expresiones avanzadas
8
-
8/13/2019 IDP 03 Modelo funcional
9/79
Un invariante es una condicin que debe ser verdadera para todas lasinstancias de un tipo especfico en cualquier momento.
contextHabitacin
inv: self.nmero_de_camas
-
8/13/2019 IDP 03 Modelo funcional
10/79
Pre y postcondiciones
Una precondicin /postcondicin es unacondicin que debe ser verdadera antes/despus de la ejecucin de una operacin.
En una postcondicin, nos podemos referir alos valores de cada propiedad de un objetoen dos momentos en el tiempo: El valor de la propiedad al comienzo de la
operacin o mtodo (utilizamos el postfijo @pre) El valor de la propiedad una vez que la operacin
o mtodo se ha ejecutado.
10
-
8/13/2019 IDP 03 Modelo funcional
11/79
context Empleado::aumentarSalario( cantidad: Real ):
Real
pre: salario > 0
post: self.salario = self.salario@pre + cantidad and
result = self.salario
Pre y postcondiciones11
-
8/13/2019 IDP 03 Modelo funcional
12/79
Valores iniciales y derivados
Una expresin OCL puede ser utilizada paraindicar el valor inicial (o derivado) de unatributo o un extremo de asociacin. La expresin debe ser conforme al tipo
resultante del atributo, En el caso de un valor inicial para un extremofinal de asociacin la expresin debe serconforme con el clasificador en tal extremo final
context Persona:: salario : Integer
init: 500
context Persona:: salario : Integer
derive: 500 + (50 * antigedad)
12
-
8/13/2019 IDP 03 Modelo funcional
13/79
Ejemplo de init en asociacin
context Tarjeta::Movs: Set(Movimiento)
init: Set{}
Tarjeta/NombreTitular: StringValidoDesde: FechaValidoHasta: Fecha
titular
tarjetas
ClienteNombre: String
Apellidos: StringEdad: IntegerSexo: Genero
1
0..*
MovimientoImporte: RealConcepto: StringFecha: FechaMovs
0..*1
13
-
8/13/2019 IDP 03 Modelo funcional
14/79
Expresiones de consulta
Una expresin OCL puede ser utilizada paraindicar el resultado de una operacin deconsulta:context Typename:: operationName(parameter1:Type1, ...) : ReturnType
body: -- alguna expresin
No cambian el estado del sistema, solo retornanun valor o conj. de valores.
La expresin debe ser conforme con el tipo de laoperacin.
Al igual que en pre y postcondiciones losparmetros pueden ser utilizados en laexpresin.
14
-
8/13/2019 IDP 03 Modelo funcional
15/79
Ejemplo de expresin deconsultacontext CursoUPV::obtenerCantidadDeAlumnos(): Integer
body: self.alumnos->size()
context CursoUPV
inv: self.obtenerCantidadDeAlumnos() > 15
CursoUPV
nombre : String
modalidad : Mod
obtenerCantidadDeAlumnos() : Integer
obtenerAlumnosbecados() : Set(Alumnos)
Alumno
DNI : Integer
nombre : String
apellido : String
esBecado : Boolean1..*
+alumnos
1..*
15
-
8/13/2019 IDP 03 Modelo funcional
16/79
Navegaciones316
-
8/13/2019 IDP 03 Modelo funcional
17/79
Husped
nombre : String
edad : Integer
sexo : {hombre, mujer}
Habitacin
nmero_piso : Integer
nmero_habitacin : Integer
nmero_de_camas : Integer
tipo : {A, B}+huspedes
*
Navegaciones
Las navegaciones nos permiten hacer referenciaa objetos que estn asociados con la instanciacontextual
Hay dos tipos de navegaciones: simples ycombinadas
Requisito: la cantidad de huspedes de unahabitacin no debe superar la cantidad de camasde la habitacin.
17
-
8/13/2019 IDP 03 Modelo funcional
18/79
Huspednombre : String
edad : Integer
sexo : {hombre, mujer}
Habitacin
nmero_piso : Integer
nmero_habitacin : Integer
nmero_de_camas : Integer
tipo : {A, B}+huspedes
*
Navegaciones
Navegamos una relacin cuando se utiliza en unaexpresin el nombre de rol (del extremo opuesto deuna relacin) que vincula la clase donde se define laexpresin con otra clase del diagrama.
context Habitacin
inv: self.huespedes->size()
-
8/13/2019 IDP 03 Modelo funcional
19/79
Colecciones
El tipo Collection es un tipo abstracto, consubtipos de coleccin concretos: Set (Conjunto)
OrderedSet (Conjunto ordenado) Bag (Bolsa) Sequences (Secuencias)
context Habitacininv: self.Huesped->size()
-
8/13/2019 IDP 03 Modelo funcional
20/79
Tipo_Avin
tipo : String
serie : String
cant_de_asientos : Integer
cant_de_tripulantes : Integer
Avion
id_avion : Integer
1
1..* +tipo
1
1..*
Pasajeros
id_pasajero : Integer
pasaporte : String
Vuelo
id_vuelo : Integer
origen : String
destino : String
1
1..*
+avion
1
1..*
1..*
*
+pasajeros
1..*
1..*
*
+tripulantes
1..*
*
*
Navegaciones Combinadas
Las navegaciones no se limitan a una nica asociacin. Lasexpresiones OCL pueden estar encadenadas navegando unconjunto de asociacionescontext Vuelo
inv: self.avion.tipo.cant_de_asientos >= self.pasajeros->size()
20
-
8/13/2019 IDP 03 Modelo funcional
21/79
Navegaciones y colecciones
Los tipos de colecciones juegan unimportante rol en las expresiones OCL ! Una nica navegacin resulta en un conjunto
(Set),
navegaciones combinadas en un Bag, navegaciones sobre asociaciones adornadas con
{ordered} resultan en un OrderedSet. Las navegaciones definen acoplamiento de
objetos El acoplamiento debe reducirse en todo sistema
OO. Cmo de lejos estn otros objetos...?
21
l
-
8/13/2019 IDP 03 Modelo funcional
22/79
Navegaciones que resultan enun Set Las navegaciones simples resultan en un Set El valor de una navegacin simple es un objeto o
conjuntos de objetos, dependiendo de lamultiplicidad del extremo final de la asociacin.
context Compaainv: self.gerente.esDesocupado = false
inv: self.empleados->notEmpty()
.... self.gerente->size() = 1
Persona
nombre : String
edad : IntegeresDesocupado : Boolean
Compaa
nombre : String
* +empleados*
1+gerente
1
22
l
-
8/13/2019 IDP 03 Modelo funcional
23/79
Navegaciones que resultan enun Bag
context Medico
... self.trabaja.afiliados
Medico ObraSocial
1..*1..*
Afiliado
1..*1..*
+trabaja+asociados +afiliados+obras_sociales
1..*1..* 1..*1..*
23
N i l
-
8/13/2019 IDP 03 Modelo funcional
24/79
Navegaciones que resultan enSets o Bags Qu sucede si queremos obtener el nmero de potenciales
pacientes de un mdico, pero quisiramos contar tantasveces a un afiliado como obras sociales ste tenga.
Medico ObraSocial
1..*1..*
Afiliado
1..*1..*
+trabaja+asociados +afiliados+obras_sociales
1..*1..* 1..*1..*
Context Medico
... self.trabaja.afiliados
met1
obra1
obra2
af1
af2
af3
24
N i l
-
8/13/2019 IDP 03 Modelo funcional
25/79
Navegaciones que resultan enSets o Bags Qu sucede si queremos obtener el nmero de potenciales
pacientes de un mdico, y pero NO queremos contar tantasveces a un afiliado como obras sociales ste tenga.
Medico ObraSocial
1..*1..*
Afiliado
1..*1..*
+trabaja+asociados +afiliados+obras_sociales
1..*1..* 1..*1..*
Context Medico
... self.trabaja.afiliados->asSet()
met1obra1
obra2
af1
af2
af3
25
N i l
-
8/13/2019 IDP 03 Modelo funcional
26/79
Navegaciones que resultan enOrderedSets y Sequences Cuando navegamos una asociacin etiquetada con {ordered},
la coleccin resultante es de tipo OrderedSet,
Cuando navegamos mas de una asociacin y una de ellas estetiquetada con {ordered}, la coleccin resultante es unasecuencia.
context escuelaInternacional
... self.numero = VIII and self.cursos->at(3)
EscuelaInternacional
numero : Integer
fecha : Date
Curso
nombre : String
modalidad : Mod
obtenerCantidadDeAlumnos() : Integer
obtenerAlumnosbecados() : Set(Alumnos)
1..*+cursos
{ordered}
26
N i l d
-
8/13/2019 IDP 03 Modelo funcional
27/79
Persona
nombre : String
edad : Integer
esDesocupado : Boolean
Compaa
nombre : String
numerodeEmpleados : Integer
+empleado
0..*0..*
Trabajo
titulo : String
diaComienzo : Date
salario : Integer
+empleador
0..* 0..*
Navegaciones a clases deasociacin
Para especificar la navegacin a clases deasociacin, OCL utiliza un punto y el nombrede la clase de asociacin
context Persona
inv: self.Trabajo ....
27
N i d d l d
-
8/13/2019 IDP 03 Modelo funcional
28/79
Persona
nombre : String
edad : Integer
esDesocupado : Boolean
Compaa
nombre : String
numerodeEmpleados : Integer
+empleado
0..*0..*
Trabajo
titulo : String
diaComienzo : Date
salario : Integer
+empleador
0..* 0..*
Navegaciones desde clases deasociacinEs posible navegar desde la clase de asociacin a
los objetos que participan en la asociacin.
context Trabajo
inv: self.empleado.edad > 21
28
-
8/13/2019 IDP 03 Modelo funcional
29/79
Propiedades429
-
8/13/2019 IDP 03 Modelo funcional
30/79
Propiedades de objetos
Una propiedad es:Un atributoUn extremo de asociacin
Una operacin/mtodo libre de efectoslaterales Una operacin o mtodo se define como libre de
efectos laterales si no modifica el estado delsistema
Notacin Puntoself.Edad >= 17
30
-
8/13/2019 IDP 03 Modelo funcional
31/79
Propiedad: Atributo
Por ejemplo, la siguiente expresin OCL: la edadde cliente es mayor o igual a 17 aos:
context Cliente
inv: self.Edad >= 17
El valor de la subexpresin self.Edad es el valor
de Edad en la instancia particular de Clienteidentificada por self. El tipo de la subexpresin self.Edad es el tipo del
atributo Edad, que es un tipo Integer estndar.
ClienteNombre: String
Apellidos: StringEdad: Integerlim_max_mov:Integer
31
-
8/13/2019 IDP 03 Modelo funcional
32/79
Propiedad: Operacin
Para referirnos a una operacin o mtodoque no tiene parmetros, se requiereespecificar una lista vaca de argumentos:
context Productoinv: self.obtenerprecio() > 0
32
-
8/13/2019 IDP 03 Modelo funcional
33/79
Propiedad: Asociacin
El valor de la subexpresin es un objeto ocoleccin de objetos, dependiendo de lamultiplicidad del extremo final de laasociacin.context Compaa
inv: self.gerente.esDesocupado = false
inv: self.empleados->notEmpty()
Persona
nombre : String
edad : Integer
esDesocupado : Boolean
Compaa
nombre : String
* +empleados*
1+gerente
1
33
-
8/13/2019 IDP 03 Modelo funcional
34/79
Combinando propiedades
Las propiedades se pueden combinar paraescribir expresiones ms complejas.
Una expresin OCL siempre se evala a un
objeto especfico de un tipo especifico.context Cliente
inv: self.lim_max_mov >=self.cuentas.Movs-
>size()
Cliente
Nombre: StringApellidos: StringEdad: Integerlim_max_mov:Integer
Movimiento
Importe: RealConcepto: StringFecha: Date
Cuenta
/saldo: Real
Titulares
Movs
0..*0..*
1..* cuenta
s
34
-
8/13/2019 IDP 03 Modelo funcional
35/79
Operaciones de coleccin535
-
8/13/2019 IDP 03 Modelo funcional
36/79
Colecciones
Siempre que una navegacin resulta enuna coleccin de objetos podemos utilizaroperaciones de coleccin para manipular
la coleccin. El tipo Collection es un tipo predefinido
en OCL. El tipo esta definido junto conoperaciones predefinidas.
Las operaciones de coleccin nuncamodifican las colecciones.
36
-
8/13/2019 IDP 03 Modelo funcional
37/79
Colecciones
Hay tres formas de obtener colecciones: (1) A partir de un literal
Ejemplos de literales:
Set {1, 5, 3, 2}Bag {1, 2, 3, 2, 1}OrderedSet {1 , 2, 3 , 5 , 7 , 11, 13, 17 }
Sequence {1 , 2, 2, 3 , 3, 7 , 11, 13, 17 }
37
-
8/13/2019 IDP 03 Modelo funcional
38/79
Colecciones
(2) A partir de una navegacin (que resulte enuna coleccin):
context Compaa
inv:self.empleados ...
(3) A partir de operaciones en coleccin queresulten en nuevas colecciones.
collection1->union(collection2)
Persona
nombre : String
edad : Integer
esDesocupado : Boolean
Compaa
nombre : String
* +empleados*
1+gerente
1
38
-
8/13/2019 IDP 03 Modelo funcional
39/79
Operaciones de coleccin
Las operaciones estn especificadas en funcinde la jerarqua de tipos para colecciones.
collection
set sequencebagorderedset
sizeincludesexcludes
countincludesAllisEmpty
notEmptysum
product
39
-
8/13/2019 IDP 03 Modelo funcional
40/79
Operaciones de coleccin40
asSet
asOrderedSetasSequence
asBag
count=union
flatten
collection
set sequencebagorderedsetunion=intersection
-including
excluding
symmetricDifferencecount
flattenasSetasOrderedSet
asSequence
asBag
append
prepend
insertAt
subOrderedSet
atindexOf
first
last
union=intersection
-including
excludingcount
flattenasSetasOrderedSet
asSequence
asBag
append
prepend
insertAt
subSequence
at
indexOffirst
lastincluding
excluding
-
8/13/2019 IDP 03 Modelo funcional
41/79
Notacin y sintaxis
Notacin flecha ->:coleccin->operacin( v: Type | expresin-booleana-utilizando-v )
coleccin->operacin( v | expresin-booleana-utilizando-v )
coleccin->operacin(expresin-booleana)
v un iterador, es una referencia a losobjetos en la coleccin
El contexto para la expresin del argumento
de operacin es el contexto que lecorresponde al elemento de la coleccin en elcual la operacin es invocada.
41
-
8/13/2019 IDP 03 Modelo funcional
42/79
Operacin size
La operacin predefinida size() nospermite obtener la cantidad de elementosde una coleccin.
context Clienteinv: self.Cuentas->size() < 10
ClienteNombre: StringApellidos: StringEdad: IntegerSexo: Genero
Cuenta/saldo: Real
CuentaNmina
Cuentas
Titulares 0..*
1..*
42
-
8/13/2019 IDP 03 Modelo funcional
43/79
Operacin select
Permite obtener un subconjunto especfico deuna coleccin.
collection->select( expresin booleana )
El resultado es una coleccin que contiene todoslos elementos de la coleccin origen para loscuales es verdadera la expresin booleana.
Para encontrar el resultado de esta operacin, se
evala la expresin para cada elemento de lacoleccin. Si el resultado de la evaluacin esverdadero para un elemento, ste se incluye en lacoleccin resultante.
43
-
8/13/2019 IDP 03 Modelo funcional
44/79
Operacin select
context Proyecto
inv: self.participa -> select (edad > 50) -
>notEmpty()
inv: self.participa-> select (e: Empleado |
e.edad > 50) ->notEmpty()
inv: self.participa-> select (e | e.edad >
50) ->notEmpty()
Proyecto
nombre : String
presupuesto : Integer
Empleadonombre : String
apellido : String
edad : Integer
esCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
44
-
8/13/2019 IDP 03 Modelo funcional
45/79
Operacin reject
Permite obtener un subconjunto de todoslos elementos de una coleccin para elcual la expresin se evala a falso.
context Proyectoinv: self.participa -> reject (
esCasado ) ->isEmpty()
Proyecto
nombre : String
presupuesto : Integer
Empleado
nombre : String
apellido : String
edad : Integer
esCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
45
-
8/13/2019 IDP 03 Modelo funcional
46/79
Select y reject
La operacin reject est disponible en OCLpor conveniencia, debido a que cadareject se puede escribir como un select
con la expresin booleana negada.
collection->reject( v | expresin-
booleana-utilizando-v )
collection->select( v | not
(expresin-booleana-utilizando-v ) )
46
-
8/13/2019 IDP 03 Modelo funcional
47/79
Operacin collect
La operacin collect se utiliza cuando queremos derivaruna nueva coleccin a partir de otra, pero que contieneobjetos diferentes de la coleccin original.
Por ejemplo: deseamos obtener una coleccin de lasfechas de cumpleaos de los empleados de la
compaa:self.participa->collect( diaNacimiento )self.participa->collect( emp : Empleado |emp.diaNacimiento )
Proyecto
nombre : String
presupuesto : Integer
Empleado
nombre : String
apellido : String
edad : Integer
esCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
47
-
8/13/2019 IDP 03 Modelo funcional
48/79
Operacin collect
La coleccin resultante es un bag. Para convertir el bag en un set:
self.participa->collect( diaNacimiento )->asSet()
Nota: El Bag resultante de la operacin collect siempretiene el mismo tamao que la coleccin original.
Proyecto
nombre : String
presupuesto : Integer
Empleado
nombre : String
apellido : String
edad : Integer
esCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
48
-
8/13/2019 IDP 03 Modelo funcional
49/79
Forma resumida de collect
Existe una forma resumida de escribir laoperacin collect
self.empleados->collect( diaNacimiento )
self.empleados.diaNacimiento Vlido para cualquier propiedad definida
en los objetos pertenecientes a unacoleccin
collection.propertyname
collection->collect(propertyname)
49
-
8/13/2019 IDP 03 Modelo funcional
50/79
Ej. de collect
El saldo de toda cuenta debe ser siempremayor o igual a cero.
context Cuenta
inv:self.Movs->collect(Importe)->sum() > 0
inv: self.Movs.Importe->sum() > 0
0..*
ClienteNombre: String
Apellidos: StringEdad: IntegerSexo: Genero
Cuenta/saldo: Real
CuentaNmina
Cuentas
Titulares 0..*
1..*
MovimientoImporte: RealConcepto: StringFecha: Fecha
Movs
0..*
50
-
8/13/2019 IDP 03 Modelo funcional
51/79
Cuantificadores
Devuelven un valor booleano Cuantificador universal : forAll Cuantificador existencial: existscontext Proyectoinv: self.participa->forAll( p: Empleado
| p.edad
-
8/13/2019 IDP 03 Modelo funcional
52/79
Operacin forAll
El operador forAll tiene una variante extendida en el cual se utiliza msde un iterador. Ambos iteradores iterarn sobre la coleccin completa (el producto
cartesiano de 2 colecciones)
context Proyecto
inv: self.participa-> forAll (e1, e2: Empleado |
e1 e2 implies e1.apellido e2.apellido)
Proyecto
nombre : String
presupuesto : Integer
Empleado
nombre : String
apellido : String
edad : IntegeresCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
52
-
8/13/2019 IDP 03 Modelo funcional
53/79
Ejemplo exists
context Proyecto
inv: self.participa->exists( p |
p.nombre = Jack)
ClienteNombre: String
Apellidos: StringEdad: IntegerSexo: Genero
Cuenta/saldo: Real
CuentaNmina
Cuentas
Titulares 0..*
1..*
Context Cuenta
inv: self.Titulares->exists(c : Cliente
| c.Edad>=18)
Proyecto
nombre : String
presupuesto : Integer
Empleadonombre : String
apellido : String
edad : Integer
esCasado : Boolean
diaNacimiento : Date
**+trabaja_en
*+participa*
53
-
8/13/2019 IDP 03 Modelo funcional
54/79
Operacin notEmpty
En el caso de una asociacin conmultiplicidad 0..1 es til verificar si existe unobjeto o no cuando navegamos la asociacincontext Persona
inv: self.esposa->notEmpty() implies
self.esposa.genero = Genero::femenino
0..1
0..10..1+marido
0..1
+esposa Generomasculino
femenino
Persona
nombre : Stringedad : Integer
genero : Genero
54
-
8/13/2019 IDP 03 Modelo funcional
55/79
Operacin count
Coleccin-> count(object) El nmero de veces que la coleccin incluye
el objeto pasado como parmetro (object)
Bag{1, 2, 3, 2, 4, 2}->count(2) = 3
55
l d l d
-
8/13/2019 IDP 03 Modelo funcional
56/79
Includes y excludes
Coleccin-> includes(Object) Verdadero si el objeto es un elemento de la
coleccin, falso en otro caso
Set{1,2,3, 5, 4}->includes(2)devuelve True
Coleccin-> excludes(Object) Verdadero si el objeto no es un elemento de la
coleccin, falso en otro casoSet{1, 3, 5, 4}->excludes(2) devuelve True
56
Ej l d i l d
-
8/13/2019 IDP 03 Modelo funcional
57/79
Ejemplo de includes
context EscuelaInternacional::obtenerAlumnosDeUnCurso(c: CursoCacic):
Set(Alumno)
body: if cursos->includes(c)
then c.alumnos
else Set{}endif
AlumnoDNI : Integernombre : Stringapellido : Stringesbecado : Boolean
CursoCacicnombre : Stringmodalidad : Mod
obtenerCantidadDeAlumnos() : IntegerobtenerAlumnosbecados() : Set(Alumnos)
1..*+alumnos1..*
EscuelaInternacional
numero : Integerfecha : Date
obtenerAlumnosDeUnCurso(c : CursoCacic) : Set(Alumno)
1..*+cursos 1..*
57
M difi i d l i
-
8/13/2019 IDP 03 Modelo funcional
58/79
Modificacin de colecciones
Coleccin-> including(object )Devuelve una nueva coleccin compuesta de
la coleccin original ms objectSet{1, 2}->including(3) devuelve Set{1, 2,3}
Coleccin->excluding(object)Devuelve una nueva coleccin compuesta de
la coleccin original menos objectSet{1,2,3}->excluding(2) devuelveSet{1,3}
58
O i
-
8/13/2019 IDP 03 Modelo funcional
59/79
Otras operaciones59
Flatten (automatic):Set{Bag{1,2,2},Bag{2}}
devuelve Set{1,2}
Operaciones de comparacin=
O i d j
-
8/13/2019 IDP 03 Modelo funcional
60/79
Operaciones de conjuntos
Coleccin-> intersection( otra_coleccin ) Coleccin->union (otra_coleccin ) Coleccin->minus(otra_coleccin ) Coleccin-
>symmetricDifference(otra_coleccin )
60
-
8/13/2019 IDP 03 Modelo funcional
61/79
Includes e includesAll
Vuelo Persona
piloto
asistentes
tripulacion
1..*1
1..*{subset}
{subset}
vuelos
Context Vuelo
inv: self.tripulacion -> includes(self.piloto)
inv: self.tripulacion -> includesAll(self.asistentes)
61
Operaciones en colecciones
-
8/13/2019 IDP 03 Modelo funcional
62/79
Operaciones en coleccionesordenadas
Las operaciones first y last nos permitenobtener el primer y ltimo elementorespectivamente:
Sequence{a,b,c,c,d,e}->first() =a
OrderedSet{a,b,c,d}->last() = d
62
Operaciones en colecciones
-
8/13/2019 IDP 03 Modelo funcional
63/79
Operaciones en coleccionesordenadas
63
La operacin at resulta en el elemento enla posicin especificada en su argumentoSequence{a,b,c,c,d,e}->at(3) = c
Las operacin indexOf devuelve laposicin de la primera aparicin de unelemento en la coleccin. Nota: El ndicecomienza con 1, no ceroSequence{a,b,c,c,d,e}-
>indexOf(c) = 3
Operaciones en colecciones
-
8/13/2019 IDP 03 Modelo funcional
64/79
Operaciones en coleccionesordenadas
La operacin subsequence puede aplicarse asecuencias solamente, y resulta en lasecuencia de elementos desde el ndiceinferior al ndice superior de la coleccin
originalSequence{a,b,c,c,d,e}->subSequence(3,5) = Sequence{c,c,d}
Una operacin similar se define para
OrderedSet denominada subOrderedSetOrderedSet{a,b,c,d}->subOrderedSet(2,3) = OrderedSet{b,c}
64
-
8/13/2019 IDP 03 Modelo funcional
65/79
Resolviendo propiedades6
R l i d i d d
-
8/13/2019 IDP 03 Modelo funcional
66/79
Resolviendo propiedades
No siempre es inmediato determinar a quobjeto se aplica una propiedad: La instancia contextual (self) puede estar
implcitaUna o ms variables iteradoras (de las
operaciones de coleccin) pueden estarimplcitas (por ejemplo en los
cuantificadores)
66
Ejemplo resolviendo
-
8/13/2019 IDP 03 Modelo funcional
67/79
Ejemplo resolviendopropiedades
Las variables iteradoras implcitas no tienennombre. Las propiedades empleado, empleador,apellido y nombre se aplican a objetos que hansido omitidos en la especificacin.
Persona
nombrePer : String
apellido: String
esDesocupado : Boolean
Compaa
nombre : String
numerodeEmpleados : Integer
+empleado
0..*0..*
Trabajo
titulo : StringdiaComienzo : Date
salario : Integer
+empleador
0..* 0..*
context Persona
inv: empleador->forAll( empleado->exists(
apellido= nombre))
67
Ejemplo resolviendo
-
8/13/2019 IDP 03 Modelo funcional
68/79
Ejemplo resolviendopropiedades 1) En el lugar donde empleador se utiliza slo existe unavariable implcita self de tipo Persona. Por consiguiente
empleador debe ser una propiedad de self. 2) En el lugar donde se utiliza empleado existen dos variables
implcitas: self: Persona e iter1: Compaa. Por consiguiente,empleado debe ser una propiedad de self o de iter1. Si
empleado fuera una propiedad de self y de iter1 entonceseste debera aplicarse al iterador ms interno, el cual es iter1.
Persona
nombreEmp : String
Apellido: String
esDesocupado : Boolean
Compaa
nombre : String
numerodeEmpleados : Integer
+empleado
0..*0..*
Trabajo
titulo : String
diaComienzo : Date
salario : Integer
+empleador
0..* 0..*
context Persona
inv: empleador->forAll( empleado ->exists( apellido= nombre))
68
Resolviendo Propiedades
-
8/13/2019 IDP 03 Modelo funcional
69/79
Resolviendo Propiedades
3) En el lugar donde se utilizan apellido y nombre existen tresvariables implcitas: self: Persona, iter1: Compaa e iter2: Persona. Por consiguiente tanto apellido como nombre deben ser una
propiedad de self o de iter1 o iter2. En el modelo UML la propiedadnombre es una propiedad iter1. Sin embargo, apellido es unapropiedad de self e iter2. Esto es ambiguo, por lo tanto apellidorefiere al iterador ms cercano, que es iter2.
Persona
nombreEmp : String
Apellido: String
esDesocupado : Boolean
Compaa
nombre : String
numerodeEmpleados : Integer
+empleado
0..*0..*
Trabajo
titulo : String
diaComienzo : Date
salario : Integer
+empleador
0..* 0..*
context Persona
inv: empleador->forAll( empleado ->exists( apellido=
nombre))
69
-
8/13/2019 IDP 03 Modelo funcional
70/79
Ejercicio
context Componente
inv: self.utiliza-> forAll (s |
self.desarrolladores.conoce-> includes(s) )
Genero
masculino
femenino
Ingeniero_Informatico
nombre : String
apellido : String
dni : String
edad : Integer
sexo : Genero
Software
id_software : Integer1..*1..*
+conoce
1..*
Componente
id_comp : Integer
1..*
1..*
+desarrollan1..*
+desarrolladores 1..*
1..*
1..*
+utiliza 1..*
1..*
1..*
70
-
8/13/2019 IDP 03 Modelo funcional
71/79
OCL avanzado71
Variables locales
-
8/13/2019 IDP 03 Modelo funcional
72/79
Variables locales72
context Meeting
inv:
let noConflict : Boolean =
participants.meetings-> forAll(m|mselfandm.isConfirmedimplies notself.inConflict(m))
in
isConfirmedimplies noConflict
meetings
Definiciones
-
8/13/2019 IDP 03 Modelo funcional
73/79
Definiciones73
Similar a variables locales, pero permitereutilizar reutilizar cdigo OCL endiferentes restricciones
context Meetingdef: noConflict : Boolean =
participants.meetings->forAll(m|mself and
m.isConfirmedimplies not
self.inConflict(m))
Paquetes en OCL
-
8/13/2019 IDP 03 Modelo funcional
74/79
Paquetes en OCL74
package MeetingExample
context Meeting::isConfirmed : Boolean
init: false
context Teammember:meetings : Set(Meetings)
init: Set{}
..endpackage
Extensin a OCL
-
8/13/2019 IDP 03 Modelo funcional
75/79
Extensin a OCL
OCL no contempla la asignacin como un operador, por loque no es posible definir la semntica de los mtodosmodificadores del estado.
Por ello, utilizaremos pseudocdigo para completar elmodelado funcional cuando sea necesario describir cambiosen el estado de los objetos.
Asumiremos que existen los constructores de: asignacin,secuencia, iteracin y sentencias condicionales. Ejemplos:Si, entonces, si_no, Para cada , Desde ... hasta,
etc.
Descripcin de operaciones mediante una combinacin depseudocdigo OCL.
75
Ejemplo de operacin
-
8/13/2019 IDP 03 Modelo funcional
76/79
1 origen
1 destino
Ejemplo de operacin
Mtodo para calcular todos los aeropuertos conectados conun aeropuerto determinado mediante vuelos directos o conuna sola escala.
Aeropuerto::EncontrarVuelosUnaParadaODirectosDevuelve Bag( Aeropuerto )
PrincipioDevolver self.dvori.destino->union(
self.dvori.destino.dvori.destino)Fin
DescripciondeVuelo
NumerodeVuelo
HoradeSalida
Duracion
Aeropuerto
NombreAeropuerto
CodigoAeropuerto
dvori *
dvdes *
76
Ej: operacin de consulta
-
8/13/2019 IDP 03 Modelo funcional
77/79
Ej: operacin de consulta
Cliente::CalcularImportePedidos(FechaInicial,
FechaFinal)Devuelve RealPrincipio
Total:= 0;
Pedidos:= self.Pedido->select( Fecha>=Fechainicial and
Fecha
-
8/13/2019 IDP 03 Modelo funcional
78/79
Ej: operacin de modificacin
Artculo::AumentarPrecioArtculo(Porcentaje)
Principio
precio := precio*Porcentaje
Fin
Tambin se puede hacer con postcondicin
nombre
lmiteCrdito
Clientefecha
/importeestado
Pedido
cantidad
/totalLnea
Lneareferencia
preciostock
Artculo
1 * 1 * * 1
78
OCL vs pseudocdigo
-
8/13/2019 IDP 03 Modelo funcional
79/79
OCL vs pseudocdigo
En pseudocdigo + OCLLnea:: totalLnea() devuelve Realprincipio
devolver self.cantidad * self.Artculo.precio
fin
En OCL:context Lnea:: totalLnea : Real
derive: self.cantidad * self.Artculo.precio
nombre
lmiteCrdito
Clientefecha
/importeestado
Pedido
cantidad
/totalLnea
Lneareferencia
preciostock
Artculo
1 * 1 * * 1
79