You are on page 1of 4

Object Constraint Language

Corrig des exercices


Philippe Collet SI5 Introduction lIDM

Exercice
Ajoutez un attribut mre de type Personne dans la classe Personne. Ecrivez une contrainte prcisant
que la mre d'une personne ne peut tre cette personne elle-mme et que l'ge de la mre doit tre suprieur celui de la personne

context Personne inv: self.mere <> self and self.mere.age > self.age

Octobre 2009

Ph. Collet

Exercice Avec la classe Personne tendue


Indiquez quune personne marie est forcment majeur

(mauvais) exercice En supposant l'existence


d'un attribut hauteur dans la classe Rectangle d'une mthode hauteur():Rel dans Polygone

context Personne inv: mari implies majeur

Ecrivez un invariant dans Polygone disant que le rsultat de hauteur():Rel vaut hauteur pour les polygones qui sont des rectangles, sinon 0
context p : Polygone::hauteur() inv: if p.oclIsKindOf(Rectangle) then result=p.oclAsType(Rectangle).hauteur else result=0 endif

Trouvez une version plus compacte de lexpression suivante context Personne inv majeurIf: if age >=18 then majeur=vrai else majeur=faux endif context Personne inv: majeur = age >= 18

Ceci un exemple de trs mauvaise conception objet !


Ph. Collet 3 Ph. Collet 4

Exercice

Navigation - ambiguts

context C1 inv : c2.attr2=c2.c3.attr3 context C2 inv :

Ecrivez la contrainte qui caractrise l'attribut driv carteVermeil


Un voyageur a droit la carte vermeil si c'est une femme de plus de 60 ans ou un homme de plus de 65 ans.

attr2=c3.attr3

Les deux contraintes ci-dessus sont-elles quivalentes ?


NON : la premire dit que pour des instances de C2 et C3 lies avec une instance de C1, les attributs attr2 et attr3 sont gaux, mais n'impose rien des instances de C2 et C3 non lies une instance de C1 (et il y en a cause de la multiplicit). La deuxime dit que pour tout couple d'instances de C2 et C3 lies, ces deux attributs sont gaux.
5 Ph. Collet 6

context Voyageur inv : carteVermeil = ((age >= 65) or ((sexe = Sexe::fminin) and (age >= 60)) ) -- Cette contrainte peut galement s'crire avec derive.

Ph. Collet

Exercice

Exercice

Depuis une instance p de la classe Personne


1. Comment naviguer vers lobjet Encadrement de son responsable ? 2. Comment naviguer vers lobjet Encadrement de son agentSecrtariat ? context p : Personne p.encadrement[responsable] p.Encadrement[agentSecrtariat]

Le salaire d'un agent de secrtariat est infrieur celui de son responsable ? Un agent de secrtariat a un type de contrat agentAdministratif (String) ?
context e : encadrement inv : e.responsable.contrat.salaire >= e.agentSecrtariat.contrat.sal aire context e : encadrement inv : e.agentSecrtariat.contrat.typeContrat='agentAdministratif'

-- 1 -- 2

Ph. Collet

Ph. Collet

Exercice

Exercice Imaginez une classe Etudiant, disposant de 3 notes et munie d'une opration mention qui retourne la mention de l'tudiant sous forme d'une chane de caractres. Ecrivez les contraintes en utilisant let et result pour crire la postcondition de mention
context Etudiant :: mention() : String post: let moyenne : Real =(note1+note2+note3)/3 in if (moyenne >= 16) then result='trs bien' else if (moyenne >= 14) then result='bien' else result='moins bien' endif endif
9 Ph. Collet 10

De laide ? Un diagramme dobjets

Un agent de secrtariat a une date d'embauche antrieure la date de dbut de l'encadrement (on suppose que les dates sont des entiers)
context e : Encadrement inv : e.agentSecrtariat.contrat.dateEmbauche <= e.dateDebut

Mme chose dans le contexte de la classe Personne


context p : Personne inv : p.agentSecrtariat.contrat.dateEmbauche <= p.encadrement[agentSecrtariat].dateDebut
Ph. Collet

Exercice Ecrivez, dans le contexte de la classe Collection, l'opration size l'aide de l'opration iterate
context Collection :: size() post : result = self->iterate(elem; acc:integer=0| acc+1)

Exercice Quelle est la signification de cette expression ?


context Personne inv: Personne.allInstances()->forAll(p1, p2 | p.1 <> p2 implies p1.nom <> p2.nom )

Ecrivez, dans le contexte de la classe Collection, l'opration forAll l'aide de l'opration iterate.
context Collection :: forAll(expr) post : result = self->iterate(elem; acc : Boolean=true | acc and expr)

Comment lcrire avec isUnique ?


context Personne inv: Personne.allInstances()->isUnique(nom)

Ph. Collet

11

Ph. Collet

12

Contraintes sur les proprits La borne suprieure de multiplicit doit avoir une valeur plus grande que la borne infrieure.
context MultiplicityElement inv : lowerBound() -> notEmpty() and upperBound() -> notEmpty() implies upperBound() >= lowerBound()

Contraintes sur la relation de spcialisation


Comment les super-classes directes d'une classe sont obtenues ?
context classifier :: parents() : Set(classifier) post : result = self.generalization.general

Cette opration se gnralise facilement pour obtenir toutes les superclasses d'une classe.
context classifier :: allParents() : Set(classifier) post : result = self.parents()->union( self.parents()->collect(p | p.allParents()) )

La fonction isMultivalued renvoie vrai si la multiplicit est bien multi-value


Que signifie effectivement multi-valu ? Context MultiplicityElement::isMultivalued() : Boolean pre: upperBound()->notEmpty() post : result = (upperBound() > 1)
Ph. Collet 13

Une rgle fondamentale est que la relation de spcialisation/gnralisation ne peut induire un circuit. Un classifier ne peut donc pas apparatre comme parent de lui-mme.
context classifier inv : not self.allParents() -> includes(self)

Ph. Collet

14

You might also like