urbanisation-si

urbanisation-si

Modélisation de système


Les meilleurs outils de modélisation UML, SysML, BPMN, DMN de l'année 2016 et les gagnants sont ...

C'est la période vous n'y couperez pas, tout le monde y va de son classement du meilleur de l’année qu’il s'agisse de l'homme (ou de la femme) de l'année, du livre, du film, de la chanson, du personnage politique, …

 meilleur-outil-de-modelisation-2016-2017.png

 

Urbanisation-si n'échappera pas à la règle et nous vous proposons donc nos « best of the year » à notre manière bien sur.

 

En compétition pour le prix du meilleur outil de modélisation généraliste, UML, SysML, BPMN, MDA, ... de l’année 2016, les nommés sont :

 

  1. Modelio (gratuit) ( https://www.modelio.org/ )

  2. Papyrus (gratuit) ( https://eclipse.org/papyrus/ )

  3. Sirius (gratuit) ( permet de créer son propre formalisme de modélisation ) ( http://www.eclipse.org/sirius/ )

  4. Enterprise Architect ( http://www.sparxsystems.com/ )

  5. IBM Rational Rhapsody family (gratuit) ( http://www-03.ibm.com/software/products/en/ratirhapfami )

  6. IBM Rational Modeler (gratuit) ( http://www.ibm.com/developerworks/downloads/r/modeler/ )

  7. Open ModelSphere (gratuit) ( http://www.modelsphere.com/org/fr/open_modelsphere.html )

  8. MEGA ( http://www.mega.com/fr/produit/hopex-uml )

  9. Magic Draw ( https://www.nomagic.com/products/magicdraw.html )

 

Et le gagnant est ………. Enterprise Architect de Sparx Systems.

Il s'agit de l'AGL commercial le plus complet, présentant le meilleur rapport qualité + fonctionnalités / prix. Différentes versions, correspondent à différents profils utilisateurs, cela va de l'expert métier au développeur en passant par l'architecte fonctionnel ou technique. Tous les langages sont présents : UML, SysML, BPMN, ... A mon avis c'est très certainement l'outil le plus convivial et le plus robuste et puissant du marché.
Voir l'article : AGL (Atelier de Génie Logiciel) : les ministères recommandent Enterprise Architect de Sparx System

 

 

En compétition pour le prix du meilleur outil de modélisation dans la catégorie processus métier BPMN (Business Process Modeling Notation) de l’année 2016, les nommés sont :

 

  1. Modelio gratuit) ( https://www.modelio.org/ )

  2. Sirius (gratuit) ( permet de créer son propre formalisme de modélisation ) ( http://www.eclipse.org/sirius/ )

  3. Enterprise Architect ( http://www.sparxsystems.com/ )

  4. TBM Blueworkslive ( https://www.blueworkslive.com/home )

  5. IBM Business Process Manager ( http://www-03.ibm.com/software/products/fr/business-process-manager-family )

  6. MEGA - HOPEX Business Process Analysis ( http://www.mega.com/fr/produit/hopex-business-process-analysis )

  7. Bizagi ( https://www.bizagi.com/ )

  8. Eclipse BPMN2 Modeler (gratuit) ( http://www.eclipse.org/bpmn2-modeler/ )

  9. Bonitasoft (gratuit) ( http://fr.bonitasoft.com/ )

  10. jBPM (gratuit) ( https://www.jbpm.org/ )

  11. Activiti (gratuit) ( http://activiti.org/ )
     
  12. Camunda (gratuit) ( https://camunda.org/ )
     
Et le gagnant est ………. Bonitasoft

Grâce à ces trois composants majeurs : Bonita Studio permettant à l'utilisateur de modifier graphiquement les processus métier suivant la norme BPMN. L'utilisateur peut également connecter les processus à d'autres éléments du système d'information (telles que la messagerie, la planification des ressources d'entreprise, la gestion de contenu d'entreprise et bases de données) afin de générer une application commerciale autonome accessible comme un formulaire Web. Bonita Studio permet également à l'utilisateur de concevoir graphiquement les formulaires qui seront présentées à l'utilisateur final afin d'interagir avec le processus. Il s'agit d'un plugin Eclipse ; Bonita BPM Engine qui est une application Java qui exécute les processus métier créés avec Bonita Studio et enfin Bonita Portal permettant à chaque utilisateur final de gérer toutes les tâches dans lesquelles il est impliqué. Le portail permet également le propriétaire d'un processus d'administrer et d'obtenir des rapports sur les processus.

 

 

En compétition pour le prix du meilleur outil de modélisation dans la catégorie règles métiers DMN (Decision Modeling Notation) de l’année 2016, les nommés sont :

 

  1. FICO DMN Modeler ( http://www.ficoanalyticcloud.com/decision-management-suite/dmn-modeler/ )

  2. Decision First Modeler ( http://decisionsfirst.com/ )

  3. OpenRules (gratuit) ( http://openrules.com/ )

  4. Signavio Decision Manager ( http://www.signavio.com/fr/products/decision-manager/ )

  5. Camunda (gratuit) ( https://camunda.org/ )

 

Et le gagnant est ………. OpenRules

Permet à tous les acteurs, des experts métiers aux développeurs de créer, tester, exécuter et maintenir des règles métiers (tables de décisions, …). Supporte le norme de l'OMG DMN (le langage FEEL, les tables de décisions, …) et un gros effort a été apporté à la documentation et aux exemples.

 

 

En compétition pour le prix du meilleur outil de transformation de modèles de l’année 2016, les nommés sont :

 

  1. Enterprise Architect ( http://www.sparxsystems.com/ )

  2. Eclipse QVTo (Query View Transform Operational) (gratuit) ( http://www.eclipse.org/mmt/?project=qvto )

  3. Eclipse QVTd (Query View Transform Declarative) (gratuit, en cours de finalisation)) ( https://projects.eclipse.org/projects/modeling.mmt.qvtd )

  4. Eclipse ATL (Atlas Transformation Language) (gratuit) ( https://www.eclipse.org/atl/ )

 

  

Et le gagnant est ATL.

Le plus ancien et le plus stable des outils de transformation de modèles.
Voir l'article : Ingénierie Dirigée par les Modèles (IDM) : tutoriel ATL (ATLAS Transformation Language), le "Da Vinci code" de la transformation AT

 

Rhona Maxwel

@rhona_maxwel

 

« C'est là, dans le va-et-vient des jours et le fouillis des non-dits, que la vie perd le sens des choses profondes et se réfugie dans le superficiel et le faux-semblant. »

Boualem Sansal

 

 

Articles conseillés :

 

Vous cherchez désespérement un formalisme pour vos processus métiers mettant en accord MOA et MOE, la solution miracle existe, elle s'appelle BPMN

 

SysML pour les nuls : de la modélisation des exigences à la réalisation du système

 

Urbanisation SI : la méthode ultime pour modéliser les besoins d'un projet - 2ème partie - Processus métiers - Profil UML Eriksson Penker

 

Urbanisation SI : la méthode ultime pour modéliser les besoins d'un projet - 3ème partie - Processus métiers - BPMN

 

Urbanisation SI : la méthode ultime pour modéliser les besoins d'un projet - 5ème partie - Règles métier- UML - Profil spécifique

 

Urbanisation SI : la méthode ultime pour modéliser les besoins d'un projet - 6ème partie - Rule Flow – UML – Diag. Activité

 

Urbanisation SI : la méthode ultime pour modéliser les besoins d'un projet - 7ème partie - Domaine métier – UML – Diag. Classe


11/12/2016
1 Poster un commentaire

Modélisation de système : comment utiliser OCL avec Eclipse, c'est bien la question que tout le monde se pose

 

ingenierie-dirigee-par-les-modeles-IDM-tutoriel-eclipse-ecore.png

Lors des articles précédents nous avons vu "le kit de survie" d'OCL c'est à dire les bases fondamentales du langage de règles de l'OMG.

Mais cela reste très théorique et on aimerait bien mettre tout ça en pratique et bien regardons quelques fonctionnalités que propose Eclipse EMF (Eclipse Modeling Framework).

Concevez le métamodèle Family (voir l'article "Ingénierie Dirigée par les Modèles (IDM) : tutoriel Eclipse Ecore, le corps à corps avec les méta modèles"  http://www.urbanisation-si.com/ingenierie-dirigee-par-les-modeles-idm-tutoriel-eclipse-ecore-le-corps-a-corps-avec-les-meta-modeles).

Créez un objet de type Family :

  • Double cliquez sur sur le fichier Families.ecore
  • Dans l'arborescence, clic droit sur Family - Create Dynamic Instance ...
  • Le fichier Family.xmi est créé.
  • Remarque : attention a bien renseigné les propriétés Name, Ns Prefix et Ns URI du EPackage Families de Families.ecore sinon vous un message d'erreur dans le fichier XMI stipulant que l'URL est nulle !
  • Double cliquez sur Family.xmi, le fichier s'ouvre en mode texte.
  • Clic droit sur le fichier - Open With -  Sample Reflective Ecore Model Editor
  • En dessous de Platform - cliquez sur Family - Properties Last Name=Dupond
  • Clic droit sur Family - New Child - Daughters Member - une instance de Member est créée, sélectionnez et renseignez First Name=Elsa
  • Créez une 2ème fille Emma.

Pour tester des expressions OCL, utilisons la console OCL :

  • Sélectionnez Family - clic droit - OCL - Show OCL Console. C'est la où les Athéniens atteignirent.
  • Un objet sélectionné dans l'éditeur graphique Family.xmi représente l'objet courant donc self. 
    Sélectionnez Family Dupond

La console est divisée en 2 partie : la partie supérieure est réservée aux résultats et la partie inférieurs aux expressions OCL

Exemple :

  • Saisissez daughters et faites Entrée, la partie résultats affichent Elsa et Emma
  • La touche Page précédente rappelle les dernières expressions saisies.
  • Saisissez daughters->s la completion automatique s'affiche, double cliquez sur size() et Entrée
  • Results=2
  • La completion s'obtient avec CTRL espace
  • Saisissez : daughters->size()<2
  • Results=false

Une fois les expressions OCL testées dans le console, nous pouvons les ajouter en Java :

  • Clic droit sur Families.ecore - Open With - OCLinEcore Editor - l'éditeur Ecore Java s'ouvre avec les classeEcore : Family et Member :
  • Ajouter dans la classe Family la contrainnte :
invariant maxFilles:
   Family.daughters->size()<2;

 

tutoriel-ocl-eclipse-1.png

 

Cliquez dans l'éditeur graphique Family.ecore

 

tutoriel-ocl-eclipse-2.png

 

On constate que la contrainte a été ajoutée. On pourrait la créer et la modifier directement dans l'éditeur :

  • Sélectionnez Families.ecore - Family - New Child - EAnnotation - Properties - Key=maxFilles - Value=Family.daughters->size()<2

N'oubliez pas Save All régulièrement.

Pour finir, vérifions la validation :

  • Family.xmi -  clic droit sur Family Dupond - Validate - une popup "Validation Problems" s'affiche avec le message concernant la contriante maxfilles qui n'est pas respectée.

Voilà fin de cette petite mise en jambe pour la mise en pratique d'OCL, nous aurons l'occasion de pratiquer OCL plus intensivement dans nos prochains articles consacrés à la transformation de modèles et à ATL (ATLAS Transformation Language).

 
"Chacun rêve de changer l'humanité, mais personne ne pense à se changer lui-même."
Léon Tolstoï

 

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/


23/08/2015
0 Poster un commentaire

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

Modélisation de système : OCL vous en redemandez ?

modelisation-systeme-tutoriel-OCL-UML-2.png

Pour spécifier une classe d'association (Job ou Marriage dans le diagramme de classe UML) :

context Person inv:
   self.Job[employer]

On peut naviguer à partir de la classe d'association vers les objets participants :

context Job
   inv: self.employer.numberOfEmployees >= 1
   inv: self.employee.age > 21

Naviguez à travers des associations qualifiées : pour obtenir la personne possédant le compte bancaire 123456789

context Bank inv:
   self.customer[123456789]

Pour spécifier un chemin complet avec des package :

Packagename1::Packagename2::Typename

Accédez aux propriétés d'un supertype :

context B inv:
   self.oclAsType(A).p1 -- accède à la propriété p1 définie dans le supertype A (B hérite de A)
   self.p1 -- accède à la propriété p1 définie dans B (B est l'objet courant)

Propriétés prédéfinies pour tous les objets :

oclIsTypeOf (t : Classifier) : Boolean
oclIsKindOf (t : Classifier) : Boolean
oclIsInState (s : OclState) : Boolean
oclIsNew () : Boolean
oclAsType (t : Classifier) : instance de Classifier
context Person
   inv: self.oclIsTypeOf( Person ) -- = true
   inv: self.oclIsTypeOf( Company) -- = false

Membres statiques d'une classe :

context Employee::id : String init:
   Employee::uniqueID()

Si nous voulons que toutes les instances de Personne aient un nom unique :

context Person inv:
   Person.allInstances()->forAll(p1, p2 | p1 <> p2 implies p1.name <> p2.name)

La gestion des collections : Set = pas de doublons ; Bag = doublons possible ; Sequence = Bag ordonné ; OrderedSet = Set ordonné

Ces collections sont définies dans "OCL Standard Library".

Exemples :

Set { 1 , 88, 5, 2 }
Set { 'strawberry', 'apple', 'orange' }
Sequence { 45, 3, 3, 2, 1 }
Sequence { 'ape', 'nut' }
Bag {1, 3, 4, 3, 5 }

Selectionner les personnes qui ont plus de 50 ans (les 2 expressions suivantes sont équivalentes) :

context Company inv:
   self.employee->select(age > 50)->notEmpty()

context Company inv:
   self.employee->select(p | p.age > 50)->notEmpty()

Pour obtenir tous les éléments pour lesquels la condition est fausse (l'inverse du select), exemple, pour avoir les célibataires :

context Company inv:
   self.employee->reject( isMarried )->isEmpty()

Pour obtenir des collections différentes (les 3 expressions suivantes sont équivalentes) :

self.employee->collect( birthDate )
self.employee->collect( person | person.birthDate )
self.employee->collect( person : Person | person.birthDate )

Pour savoir (le résultat sera vrai) si une condition s'applique (est vraie) sur toutes les occurrences :

context Company
   inv: self.employee->forAll( age <= 65 )
   inv: self.employee->forAll( p | p.age <= 65 )
   inv: self.employee->forAll( p : Person | p.age <= 65 )

Pour savoir si une condition s'applique sur au moins une occurrence :

context Company inv:
   self.employee->exists( forename = 'Jack' )
context Company inv:
   self.employee->exists( p | p.forename = 'Jack' )
context Company inv:
   self.employee->exists( p : Person | p.forename = 'Jack' )

Itération (les 2 expressions suivantes sont équivalentes) :

collection->collect(x : T | x.property)
-- est identique à :
collection->iterate(x : T; acc : T2 = Bag{} |
acc->including(x.property))

Nous verrons dans un prochain article la gestion des messages.

 

"Assume ton destin. Derrière les soucis, le chagrin et la peur, tu découvriras alors l'extraordinaire bonheur qu'est la confiance en soi."
Richard Dehmel

 

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/


21/08/2015
0 Poster un commentaire

Modélisation de système : OCL ça se complique !

modelisation-systeme-OCL-UML-OMG-03.png

Dans l'article précédent, nous avons vu une introduction et quelques bases d'OCL (Object Constraint Language).

Le moment est arrivé, pour aller un peu plus loin dans des éléments de syntaxe plus complexes toujours avec notre diagramme de classe (voir http://www.urbanisation-si.com/modelisation-de-systeme-uml-n-est-rien-sans-ocl ).

 

Exemple d'énumération :

context Person inv: gender = Gender::male

Réutiliser une variable :

context Person inv:
   let income : Integer = self.job.salary->sum() in 
if isUnemployed then
   income < 100
else
   income >= 100
endif

Pour réutiliser des variables/opérations à partir de plusieurs expressions OCL :

context Person
def: income : Integer = self.job.salary->sum()
def: nickname : String = ‘Little Red Rooster’
def: hasTitle(t : String) : Boolean = self.job->exists(title = t)

 

Pour les opérations/attributs statiques :

context MyClass
static def : globalId() : Integer = ...

Quand on est certain qu'un type courant d'un objet est un sous-type alors on peut le transtyper (caster) :

object.oclAsType(Type2) --- change le type statique de l'expression en Type2

Les opérateurs de naviagation sont . pour les attributs/opérations et -> pour les collections, opération ou itération :

anObject.name aString.indexOf(':')
aBag->elementType aSet->union(anotherSet) aSet->collect(name)

Les mots clés :

and body context def derive else endif endpackage false if implies in init inv invalid let not null or package 
post pre self static then true xor

Les mots restreints :

Bag Boolean Collection Integer OclAny OclInvalid OclMessage OclVoid OrderedSet Real Sequence Set 
String Tuple UnlimitedNatural

Commentaire : tout ce qui suit 2 signes moins -- et se trouve avant la fin de la ligne est un commentaire.

Les attributs :

context Person inv:
self.age > 0

Les opérations

L'appel :

aPerson.income(aDate)
aPerson.income(aDate).bonus = 300 and
aPerson.income(aDate).result = 5000

La définition :

context Person::income (d: Date) : Integer
post: result = age * 1000

Les associations :

context Company
   inv: self.manager.isUnemployed = false
   inv: self.employee->notEmpty()

context Person inv:
self.employer->size() < 3

context Person inv:
   self.wife->notEmpty() implies self.wife.gender = Gender::female

context Person inv:
   (self.wife->notEmpty() implies self.wife.age >= 18) and
   (self.husband->notEmpty() implies self.husband.age >= 18)

context Company inv:
self.employee->size() <= 50


On ne peut pas tout dévoiler tout de suite, le reste fera l'objet d'un prochain article.
 

"Les seuls beaux yeux sont ceux qui vous regardent avec tendresse."
Coco Chanel

 

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/


21/08/2015
0 Poster un commentaire


Recherche

Vous recherchez ? :