rapport: ajout ocl

This commit is contained in:
Laureηt 2021-10-16 14:14:08 +02:00
parent a640fd8331
commit 5d052564ff
No known key found for this signature in database
GPG key ID: D88C6B294FD40994
4 changed files with 87 additions and 54 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

View file

@ -104,12 +104,12 @@ Les relations Ressource-Request et Request-WorkDefinition sont déclarées en EO
Le modèle SimplePDL est maintenant complet pour représenter des processus de développement.
Un exemple complet dutilisation de ce modèle serait :
% \begin{figure}[H]
% \centering
% \includegraphics[width=15cm]{simplePDL_complet.png}
% \caption{Métamodèle simplePDL complet}
% \label{simplePDL_complet}
% \end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{simplePDL_complet.png}
\caption{Métamodèle simplePDL complet}
\label{simplePDL_complet}
\end{figure}
\subsection{petriNet.ecore}
@ -120,12 +120,12 @@ Ils sont donc nommés et reliés entre eux par des arcs.
Ses arcs ont un attribut entier nommé weight pour indiquer le poids de larc ainsi quun boolean outgoing pour indiquer si ce dernier est dirigé dune Place vers une Transition ou dune Transition vers une Place.
(Si outgoing est vrai, alors larc va de la transition vers la place.)
% \begin{figure}[H]
% \centering
% \includegraphics[width=15cm]{petriNet_complet.png}
% \caption{Métamodèle petriNet complet}
% \label{petriNet_complet}
% \end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=15cm]{petriNet_complet.png}
\caption{Métamodèle petriNet complet}
\label{petriNet_complet}
\end{figure}
\section{Sémantique statique (avec OCL)}
@ -134,16 +134,49 @@ Elles assurent certains points de cohérence et permettent d'éviter les ambigu
\subsection{simplePDL.ocl}
Pour les modèles SimplePDL, nous obligeons lutilisateur à entrer des noms valides pour le Process, les WorkDefinition et les Resource.
Les noms doivent aussi être unique pour les WorkDefinition et les Ressource pour améliorer la clarté du modèle.
Nous avons aussi contraint lutilisateur à utiliser les WorkSequence sur des WorkDefinition appartenant au même Process.
Pour éviter des non-sens, les WorkSequence ne peuvent pas non plus avoir le même successeur et prédécesseur.
Nous avons aussi ajouté des contraintes sur les quantités des Resource et Request.
En effet, cela na pas de sens dsavoir des Resource ou des Request avec des quantités négatives.
De plus, une Request ne peut pas être plus grande que le nombre initial de ressources.
(Le nombre initial de ressources est le maximum puisquil ny a pas de création.)
Pour les modèles SimplePDL, nous contraignons les noms des Process au format camelCase. De même les noms des WorkDefinitions et des Resources doivent posséder au minimum 2 caractères et ne pas être exclusivement constitués de chiffres ou d'underscores.
\begin{textcode}
context Process
inv validName('Invalid name: ' + self.name):
self.name.matches('[A-Za-z_][A-Za-z0-9_]*')
context WorkDefinition, Resource
inv nameMin2Char: self.name.matches('..+')
inv weirdName: not self.name.matches('([0-9]*|_*)')
\end{textcode}
Pour ne pas avoir d'ambiguité dans le modèle, les noms des WorkDefinitions et des Ressources doivent être uniques:
\begin{textcode}
inv uniqNamesWD: self.processElements
->select(pe | pe.oclIsKindOf(WorkDefinition))
->collect(pe | pe.oclAsType(WorkDefinition))
->forAll(w1, w2 | w1 = w2 or w1.name <> w2.name)
inv uniqNamesRes: self.processElements
->select(pe | pe.oclIsKindOf(Resource))
->collect(pe | pe.oclAsType(Resource))
->forAll(r1, r2 | r1 = r2 or r1.name <> r2.name)
\end{textcode}
Nous avons aussi contraint lutilisateur à utiliser les WorkSequence sur des WorkDefinition appartenant au même Process. Pour éviter des non-sens, les WorkSequence ne peuvent pas non plus avoir le même successeur et prédécesseur.
\begin{textcode}
context WorkSequence
inv successorAndPredecessorInSameProcess('Activities not in the same process : '
+ self.predecessor.name + ' in ' + self.predecessor.process().name+ ' and '
+ self.successor.name + ' in ' + self.successor.process().name):
self.process() = self.successor.process()
and self.process() = self.predecessor.process()
inv notReflexive: self.predecessor <> self.successor
\end{textcode}
Nous avons aussi ajouté des contraintes sur les quantités des Resource et Request.
En effet, cela na pas de sens dsavoir des Resource ou des Request avec des quantités négatives. De plus, une Request ne peut pas être plus grande que le nombre initial de ressources. (Le nombre initial de ressources est le maximum puisquil ny a pas de création.)
\begin{textcode}
context Resource, Request
inv negativeQuantity: self.quantity > 0
context Request
inv greedy: self.quantity <= self.target.quantity
\subsection{petriNet.ocl}
\end{textcode}
Les modèles PetriNet étant relativement similaireq aux modèles SimplePDL, nous avons établi des contraintes OCL similaires.
Nous obligeons le Network et les Node à avoir des noms uniques mais également sensés.