IDP 03 Modelo funcional

Embed Size (px)

Citation preview

  • 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