Professional Documents
Culture Documents
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
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
Exercice
Navigation - ambiguts
attr2=c3.attr3
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
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
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
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)
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)
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()
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()) )
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