urbanisation-si

urbanisation-si

Modélisation de système : tutoriel OCL, la gestion des évènements

 

tutoriel-ocl-omg-gestion-des-evenements.png

Ce tutoriel OCL (Object Constraint Language) est consacré à la gestion des évènements.

Pour illustrer ce concept, nous utiliserons le fameux design pattern du GoF (Gang of Four d'après la bande des 4 experts qui ont écrit en 1995 le livre contenant une vingtaine de solutions de conception objet génériques et qui ont révolutionné le monde du développement et de l'architecture logiciel).

Pour ceux qui ne ne connaissent pas leurs gammes, une description du problème, d'un exemple classique de gestion et bien entendu de la solution  se trouvent dans mon article publié sur ce blog :  http://www.urbanisation-si.com/urbanisation-du-systeme-d-information-creez-l-evenement

En OCL pour spécifier qu'un message signalant un évènement a été envoyé, on utilise l'opérateur ^

Exemple :

context Subject::hasChanged()
   post: observer^update(12, 14)

Le résultat de observer^update(12, 14) est vrai si le message update avec les arguments 12 et 14 a été envoyé à "observer" pendant l'exécution de l'opération.

Update() est soit une opération de la classe Oserver ou bien un signal spécifié dans le modèle UML.

Si les valeurs des paramètres sont inconnues au moment de l'appel, on remplace par des ?

context Subject::hasChanged()
   post: observer^update(? : Integer, ? : Integer)

OCL défini un type message spécial OclMessage qui peut être reçu par l'opérateur ^^

context Subject::hasChanged()
   post: observer^^update(12, 14)

Le résultat est une Sequence de OclMessage.

context Subject::hasChanged()
   post: let messages : Sequence(OclMessage) = observer^^update(? : Integer, ? : Integer) in
      messages->notEmpty() and
      messages->exists( m | m.i > 0 and m.j >= m.i )

Un OclMessage peut être envoyé à plusieurs cibles. Messages est une Sequence d'OclMessage dont chaque occurrence est envoyée à un observer cible :

context Subject::hasChanged()
  post: let messages : Sequence(OclMessage) =
    observers->collect(o | o^^update(? : Integer, ? : Integer) ) in
      messages->forAll(m | m.i <= m.j )

Autre exemple, soit une opération Company::getMoney(amount :Integer) : Boolean

context Person::giveSalary(amount : Integer)
   post: let message : OclMessage = company^getMoney(amount) in
      message.hasReturned() -- getMoney a été envoyée et retournée
and
      message.result() = true -- l'appel à  getMoney a retourné true

Voilà à travers ces quelques articles, nous avons appris les rudiments d'OCL.

Ce kit de survie nous servira pour nos futurs articles sur l'ingénierie dirigée par les modèles et les transformations de modèles. 

 

"Soyons reconnaissants envers les personnes qui nous donnent du bonheur ; elles sont les charmants jardiniers par qui nos âmes sont fleuries."
Marcel Proust

 

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/

http://bonnes-pratiques-si.eklablog.com/

http://urbanisation-si.eklablog.com/



22/08/2015
0 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 115 autres membres