Cours complet sur ATL (ATLAS Transformation Language) : les collections
Dans l'article précédent :
https://www.urbanisation-si.com/cours-complet-sur-atl-atlas-transformation-language-les-types-primitifs
nous avion abordé de manière quick and dirty les types primitifs ATL.
La suite logique est de voir les collections, qui sont en fait les 4 collections définies dans OCL :
- Set : sans doublon et non ordonnée
- OrderedSet : sans doublon et ordonnée
- Bag : avec doublon possible et non ordonnée
- Sequence : avec doublon possible et ordonnée
Opérations sur les collection
- size() renvoie le nombre d'éléments de la collection self
- includes(o : oclAny) renvoie un booléen si l'objet o fait partie de la collection self
- excludes(o : oclAny) renvoie un booléen si l'objet o ne fait pas partie de la collection self
- count(o : oclAny) renvoie le nombre de fois ou l'objet o apparaît dans la collection self
- includesAll(c : Collection) renvoie un booléen si tous les objets de la collection c sont contenus dans la collection self
- excludesAll(c : Collection) renvoie un booléen si aucun des objets de la collection c sont contenus dans la collection self
- isEmpty() renvoie un booléen si la collection self est vide
- notEmpty() renvoie un booléen si la collection self n'est pas vide
- sum() renvoie une valeur correspondant à l'addition de tous les éléments de la collection self. Les types des éléments doivent être supportés par l'opérateur +
ATL défini des opérations supplémentaires par rapport à OCL :
- asBag() renvoie un bag contenant tous les éléments de la collection self.
- asSequence() renvoie une sequence contenant tous les éléments de la collection self en introduisant un ordre pour un bag ou un set.
- asSet() renvoie un set contenant tous les éléments de la collection self en perdant l’ordre pour un sequence ou un orderedset.Les doublons d’un bag ou d’une sequence sont éliminés.
Les opérations sur les séquences
- union(c : Collection) renvoie une séquence composée de tous les éléments de self suivi de ceux de c
- flatten() renvoie une séquence contenant le fils de la collection interne contenu dans self
- append(o : oclAny) renvoie une copie de self avec les éléments de o ajoutés à la fin de la séquence
- prepend(o : oclAny) renvoie une copie de self avec les éléments de o ajoutés au début de la séquence
- insertAt(n : Integer, o : oclAny), renvoie une copie de self avec les éléments de o ajoutésau rang nde la séquence
- subSequence(lower : Integer, upper : Integer) une sous séquence de self commençant à lower jusqu’à upper (tous les 2 inclus)
- at(n : Integer) renvoie l’élément du rang n de self
- indexOf(o : oclAny) renvoie le rang de la 1ère occurrence de o dans self
- first() renvoie le rang de la 1er élément de self (oclUndefined si self est vide);
- last()renvoie le rang de la dernier élément de self (oclUndefined si self est vide);
- including(o : oclAny) renvoie une copie de self avec les éléments de o ajoutés à la fin de la séquence
- excluding(o : oclAny) renvoie une copie de self avec toutes les occurrences de l’élément o supprimées.
Les opérations sur le type Set
- union(c : Collection) renvoie un set composé des éléments de self et de c avec les doublons
- intersection(c : Collection) renvoie un set composé des éléments qui apparaissent à la fois dans self et dans c
- operator - (s : Set) renvoie un set composé des éléments de self qui ne sont pas dans s
- including(o : oclAny), renvoie une copie de self avec les éléments de o s’ils ne sont pas présent dans self
- excluding(o : oclAny), renvoie une copie de self avec les éléments de o supprimés du set
- symetricDifference(s : Set) renvoie un set composé des éléments de self ou de s mais des 2
Les opérations sur le type OrderedSet
- append(o : oclAny) renvoie une copie de self avec l’élément o ajouté à la fin s’il n’existait pas déjà dans self
- prepend(o : oclAny) renvoie une copie de self avec l’élément o ajouté au début de l’orderedset s’il n’existait pas déjà dans self
- insertAt(n : Integer, o : oclAny), renvoie une copie de self avec l’élément o ajouté au rang n de l’orderedset s’il n’existait pas déjà dans self
- subOrderedSet (lower : Integer, upper : Integer) renvoie une sous séquence de self commençant au rang lower et finissant au rang upper (les 2 inclus)
- at(n : Integer) renvoie l’élément du rang n de self
- indexOf(o : oclAny) renvoie le rang de la 1ère occurrence de o dans self
- first()renvoie le 1er élément de self (oclUndefined si self est vide)
- last()renvoie le dernier élément de self (oclUndefined si self est vide)
- union(c : Collection) renvoie un orderedset composé des elements de self suivis des elements de c avec les doublons supprimés, ils apparaissent entre c et self
- flatten()renvoie un orderedset contenant directement le fils de la collection interne à la collection contenant self
- including(o : oclAny) renvoie une copie de self avec l’élément o ajouté à la fin de l’orderedset s’il n’apparaît pas déjà dans self
- excluding(o : oclAny) renvoie une copie de self avec l’élément o supprimé
Les opérations sur le type Bag
- including(o : oclAny) renvoie une copie de self avec l’élément o ajouté à la fin de l’orderedset s’il n’apparaît pas déjà dans self
- excluding(o : oclAny) renvoie une copie de self avec l’élément o supprimé
- flatten()renvoie un orderedset contenant directement le fils de la collection interne à la collection contenant self
Itérer sur les collections
La principale difference entre une operation classique et une expression iterative sur les collections est que l’itérateur accepte une expression comme parameter.
- La collection itérée est celle dont on fait reference comme source
- Les variables d’itération déclarées dont on fait référence comme itérateurs
- L’expression passée comme parameter de l’opération dont on fait reference dans le corps de l’itérateur
source->operation_name(iterators | body)
ATL supporte les expression itératives suivantes
- exists(body) renvoie une valeur booléenne suivant qu’il existe au moins un élément de source dans le body
- forAll(body) renvoie une valeur booléenne suivant que body est évalué à vrai pour tous les éléments de source
- isUnique(body) renvoie une valeur booléenne suivant que body est évalué à une valeur différente pour chaque élément de source
- any(body) renvoie un élément de source pour laquelle body est évalué à vrai. Si body n’est jamais évalué à vrai, l’opération renvoie OclUndefined;
- one(body) renvoie une valeur booléenne s’il existe exactement un élément de source pour laquelle body est évalué à vrai
- collect(body) renvoie une collection d’éléments resultant de l’application de body à chaque élément de la collection source
- select(body) renvoie un sous ensemble de la collection source pour laquelle body est évalué à vrai
- reject(body) renvoie un sous ensemble de la collection source pour laquelle body est évalué à faux (équivalent à select(not body));
- sortedBy(body) renvoie une collection ordonnée suivant body à partir de la plus petite valeur jusqu’à la plus grande. Les éléments de la collection source doivent avoir l’opérateur < défini
OCL spécifie un itérateur encore plus générique appelé iterate() dont l’expression posséde un iterator, un accumulator et un body. L’accumulator correspond à une variable initialiée. Le body est une expression qui utilise iterator et accumulator. La valeur renvoyée par iterate() correspond à la valeur de la variable accumulator une fois que la dernière iteration s’est exécutée.
source->iterate(iterator; variable_declaration = init_exp |
body
)
Exemples
- declaration d’une sequence d’entiers : Sequence(Integer)
- une sequence d’entiers : Sequence{1, 2, 3}
- declaration d’un ensemble de sequence de String : Set(Sequence(String))
- un ensemble de sequence de String : Set{Sequence{'monday'}, Sequence{'march', 'april', 'may'}}
- test si un bag est vide : Bag{1, 2, 3}->isEmpty()
- false
- Set{1, 2, 3}->includes(1)
- true
- Set{1, 2, 3}->includesAll(Set{3, 2})
- true
- Sequence{1, 2, 3}->size()
- 3
- ATTENTION : Set{3, 3, 3}->size() est évalué à 1 car un set élimine les doublons
- OrderedSet{1, 2, 3}->first()
- 1
- Sequence{1, 2, 3}->union(Sequence{7, 3, 5})
- Sequence{1, 2, 3, 7, 3, 5}
- Set{1, 2, 3}->union(Set{7, 3, 5})
- Set{1, 2, 3, 7}
- Sequence{Sequence{1, 2}, Sequence{3, 5, 2}, Sequence{1}}->flatten()
- Sequence{1, 2, 3, 5, 2, 1}
- Sequence{Sequence{1, 2}, Sequence{3, 5, 2}, Sequence{1}}->subSequence(2, 3)
- Sequence{ Sequence{3, 5, 2}, Sequence{1}}
- Sequence{5, 15, 20}->insertAt(2, 10)
- Sequence{5, 10, 15, 20}
- Set{1, 2, 3}->intersection(Set{7, 3, 5})
- Set{3}
- Set{1, 2, 3}->symetricDifference(Set{7, 3, 5})
- Set{1, 2, 7, 5}
- Sequence{1, 2, 3, 4, 5, 6}->select(i | i <= 3)
- Set{1, 2, 3}
- Récupérer tous les noms des classes du MOF : MOF!Class.allInstances()->collect(e | e.name)
- Vérifier que tous les éléments d’une séquence sont plus grand que 2 : Sequence{12, 13, 12}->forAll(i | i > 2)
- true
- Vérifier s’il y a un unique élément d’une séquence plus grand que 2 : Sequence{12, 13, 12}->one(i | i > 2)
- false
- Vérifier s’il existe un nombre dans la séquence plus grand que 2 : Sequence{12, 13, 12}->exists(i | i > 2)
- evaluates to true
- Sequence{8, -1, 2, 2, -3}->iterate(e; res : Integer = 0 |
if e > 0
then res + e
else res
endif
)- 12;
- équivalent à Sequence{8, -1, 2, 2, -3}->select(e | e > 0)->sum()
"Si mon esprit peut le concevoir, et mon cœur peut le croire, alors je peux le réaliser."
Muhammad Ali
Voir aussi :
http://urbanisation-si.wix.com/blog
http://urbanisme-si.wix.com/blog
http://urbanisation-si.wix.com/urbanisation-si
http://urbanisation-si.over-blog.com/
http://rhonamaxwel.over-blog.com/
http://urbanisation-des-si.blogspot.fr/
A découvrir aussi
- Ingénierie Dirigée par les Modèles (IDM) : le tour de passe-passe des transformations de modèles
- Ingénierie Dirigée par les Modèles (IDM) : cours complet sur ATL (ATLAS Transformation Language) : les types ATL
- Cours complet sur ATL (ATLAS Transformation Language) : les types primitifs
Inscrivez-vous au site
Soyez prévenu par email des prochaines mises à jour
Rejoignez les 769 autres membres