Arquitectura del Software OCL – Object Constraint Language Jose Luis Arciniegas Rodrigo Cerón Popayán, Septiembre 2006 Universidad del Cauca FIET – IPET.

1 Arquitectura del Software OCL – Object Constraint Langu...
Author: Gloria Ortega Gutiérrez
0 downloads 0 Views

1 Arquitectura del Software OCL – Object Constraint Language Jose Luis Arciniegas Rodrigo Cerón Popayán, Septiembre 2006 Universidad del Cauca FIET – IPET Departamento de Telemática

2 14/09/2006Maestría en Ingeniería2 Contenido de la presentación Introducción a OCL OCL ejemplos Construcción de modelos con OCL

3 14/09/2006Maestría en Ingeniería3 Introducción a OCL - 1 Lenguaje de modelado Es un “add-on” para UML OCL utiliza los tipos de UML Las expresiones OCL adicionan información a los modelos y artefactos OCL anterior a MDA, es una combinación necesaria. Modelado tradicional es incompleto, informal, impreciso e inconsistente

4 14/09/2006Maestría en Ingeniería4 Introducción a OCL – 2 Fallos en el modelado producidos por limitaciones en los diagramas

5 14/09/2006Maestría en Ingeniería5 Introducción a OCL - 3 Beneficios por el uso de expresiones OCL en el modelado Interpretación No ambiguas Precisión y detalle Utilización de herramientas En forma aislada no son fáciles de entender Combinación de UML y OCL

6 14/09/2006Maestría en Ingeniería6 Aporte de OCL a UML

7 14/09/2006Maestría en Ingeniería7 Características de OCL Consulta y restricciones Restricción sobre uno o mas valores de un modelo o sistema orientado a objetos o sus partes OCL en UML 2 sirve para escribir mas que restricciones Expresiones OCL usadas para indicar un valor context Flight::availableSeats() : Integer body: plane.numberOfSeats - passengers->size() Tiene capacidades similares a SQL

8 14/09/2006Maestría en Ingeniería8 Características de OCL Fundamentos matemáticos no símbolos Facilidad de uso del lenguaje natural Para MDA en el PIM necesario los cimientos matemáticos para la transformación automática Lenguaje no ambiguo, fácil de leer y escribir por los practicantes y consumidores de tecnologías de objetos

9 14/09/2006Maestría en Ingeniería9 Características de OCL Lenguaje fuertemente tipado Chequeo de expresiones OCL sin necesidad de versión ejecutable. Lenguaje declarativo Las expresiones dicen lo que debe hacerse. Los valores son expresados a un gran nivel de abstracción

10 14/09/2006Maestría en Ingeniería10 Contenido de la presentación Introducción a OCL OCL ejemplos Construcción de modelos con OCL

11 14/09/2006Maestría en Ingeniería11 Ejemplo R&L

12 14/09/2006Maestría en Ingeniería12 Valores iniciales y reglas de derivación context LoyaltyAccount::points init: 0 context CustomerCard::valid init: true context CustomerCard::printedName derive: owner.title.concat(' ').concat(owner.name)

13 14/09/2006Maestría en Ingeniería13 Operaciones de consulta context LoyaltyProgram::getServices(): Set(Service) body: partners.deliveredServices- >asSet() context LoyaltyProgram::getServices(pp: ProgramPartner) : Set(Service) body: if partners->includes(pp) then pp.deliveredServices else Set endif

14 14/09/2006Maestría en Ingeniería14 Definición de nuevos atributos y operaciones context LoyaltyAccount def: turnover : Real = transactions.amount->sum() context LoyaltyProgram def: getServicesByLevel(levelName: String): Set(Service) = levels->select(name= levelName ).availableServices->asSet()

15 14/09/2006Maestría en Ingeniería15 Agregando elementos invariantes context Customer inv ofAge: age >= 18 context CustomerCard inv checkDates: validFrom.isBefore(goodThru) context CustomerCard inv ofAge: owner.age >= 18

16 14/09/2006Maestría en Ingeniería16 Agregando elementos invariantes – clases asociación context LoyaltyProgram inv knownServiceLevel: levels-> includesAll(Membership.currentL evel) context Membership inv correctCard: participants.cards- >includes(self.card) context Membership def : getCurrentLevelName() : String = currentLevel.name

17 14/09/2006Maestría en Ingeniería17 Agregando elementos invariantes - Enumeraciones context Membership inv levelAndColor: currentLevel.name = 'Silver' implies card.color = Color::silver and currentLevel.name = 'Gold' implies card.color = Color::gold

18 14/09/2006Maestría en Ingeniería18 Colecciones de objetos context LoyaltyProgram inv minServices: partners.deliveredServices- >size() >= 1 context Customer inv sizesAgree: programs->size() = cards->select( valid = true )->size() context LoyaltyProgram inv noAccounts: partners.deliveredServices- >forAll( pointsEarned = 0 and pointsBurned = 0 ) implies Membership.account- >isEmpty()

19 14/09/2006Maestría en Ingeniería19 Trabajo con colecciones - 1 partners.numberOfCustomers ó partners->collect( numberOfCustomers ) partners.deliveredServices ó partners->collect( deliveredServices ) notEmpty, includes( object ), union ( collection of objects ), intersection ( collection of objects )

20 14/09/2006Maestría en Ingeniería20 Trabajo con colecciones - 2 context ProgramPartner inv nrOfParticipants: numberOfCustomers = programs.participants->size() context ProgramPartner inv nrOfParticipants: numberOfCustomers = programs.participants->asSet()- >size() context LoyaltyProgram inv firstLevel: levels->first().name = 'Silver'

21 14/09/2006Maestría en Ingeniería21 Precondiciones y postcondiciones context LoyaltyAccount::isEmpty(): Boolean pre : -- none post: result = (points = 0) context Customer::birthdayHappens() post: age = age@pre + 1 context Service::upgradePointsEarned(a mount: Integer) post: calcPoints() = calcPoints@pre() + amount context Subject::hasChanged() post: observer^update(12, 14)

22 14/09/2006Maestría en Ingeniería22 Herencia context ProgramPartner inv totalPoints: deliveredServices.transactions.p oints->sum() < 10,000 context ProgramPartner inv totalPointsEarning: deliveredServices.transactions ->select( oclIsTypeOf( Earning ) ).points->sum() < 10,000

23 14/09/2006Maestría en Ingeniería23 Comentarios /* the following invariant states that the maximum number of points that may be earned by all services of a program partner is equal to 10,000 */ context ProgramPartner inv totalPointsEarning: deliveredServices.transactions -- all transactions ->select( oclIsTypeOf( Earning ) ) -- select earning ones.points->sum() -- sum all points < 10,000 -- sum smaller than 10,000

24 14/09/2006Maestría en Ingeniería24 Expresiones Let context CustomerCard inv: let correctDate : Boolean = self.validFrom.isBefore(Date::now) and self.goodThru.isAfter(Date::now) in if valid then correctDate = false else correctDate = true endif

25 14/09/2006Maestría en Ingeniería25 Contenido de la presentación Introducción a OCL OCL ejemplos Construcción de modelos con OCL

26 14/09/2006Maestría en Ingeniería26 Expresiones OCL y su contexto

27 14/09/2006Maestría en Ingeniería27 Completando diagramas de clases context LoyaltyAccount::usedServices : Set(Services) derive: transactions.service->asSet() context LoyaltyAccount::points : Integer init: 0 context LoyaltyAccount::transactions : Set(Transaction) init: Set{}

28 14/09/2006Maestría en Ingeniería28 Completando diagramas de clases context LoyaltyAccount::getCustomerName() : String body: Membership.card.owner.name context LoyaltyAccount inv oneOwner: transactions.card.owner->asSet()->size() = 1 context LoyaltyProgram::enroll(c : Customer) pre : c.name ' ' post: participants = participants@pre->including( c )

29 14/09/2006Maestría en Ingeniería29 Completando diagramas de clases context File::save() post: self.project.builders->forAll( b : Builder | b^incrementalBuild() ) context Person inv: self.mortgages.security.owner ->forAll(owner : Person | owner = self)

30 14/09/2006Maestría en Ingeniería30 Completando diagrama de clases

31 14/09/2006Maestría en Ingeniería31 Completando diagramas de clase context TransactionReportLine::partnerName : String derive: transaction.generatedBy.partner.name context TransactionReportLine::serviceDesc : String derive: transaction.generatedBy.description context TransactionReportLine::points : Integer derive: transaction.points context TransactionReportLine::amount : Real derive: transaction.amount context TransactionReportLine::date : Date derive: transaction.date

32 14/09/2006Maestría en Ingeniería32 Completando diagrama de clases

33 14/09/2006Maestría en Ingeniería33 Completando diagramas de clase context TransactionReport::name : String derive: card.owner.name context TransactionReport::balance : Integer derive: card.Membership.account.points context TransactionReport::number : Integer derive: card.Membership.account.number context TransactionReport::totalEarned : Integer derive: lines.transaction->select( oclIsTypeOf( Earning ) ).points->sum() context TransactionReport::totalBurned : Integer derive: lines.transaction->select( oclIsTypeOf( Burning ) ).points->sum()

34 14/09/2006Maestría en Ingeniería34 Completando diagramas de clase context TransactionReport inv dates: lines.date->forAll( d | d.isBefore( until ) and d.isAfter( from ) ) context TransactionReport inv cycle: card.transactions->includesAll( lines.transaction )

35 14/09/2006Maestría en Ingeniería35 Completando diagramas de clase context Person inv: managedProject->isEmpty() or performedProject -> isEmpty() context Project inv: projectLeader->isEmpty() or projectMember-> isEmpty()

36 14/09/2006Maestría en Ingeniería36 Completando diagramas de iteración

37 14/09/2006Maestría en Ingeniería37 Completando diagramas de iteración context LoyaltyProgram::addTransaction( accNr: Integer, pName: String, servId: Integer, amnt: Real, d Date ) post: let acc : LoyaltyAccount = Membership.account->select( a | a.number = accNr ), newT : Transaction = partners-> select(p | p.name = pName).deliveredServices ->select(s | s.serviceNr = servId).transactions ->select( date = d and amount = amnt ), card : CustomerCard = Membership->select( m | m.account.number = accNr ).card in acc.points = acc.points@pre + newT.points and newT.oclIsNew() and amnt = 0 implies newT.oclIsTypeOf( Burning ) and amnt > 0 implies newT.oclIsTypeOf( Earning ) and acc.transactions - acc.transaction@pre = Set{ newT } and card.transactions - card.transaction@pre = Set{ newT }

38 14/09/2006Maestría en Ingeniería38 Completando diagramas de iteración

39 14/09/2006Maestría en Ingeniería39 Completando diagramas de estados

40 14/09/2006Maestría en Ingeniería40 Completando diagramas de estados context Bottle inv: (self.oclInState(capped) or self.oclInState(full)) implies contents = capacity inv: (self.oclInState(empty) implies contents = 0 inv: self.oclInState(capped) implies myCap->notEmpty() inv: self.oclInState(partiallyFilled) implies myFiller->notEmpty()

41 14/09/2006Maestría en Ingeniería41 Completando diagramas de actividad

42 14/09/2006Maestría en Ingeniería42 Completando diagramas de componentes

43 14/09/2006Maestría en Ingeniería43 Completando casos de uso Postcondition: -- all goodThru dates are in the future lp.participants.cards.goodThru->forAll( d | d.isAfter( Date::now ) and -- all cards that have earned enough points and have not been marked -- otherwise are upgraded let upgradedCards : Set( CustomerCard ) = lp.participants.cards->select( c | c.getTotalPoints( fromDate ) >= upgradeLimit and c.markedNoUpgrade = false ) in upgradedCards->forAll( c | lp.levels->indexOf( c.Membership.currentLevel ) = lp.levels->indexOf( c.Membership.currentLevel@pre ) + 1

44 14/09/2006Maestría en Ingeniería44 Contenido de la presentación Introducción a OCL OCL ejemplos Construcción de modelos con OCL Uso de OCL para MDA

45 14/09/2006Maestría en Ingeniería45 Uso de OCL en el framework de MDA

46 14/09/2006Maestría en Ingeniería46 Relaciones entre sistema, modelo y metamodelo

47 14/09/2006Maestría en Ingeniería47 Metamodelo de UML simplificado

48 14/09/2006Maestría en Ingeniería48 Metamodelo OCL simplificado

49 14/09/2006Maestría en Ingeniería49 Contexto de OCL en terminos de los metamodelos

50 14/09/2006Maestría en Ingeniería50 Lecturas Recomendadas Warmer, J., Kepple, A., “The Object Constraint Language: Getting your Models ready for MDA” 2nd edition, Addison Wesley, Boston, MA, 2003

51 14/09/2006Maestría en Ingeniería51 Bibliografía [Warmer et Kepple, 2003] Warmer, J., Kepple, A., “The Object Constraint Language: Getting your Models ready for MDA” 2nd edition, Addison Wesley, Boston, MA, 2003 [OMG-UML 1.4.2, 2005] OMG, “Unified Modeling Language Specification”, version 1.4.2, formal/05-04-01, Needham, MA, 2005 (ISO/IEC 19501:2005(E) )