OCL et UML : 2 petites questions - Divers - Programmation
Marsh Posté le 17-12-2003 à 23:56:23
Kad c'est un pro de ça normalement.
Mais le modèle me parraît hautement suspect.
Marsh Posté le 18-12-2003 à 00:26:38
nraynaud a écrit : Mais le modèle me parraît hautement suspect. |
non, il l'est pas. Pour le 1, imagine, tu peux avoir une collection d'objets sous-type de Bar (genre baz{i}), seulement la contrainte sur cette collection, c'est que deux instances ne soit pas de même types ( typeof(c->at(i))!=typeof(c->at(j)), pour tout i,j)
seulement typeof il existe pas en OCL ...
Marsh Posté le 18-12-2003 à 00:32:11
Non, il existe pas c'est vrai.
L'expression que tu présentes dans ton premier post semble être correcte pour exprimer cela sinon.
Marsh Posté le 18-12-2003 à 00:37:00
bah je m'en sers, ça va ma collection est petite. mais c'est pas très souple quand même
sinon j'aime bien comme petit langage
Marsh Posté le 18-12-2003 à 00:39:37
Taz a écrit : 2) est ce qu'il vaut mieux rajouter un lien de navigation supplémentaire ou une contrainte OCL ?
|
C'est quoi tes multiplicités sur tes associations ?
La tu exprimes avec ton invariant, que l'ensemble formé de tous les Baz en relation avec tous les Bar en relation avec l'objet courant n'a qu'un seul élément.
Marsh Posté le 18-12-2003 à 00:46:17
Taz a écrit : bah je m'en sers, ça va ma collection est petite. mais c'est pas très souple quand même |
C'est sur que c'est pas très élégant de le définir comme ca, mais bon, je vois pas trop sinon
Et c'est clair, c'est bien pratique l'OCL si tu veux être rigoureux
Marsh Posté le 18-12-2003 à 01:01:38
Ernestor a écrit : |
oh là c'est compliqué
à un FOO on associe 1..2 BAR
à un BAR on associe 1 seul BAZ
il y a une classe d'association SPAM sur le lien BAR<->BAZ
le truc c'est que étant donné un FOO, il ne doit y avoir qu'une relation BAR<-(SPAM)->BAZ
donc en fait, pour le moment, je dis que
context Foo inv;
self.bar.spam->size() = 1
scompliqué
Marsh Posté le 18-12-2003 à 08:36:12
Taz a écrit : non, il l'est pas. |
Tiens c'est super original comme réponse.
Marsh Posté le 18-12-2003 à 11:16:29
nraynaud a écrit : Tiens c'est super original comme réponse. |
c'est toi qui fait chier. je pose une question et toi direct "c'est mal foutu" alors que j'ai absolument rien dit
Marsh Posté le 18-12-2003 à 13:07:37
Taz a écrit : oh là c'est compliqué |
J'ai peut etre raté un truc, mais je trouve qu'il y a un truc qui cloche
D'après tes multiplicités, et en naviguant dans le sens que l'on a, il ne peut y avoir par principe qu'un seul Baz et qu'un seul Spam associé à chaque Bar.
Donc écrire dans le contexte de Foo que self.bar.spam->size() = 1, ca revient à écrire self.bar -> size () = 1 donc que ta multiplicité de 1..2 entre Foo et Bar du coté de Bar est en fait 1.
Voila ce que j'en ai compris en tout cas
Marsh Posté le 18-12-2003 à 13:12:12
non. je prends le cas concret.
j'ai un Article. sur cet Article il peut y avoir 1..2 Annonces
« à un FOO on associe 1..2 BAR »
une Personne peut établir un contrat sur un Article, via une annonce. Mais il ne peut y avoir qu'un seul contrat par Article, même si plusieurs annonces existent pour cet Article
« BAR<-(SPAM)->BAZ »
tu comprends le truc ?
Marsh Posté le 18-12-2003 à 13:18:47
Je crois
Mais j'ai pas l'impression que ca corresponde à ce que tu décrivais au-dessus
Je tente de détailler ca :
|
Avec Annonce étant en plus une classe d'association de l'association entre Article et Personne.
Si je me gourre, corrige moi
Marsh Posté le 18-12-2003 à 13:22:21
oui mais non.
La Personne est associé à une Annonce, ça peut pas changer ça.
à la base, tu as un article et des annonces. un gus se pointe, il engage un contrat relatif à une annonce.
ma question initiale, c'est est-ce que en plus du
Personne <-(Contrat) -> Annonce <-> Article
je rajoute un lien Personne<->Article, tout en spécifiant que c'est le même article quelque soit la navigation.
ou alors ma contrainte comme actuellement
Marsh Posté le 18-12-2003 à 13:25:32
J'essaye de comprendre ton schéma avant de répondre à ta question
Si je complète, ca donne ca :
|
C'est bon la ?
Marsh Posté le 18-12-2003 à 13:39:19
oui, c'est ça. ma question c'est esque que rajoute le personne-article ou est ce que ma contrainte va ?
Marsh Posté le 18-12-2003 à 13:51:15
Je pense que ton diagramme pourrait déjà être amélioré. Ta classe Contrat semble être quand même plus importante que seulement pour rajouter des infos sur l'association entre Personne et Annonce.
Personnelement, je rajouterais donc une association entre Article et Contrat.
Et pour l'association entre Personne et Annonce, je mettrais pas de classes d'association. A la limite, je mettrais plutot une association entre Personne et Contrat en mettant Annonce en classe d'Association de cette association.
Marsh Posté le 18-12-2003 à 14:00:23
Le problème c'est qu'un contrat est intimement lié à une annonce. et que les annonces préexistent au contrats, et que des annonces n'entrainent pas forcément un contrat
Marsh Posté le 18-12-2003 à 14:02:33
Il est aussi lié à un Article non ?
Et ça, tu le fais pas apparaître explicitement sur ton diagramme.
Marsh Posté le 18-12-2003 à 14:11:02
ben un contrat est associé à un article oui, mais on a le lien par navigation sans problème (la navigation n'est possible que dans un sens)
Marsh Posté le 18-12-2003 à 14:16:49
Oui, tu as le lien par navigation, mais je pense que de le faire ressortir explicitement serait une bonne chose.
Le but d'une classe d'association est vraiment de préciser des infos locales à l'association. Déduire des relations entre cette classes en suivant les associations de l'une des deux classes de l'association, c'est pas ce qu'il y a de plus élégant je trouve
Mais bon, si on reste sur ton diagramme, c'est quoi exactement la contrainte que tu veux écrire ?
Marsh Posté le 18-12-2003 à 14:21:43
ben que par article, il peut y avoir qu'une seule relation Personne-(Contrat)-Annonce
Marsh Posté le 18-12-2003 à 14:28:43
Tu peux faire un truc du genre:
context Article inv:
personne.contrat -> size() = 1
Mais bon, en même temps, en rajoutant un lien Article <--> Contrat avec une cardinalité de 1 je continue à trouver ça plus propre
En plus sur ton diagramme, t'oblige qu'un contrat soit systématiquement associé entre une Personne et une Article. On peut pas avoir de lien entre Personne et Article sans contrat. C'est ça que tu veux ?
Marsh Posté le 18-12-2003 à 15:07:53
Pas de quoi
Marsh Posté le 17-12-2003 à 21:35:56
1) comment exprimer le fait que 2 objets doivent être de type différent ?
pour le moment, sachant qu'il y a une relation 1 à 1..2 de Foo à Bar, Bar étant une classe abstraite, possédant 2 classes d'implémentation Baz1 et Baz2, je veux exprimer le fait que si cette cardinalité est de 2, les deux objets ne doivent pas être de meme type
je fais
2) est ce qu'il vaut mieux rajouter un lien de navigation supplémentaire ou une contrainte OCL ?
j'ai Foo <-> Bar <-> Baz, je veux exprimer que pour un foo, il n'y a par navigation, qu'un seul baz associé.
pour le moment j'ai fait