11.07.2015 Views

OCL : contraintes sur métamodèles et profiles

OCL : contraintes sur métamodèles et profiles

OCL : contraintes sur métamodèles et profiles

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Bibliographie<strong>OCL</strong> : principes Steve Cook, John Daniels , Designing Object Systems: Object-Oriented Modelling with Syntropy, Prentice Hall, 1994 Pierre-Alain Muller, Nathalie Gaertner , Modélisation obj<strong>et</strong> avecUML, Eyrolles, 2000 OMG (Object Management Group) , "Uml 2.0 ocl specification.Technical report, Object Management Group, 2003. ptc/03-10-14« OMG (Object Management Group) , "Uml 2.0 superstructurespecification. Technical report, Object Management Group, 2003.ptc/03-08-02" La notion de contrainte• Définition : Une contrainte est une expression à valeur booléenne que l'onpeut attacher à n'importe quel élément UML• Elle indique en général une restriction ou donne des informationscomplémentaires <strong>sur</strong> un modèle <strong>OCL</strong> : Langage typé, basé <strong>sur</strong>• La théorie des ensembles• La logique des prédicats <strong>OCL</strong> : Langage déclaratif• Les <strong>contraintes</strong> ne sont pas opérationnelles. On ne peut pas invoquer de processus ni d'opérations autres que des requêtes On ne décrit pas le comportement à adopter si une contrainte n'est pas respectée <strong>OCL</strong> : Langage sans eff<strong>et</strong> de bord• Les instances ne sont pas modifiées par les <strong>contraintes</strong>Ph. Coll<strong>et</strong>9Ph. Coll<strong>et</strong>10Utilisation des <strong>contraintes</strong>Contraintes <strong>et</strong> contexte Description d'invariants <strong>sur</strong> les classes <strong>et</strong> les types Préconditions <strong>et</strong> postconditions <strong>sur</strong> les opérations Contraintes <strong>sur</strong> la valeur r<strong>et</strong>ournée par une opération Une contrainte <strong>OCL</strong> est liée à un contexte :• le type,• la méthode• ou l'attribut auquel la contrainte se rapporte Règles de dérivation des attributscontext moncontexte :Expression de la contrainte Description de cibles pour les messages <strong>et</strong> les actions Exemple : Expression des gardes• conditions dans les diagrammes dynamiques Invariants de type pour les stéréotypescontext Personne inv :(age =0)-- l'âge ne peut dépasser 140 ans• Les <strong>contraintes</strong> servent en particulier à décrire la sémantique d'UML.-- : commentaire en <strong>OCL</strong> (qui s'achève avec la fin de la ligne)Ph. Coll<strong>et</strong>11Ph. Coll<strong>et</strong>12


Exercice Avec la classe Personne « étendue »• Indiquez qu’une personne mariée estforcément majeurcontext Personne inv:marié implies majeur• Trouvez une version plus compacte de l’expression suivantecontext Personne inv majeurIf:if age >=18 then majeur=vraiPrécédence des opérateurs• . ->• not - unaire• * /• + -• if then else• < > =• =• and or xor• implieselse majeur=faux endifcontext Personne inv:majeur = age >= 18Ph. Coll<strong>et</strong>25Ph. Coll<strong>et</strong>26Types énumérésType des modèles Leur syntaxe est la suivante• ::valeur Les types des modèles utilisables en <strong>OCL</strong> sont• les classifieurs, donc• les classes, les interfaces <strong>et</strong> les associations Le nom du type est déduit de l’attribut de déclaration• catégorie => Catégorie Exemple :context Personne inv:if age


(mauvais) exercice2 ème partie En supposant l'existence• d'un attribut hauteur dans la classe Rectangle• d'une méthode hauteur():Réel dans Polygone Ecrivez un invariant dans Polygone disant que le résultat dehauteur():Réel vaut hauteur pour les polygones qui sont desrectangles, sinon 0 Navigation dans les modèles• Accès aux attributs, opérations• Navigations <strong>sur</strong> les associations• Navigations <strong>sur</strong> les classes-association Autres éléments du langage• Structures l<strong>et</strong> <strong>et</strong> def• ifcontext p : Polygone::hauteur() inv:if p.oclIsKindOf(Rectangle)then result=p.oclAsType(Rectangle).hauteurelse result=0endif• @pre• result• Types <strong>OCL</strong> avancés Collections• Hiérarchie• Opérations spécifiques Ceci un exemple de très mauvaise conception obj<strong>et</strong> !• Opérations collectives• Conformance de typePh. Coll<strong>et</strong>29Ph. Coll<strong>et</strong>30Navigation : accès aux attributsNavigation : accès aux attributs Pour faire référence à un attribut de l’obj<strong>et</strong> désigné par lecontexte, il suffit d’utiliser le nom de c<strong>et</strong> élément L'accès (navigation) vers un attribut s'effectue en mentionnantl'attribut derrière l'opérateur d'accès noté '.'context Personne inv:context Voiture inv propriétaireMajeur :…age…self.propriétaire.age >= 18 L’obj<strong>et</strong> désigné par le contexte est également accessible parl’expression self• On peut donc également utiliser la notation pointéecontext Voiture inv propriétaireMajeur :propriétaire.age >= 18context Personne inv:self.age…context v : Voiture inv propriétaireMajeur :v.propriétaire.age >= 18Ph. Coll<strong>et</strong>31Ph. Coll<strong>et</strong>32


Navigation - ambiguïtésNavigation via une association qualifiéecontext C1 inv :c2.attr2=c2.c3.attr3context C2 inv :attr2=c3.attr3 Les deux <strong>contraintes</strong> ci-dessus sont-elles équivalentes ?NON : la première dit que pour des instances de C2 <strong>et</strong> C3 liées avec uneinstance de C1, les attributs attr2 <strong>et</strong> attr3 sont égaux, mais n'impose rien à desinstances de C2 <strong>et</strong> C3 non liées à une instance de C1 (<strong>et</strong> il y en a à cause de lamultiplicité).La deuxième dit que pour tout couple d'instances de C2 <strong>et</strong> C3 liées, ces deuxattributs sont égaux. Une association qualifiée utilise un ou plusieurs qualificatifs poursélectionner des instances de la classe cible de l’association.• En <strong>OCL</strong> : utilisation de [ ] Dans le contexte de banque (context Banque) on fait référence aunom des clients dont le compte porte le numéro 19503800 :self.client[19503800].nom Dans le cas où il y a plusieurs qualificatifs, il faut séparer chacunedes valeurs par une virgule en respectant l’ordre des qualificatifs dudiagramme UML. Il n’est pas possible de ne préciser la valeur que de certains qualificatifs en enlaissant d’autres non définis. Par contre, il est possible de ne préciser aucune valeur de qualificatif :self.client.nomle résultat sera l’ensemble des noms de tous les clients de la banqueAttention à la cardinalité de la cible…Ph. Coll<strong>et</strong>37Ph. Coll<strong>et</strong>38Navigation <strong>et</strong> classes associationExercice Pour naviguer vers une classe association, on utilise le nom de laclasse (en m<strong>et</strong>tant le premier caractère en minuscule).context p : Personne inv : Depuis une instance p de la classe Personne1. Comment naviguer vers l’obj<strong>et</strong> Encadrement de son responsable ?2. Comment naviguer vers l’obj<strong>et</strong> Encadrement de son agentSecrétariat ?p.contrat.salaire >= 0 Une autre manière de naviguer consiste à utiliser le nom de rôleopposé (c'est même obligatoire pour une association réflexive)context p : Personne inv :context p : Personne …p.encadrement[responsable] -- 1p.Encadrement[agentSecrétariat] -- 2p.contrat[employeur].salaire >= 0Ph. Coll<strong>et</strong>39Ph. Coll<strong>et</strong>40


Collections : hiérarchieCollections : litéraux Cinq types de collections existant en <strong>OCL</strong>.Ph. Coll<strong>et</strong>• Collection est un type abstrait• S<strong>et</strong> correspond à la notion mathématique d'ensemble• OrderedS<strong>et</strong> correspond à la notion mathématique d'ensemble ordonné• Bag correspond à la notion mathématique de famille (un élément peut yapparaître plusieurs fois)• Sequence correspond à la notion mathématique de famille, <strong>et</strong> les élémentssont, de plus, ordonnés49 On peut définir des collections par des littéraux de la manièresuivante.• S<strong>et</strong> { 2, 4, 6, 8 }• OrderedS<strong>et</strong> { 2, 4, 6, 8 }• Bag { 2, 4, 4, 6, 6, 8 }• Sequence { 'le', 'chat', 'boit', 'le', 'lait' }• Sequence { 1..10 } spécification d'un intervalle d'entiers Les collections peuvent avoir plusieurs niveaux, il est possiblede définir des collections de collections, par exemple :• S<strong>et</strong> { 2, 4, S<strong>et</strong> {6, 8 }}Ph. Coll<strong>et</strong>50R<strong>et</strong>our <strong>sur</strong> les navigations On obtient naturellement un S<strong>et</strong> en naviguant le long d'uneassociation ordinaire• ne mentionnant pas les <strong>contraintes</strong> bag ni seq à l'une de ses extrémitésR<strong>et</strong>our <strong>sur</strong> les navigations On peut obtenir un ensemble ordonné en naviguant vers uneextrémité d'association munie de la contrainte ordered Dans le contexte Texte• l'expression self.occurence est un S<strong>et</strong>• l'expression self.occurrence.mot est un Bag Dans le contexte FileAttente• l’expression personne est un OrderedS<strong>et</strong> On peut obtenir une séquence en naviguant vers une extrémitéd'association munie de la contrainte seq Dans le contexte Texte• l'expression self.mot est une SequencePh. Coll<strong>et</strong>51Ph. Coll<strong>et</strong>52


Opérations <strong>sur</strong> collectionOpérations <strong>sur</strong> toutes types de collection Nous présentons les principales opérations applicables àtoutes les collections• Pour une liste plus exhaustive, voir l’annexe Nous considérons des collections d'éléments de type T• Les opérations <strong>sur</strong> une collection sont mentionnées avec la flèche formée dedeux caractères -> Itérateurs• Les opérations qui prennent une expression comme paramètre peuventdéclarer optionnellement un itérateur• toute opération de la forme operation(expression) existe également sousdeux formes plus complexes. Deux opérations perm<strong>et</strong>tent de tester si la collection est vide ou non Elles servent en particulier à tester l'existence d'un lien dans uneassociation dont la multiplicité inclut 0isEmpty() : BooleannotEmpty : Boolean Exemple :• R<strong>et</strong>our <strong>sur</strong> la contrainte de cohérence de la date d’embauche• nous pouvons à présent l'écrire de manière plus précise, en vérifiant que la personne abien un agent de secrétariatcontext p : Personne inv :p.agentSecr<strong>et</strong>ariat->notEmpty() implies operation(v | expression-contenant-v)p.agentSecrétariat.contrat.dateEmbauche


Opérations <strong>sur</strong> toutes types de collectionExercice Existence d'un élément satisfaisant une expressionPh. Coll<strong>et</strong>• L'opération suivante vaut vrai si <strong>et</strong> seulement si au moins un élément de la collectionsatisfait une certaine expression passée en paramètreexists(uneExpression : Boolean) Itération• C<strong>et</strong>te opération, plus complexe que les autres, perm<strong>et</strong> de les généraliser i est un itérateur <strong>sur</strong> la collection acc est un accumulateur initialisé avec uneExpression. L'expression ExpressionAveci<strong>et</strong>acc est évaluée pour chaque i <strong>et</strong> son résultat est affecté dansacc. Le résultat de iterate est acc.iterate(i : T ; acc : Type = uneExpression | ExpressionAvec-i-<strong>et</strong>acc): Type• Exemple : masse salariale de l’entreprisecontext Entreprise :: masseSalariale():Realpost : result = employé->iterate(p : Personne ;ms : Real=0 | ms+p.contrat.salaire)57 Ecrivez, dans le contexte de la classe Collection, l'opérationsize à l'aide de l'opération iterate Ecrivez, dans le contexte de la classe Collection, l'opérationforAll à l'aide de l'opération iterate.Ph. Coll<strong>et</strong>context Collection :: size()post : result = self->iterate(elem; acc:integer=0|acc+1)context Collection :: forAll(expr)post : result = self->iterate(elem; acc : Boolean=true |acc and expr)58Opérations <strong>sur</strong> toutes types de collection Evaluation unique• L'opération suivante vaut vrai si <strong>et</strong> seulement si uneExpression s'évalue avecune valeur distincte pour chaque élément de la collectionisUnique(uneExpression : BooleanExpression) : Boolean sortedBy(uneExpression) : Sequence• L’opération r<strong>et</strong>ourne une séquence contenant les éléments de la collectiontriés par ordre croissant suivant le critère décrit par une certaine expression.• Les valeurs résultant de l'évaluation de c<strong>et</strong>te expression doivent doncsupporter l'opération sortedBy(p | p.contrat.salaire)Ph. Coll<strong>et</strong>59Ph. Coll<strong>et</strong>60


Opérations communes… mais spécifiques Sélection <strong>et</strong> rej<strong>et</strong> d'éléments• Deux opérations r<strong>et</strong>ournent une collection du même type construite parsélection des éléments vérifiant (resp. ne vérifiant pas) une certaineexpression.select(uneExpression : BooleanExpression) : Collection(T)reject(uneExpression : BooleanExpression) : Collection(T) Exemple : expression représentant dans le contexte d'uneentreprise les employés âgés de plus de 60 ans :context Entreprise …… self.employé->select(p : Personne | p.age>=60) …Opérations communes… mais spécifiques L'opération collect r<strong>et</strong>ourne une collection composée des résultatssuccessifs de l'application d'une certaine expression à chaque élémentde la collection.collect(expr:BooleanExpression): Collection(T) Exemple :• Les trois manières standards d'atteindre les mots d'un textes'écrivent ainsi dans le contexte d'un texteself.occurrence->collect(mot)self.occurrence->collect(o | o.mot)self.occurrence->collect(o : Occurrence | o.mot) c<strong>et</strong>te notation adm<strong>et</strong> un raccourci :• self.occurrence.motPh. Coll<strong>et</strong>61Ph. Coll<strong>et</strong>62Opérations communes… mais spécifiques Ajout/r<strong>et</strong>rait d'éléments• Ces deux opérations r<strong>et</strong>ournent une collection résultant de l'ajout (resp. dur<strong>et</strong>rait) d'un certain obj<strong>et</strong> à la collection.including(unObj<strong>et</strong> : T) : Collection(T)excluding(unObj<strong>et</strong> : T) : Collection(T) Union de deux collectionsunion(c : Collection) : CollectionOpérations de conversion Chaque sorte de collection (s<strong>et</strong>, orderedS<strong>et</strong>, sequence ou bag) peutêtre transformée dans n'importe quelle autre sorte. Par exemple un bag peut être transformé en :• séquence par l'opération asSequence():Sequence(T) L'ordre résultant est indéterminé• ensemble par l'opération asS<strong>et</strong>():S<strong>et</strong>(T) Les doublons sont éliminés• ensemble ordonné par l'opération asOrderedS<strong>et</strong>():OrderedS<strong>et</strong>(T) Les doublons sont éliminés ; l'ordre résultant est indéterminé Illustration : il y a plus de 2 occurrence d’un certain mot :context Texte inv:self.occurrence->collect(mot)->asS<strong>et</strong>()->size() >= 2Ph. Coll<strong>et</strong>63Ph. Coll<strong>et</strong>64


Opérations propres à S<strong>et</strong> <strong>et</strong> Bag L'intersection est une opération commune aux s<strong>et</strong>s <strong>et</strong> aux bagscontext S<strong>et</strong> :: intersection (s : S<strong>et</strong>(T)) : S<strong>et</strong>(T)post : result -> forAll(elem | self -> includes(elem) ands -> includes(elem) )post : self -> forAll(elem | s -> includes(elem) =result -> includes(elem) )post : s -> forAll(elem | self -> includes(elem) =result -> includes(elem) )Opérations liées à l’ordre (OrderedS<strong>et</strong>, Sequence) Certaines opérations sont propres à la manipulation des collections dontles éléments sont ordonnésappend(unObj<strong>et</strong>):Sequence(T) ; ajout d'un obj<strong>et</strong> à la finprepend(unObj<strong>et</strong>):Sequence(T) ; ajout d'un obj<strong>et</strong> au début partie d'une collection ordonnée délimitée par deux indicessubSequence(inf:Entier, sup:Entier):Sequence(T); spécifique desséquencessubOrderedS<strong>et</strong>(inf:Entier, sup:Entier):OrderedS<strong>et</strong>(T); spécifiquedes ordered s<strong>et</strong>s D’autres opérations du même genreat(inf:Entier):Tfirst():Tlast():TinsertAt(i:Integer, o:T):Sequence(T)indexOf(o:T):IntegerPh. Coll<strong>et</strong>65Ph. Coll<strong>et</strong>66ComplémentsExercice allInstances() Quelle est la signification de c<strong>et</strong>te expression ?• S'applique à une classe <strong>et</strong> non un obj<strong>et</strong>.• R<strong>et</strong>ourne l'ensemble de toutes les instances d'une classe <strong>et</strong> de ses soustypes.context Personne inv:Personne.allInstances()->forAll(p1, p2 | allInstances() : S<strong>et</strong>(T)p.1 p2 implies p1.nom p2.nom ) Itérateur isUnique(expr)• R<strong>et</strong>ourne vrai si chaque évaluation du corps pour les éléments de lacollection source produit un résultat différent, vrai sinon.c->isUnique(expr: OclExpression): Boolean-- true if expr evaluates to a different value-- for each element in c. Comment l’écrire avec isUnique ?context Personne inv:Personne.allInstances()->isUnique(nom)post: result = c->collect(expr)->forAll(e1, e2 | e1 e2)Ph. Coll<strong>et</strong>67Ph. Coll<strong>et</strong>68


Conformance de type5 ème partie Limites d’<strong>OCL</strong> <strong>OCL</strong> <strong>et</strong> le métamodèle UML• Contraintes <strong>sur</strong> les propriétés• Contraintes <strong>sur</strong> les classes• Contraintes <strong>sur</strong> les ... <strong>contraintes</strong>Transport Sous-typage• S<strong>et</strong>(Bicycle) conforme à S<strong>et</strong>(Transport)• S<strong>et</strong>(Bicycle) conforme à Collection(Bicycle)BicycleCar Annexes• S<strong>et</strong>(Bicycle) conforme à Collection(Transport)• S<strong>et</strong>(Bicycle) non conforme à Bag(Bicycle)Ph. Coll<strong>et</strong>69Ph. Coll<strong>et</strong>70Limites d’expressivité d’<strong>OCL</strong><strong>OCL</strong> <strong>et</strong> le métamodèle UML(déjà vu…) = Limites de la logique des prédicats Le métamodèle UML• une description du langage UML (langage d'expression des modèles). Comment les contourner ? Check List1. Manque-t-il une primitive à ma classe ?• La description du méta-modèle utilise le même formalisme que celle des modèles,autrement dit UML est décrit en UML.• Les éléments du méta-modèle sont les méta-classes décrivant les classes, lesattributs, les associations, les opérations, les composants : Class, Property,Association, Operation, <strong>et</strong>c.• Les éléments d'un modèle sont des instances de ces métaclasses. Défaut de conception Ajouter la primitive (avec « def » si on ne peut toucher à la classe)2. Manque-t-il un moyen d’exprimer une propriété importante ? Défaut de d’expressivité d’<strong>OCL</strong> Ajouter une primitive qui représente tout ou partie de la propriété recherchée Spécifier c<strong>et</strong>te primitive, même partiellement Dans la documentation qui décrit le méta-modèle UML, les<strong>contraintes</strong> sont utilisées :• pour préciser des invariants <strong>sur</strong> les méta-classes (OMG03)• <strong>et</strong> notamment pour décrire des extensions du méta-modèle à l'aide de stéréotypes. Ces règles ne décrivent pas toute la sémantique UML.• Une partie de c<strong>et</strong>te sémantique reste écrite en langue naturelle• une partie n'est pas décrite du toutPh. Coll<strong>et</strong>71Ph. Coll<strong>et</strong>72


Contraintes <strong>sur</strong> les propriétés Extrait du métamodèle UML (OMG UML Superstructure, V2.1.2)• Gestion de la multiplicitéContraintes <strong>sur</strong> les propriétés Quelques <strong>contraintes</strong> établissent des règles <strong>sur</strong> la multiplicité L'attribut dérivé lower est défini par l'opération lowerBound().context MultiplicityElement inv :lower = lowerBound() Lorsque la borne inférieure de multiplicité est définie, elle doit êtrepositive ou nulle.context MultiplicityElement inv :lowerBound() -> notEmpty() implies lowerBound() >= 0 L'opération lowerBound() se définit à partir de la propriétélowerValue. Si elle n'a pas de valeur, on utilise la valeur 1, sinon onutilise sa valeur sous forme entière.context MultiplicityElement :: lowerBound() : integer inv :result = if lowerValue->isEmpty() then 1else lowerValue.integerValue() endifPh. Coll<strong>et</strong>73Ph. Coll<strong>et</strong>74Contraintes <strong>sur</strong> les propriétésContraintes <strong>sur</strong> la relation de spécialisation La borne supérieure de multiplicité doit avoir une valeur plusgrande que la borne inférieure.context MultiplicityElement inv :lowerBound() -> notEmpty() and upperBound() -> notEmpty()implies upperBound() >= lowerBound() La fonction isMultivalued renvoie vrai si la multiplicité est bienmulti-valuée• Que signifie effectivement « multi-valué » ?Context MultiplicityElement::isMultivalued() : Booleanpre: upperBound()->notEmpty()post : result = (upperBound() > 1)Ph. Coll<strong>et</strong>75Ph. Coll<strong>et</strong>76


Contraintes <strong>sur</strong> la relation de spécialisationContraintes <strong>sur</strong>… les <strong>contraintes</strong> Comment les super-classes directes d'une classe sont obtenues ?context classifier :: parents() : S<strong>et</strong>(classifier)post : result = self.generalization.general C<strong>et</strong>te opération se généralise facilement pour obtenir toutes les superclassesd'une classe.context classifier :: allParents() : S<strong>et</strong>(classifier)post : result = self.parents()->union(self.parents()->collect(p | p.allParents()) ) Une régle fondamentale est que la relation de spécialisation/généralisationne peut induire un circuit. Un classifier ne peut donc pas apparaître commeparent de lui-même.context classifier inv :not self.allParents() -> includes(self) Une contrainte ne peut pas s'appliquer à elle-même :context Constraint inv :not constrainedElement -> include(self) Sur ce diagramme, nous voyons apparaître une limitation d'<strong>OCL</strong> dansl'expression des <strong>contraintes</strong>. La sémantique voudrait notamment que :• la spécification de valeur pour une contrainte soit de type booléen ;• l'évaluation d'une contrainte ne devrait pas avoir d'eff<strong>et</strong> de bord.• D'après la documentation, ces deux <strong>contraintes</strong> ne peuvent être exprimées en <strong>OCL</strong>.Ph. Coll<strong>et</strong>77Ph. Coll<strong>et</strong>78Annexe : Opérations de manipulation des collections Les opérations de collection utilisent l’opérateur ->• (tous les indices commencent à 1) :• = Collections identiques ou différentes• append(obj) Rend la valeur de la collection ordonnée avec obj ajouté à la fin• asS<strong>et</strong>(), asOrderedS<strong>et</strong>(), asSequence() Conversion de type entre collections• at(idx) Rend l’obj<strong>et</strong> à l’indice idx dans une collection ordonnée• count(obj) Nombre d’apparition de obj dans une collection• excludes(obj) Rend count(obj) = 0 ?• excludesAll(coll) Est-ce que tous les éléments de coll satisfont count(obj) = 0 ?• excluding(obj) Rend la valeur de la collection sans l’obj<strong>et</strong> obj• first() Rend le premier élément d’une collection ordonnéeAnnexe : Opérations de manipulation des collections• includes(obj) Rend count(obj) > 0 ?• includesAll(coll) Est-ce que tous les éléments de coll satisfont count(obj) > 0 ?• including(obj) Rend la valeur de la collection avec l’obj<strong>et</strong> obj ajouté• indexOf(obj) Rend l’indice de la 1ère occurrence de obj dans une séquence• insertAt(idx,obj) Rend la valeur de la collection avec obj ajouté à l’indice idx• intersection(coll) Intersection des collections non ordonnées self <strong>et</strong> coll• isEmpty() Rend size() = 0 ?• last() Rend le dernier élément d’une collection ordonnée• notEmpty() Rend size() > 0 ?• prepend(obj) Rend la valeur de la collection ordonnée avec obj ajouté en tête• size() Nombre d’éléments dans la collection• subOrderedS<strong>et</strong>(start,end) Sous-partie d’un ensemble ordonné entre les indices• subSequence(start,end) Sous partie d’une séquence extraite entre les indices• sum() Somme des éléments d’une collection (Integer ou Real)• union(coll) Union des collections self <strong>et</strong> cPh. Coll<strong>et</strong>79Ph. Coll<strong>et</strong>80


Annexe : opérations collectives• collect(expr) Rend un bag contenant la valeur de exp appliquée à chaque élément de lacollection maCollection.valeur est équivalent à maCollection->collect(valeur)• exists(expr) Est-ce l’expression expr est satisfaite pour l’un des éléments de la collection ?• forAll(expr) Est-ce l’expression expr est satisfaite pour tous les éléments de la collection ?• isUnique(expr) Rend vrai si expr donne une valeur différente pour chaque élément de lacollection• iterate(i : Type; a : Type | expr) Opération à partir de laquelle les autres sont définies. La variable « i » est l’itérateur <strong>et</strong> « a » estl’accumulateur, qui récupère la valeur de expr après chaque évaluation• one(expr) Rend l’expression coll->select(expr)->size()=1• reject(expr) Rend la sous-collection des éléments pour lesquelles expr n’est pas satisfaite• select(expr) Rend la sous-collection des éléments pour lesquelles expr est satisfaite• sortedBy(expr) Rend la séquence contenant tous les éléments de la collection, ordonnéspar la valeur expr (le type des éléments doit posséder un opérateur « < »)Ph. Coll<strong>et</strong>81

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!