TD 5 OCL Exercice 1°) Si l’on est marié, c’est que l’on a une épouse ou un mari Context Person inv Mariage1 : self.isMarried IMPLIES { self.wife->notEmpty() or self.husband->notEmpty() } 2°) Pour être marié, il faut avoir plus de 18 ans Context Person inv Mariage2 : self.isMarried IMPLIES self.age > 18 3°) Tous les employés d’une société doivent avoir plus de 18 ans Context Company c inv Company1 : c.employe->forAll( p : Person | p.age > 18 ) 4°) Si l’on a une épouse alors c’est une femme, et si on a un mari alors c’est un homme Context Person p inv Mariage3 : p.wife->notEmpty() IMPLIES p.wife.gender = Gender::female and p.husband->notEmpty() IMPLIES p.husband.gender = Gender::male 5°) Une personne ne peut pas être employée par plus de 2 sociétés Context Person p inv Employe : p.employer->Size()<= 2 6°) Le nombre total d’employés d’une société est égal au nombre d’employés simples plus le directeur Context Company::numberOfEMployee:int derive : self.employee->size() + 1 7°) Le revenu d’une personne majeure est la somme des salaires des emplois qu’elle occupe Context Person::income():float pre Age : self.age > 18 body Salaire : if self.isUnemployed then 0 else p.job.salary->sum() endif ATTENTION si il n'y a pas de role dans une association, pour acceder a l'autre élément de l'association il faut utiliser le nom de la classe avec une MINUSCULE. (Une classe commence par une majuscule) 8°) Une société doit avoir des employés de plus de 50 ans Context Company c inv Company3 : c.employee->select(e : employee | e.age > 50 ).notEmpty() // OU c.employee->exists(e:employee|e.age>50) 9°) Une société ne peut pas employer des homonymes Context Company c inv Company4 : c.employee->forAll(p1,p2 : Person | p1 <> p2 IMPLIES ( p1.fisrtName <> p2.firstName OR p1.lastName <> p2.lastName ) ) 10°) Si une personne possède deux parents, l’un est une femme et l’autre est un homme Context Person p inv Famille1 : p.parent->exists(parent p | p.gender = Gender::female) and p.parent->exists(parent p | p.gender = Gender::male) 11°) Tous les enfants d’une personne ont bien cette personne comme parent et inversement Contex Person p inv Famille2 : p.child->forAll(child.parent->includes(p))