2009-11-12 6 views
0

Je travaille sur un modèle d'analyse dans UML, et je suis un peu bloqué lorsque je tente de représenter une contrainte sur un couple d'attributs dans un diagramme de classes. Dans la classe suivante:comment modéliser des attributs mutuellement exclusifs dans UML?

+-----------+ 
| SomeClass | 
+-----------+ 
| isFoo  | 
| isBar  | 
| isBaz  | 
| isQuux | 
+-----------+ 

tous les attributs indiqués sont les types booléens, et les deux derniers, isBaz et isQuux, sont mutuellement exclusifs. Comment est-ce que je l'indique? Je préfère ne pas utiliser une note ad hoc - plus d'encombrement. Tout ce que je peux trouver sur les contraintes dans UML semble les appliquer aux associations , pas aux attributs. Je pouvais briser les attributs dans une classe à associée, mais ils sont simples types booléennes, donc quelque chose comme cela semble être surpuissant:

+-----------+ 
| SomeClass | 
+-----------+ 0..1 isBaz 1 +-------------------+ 
| isFoo  |------------------| ThereCanBeOnlyOne | 
| isBar  |  |   +-------------------+ 
|   |  |{NAND}  | isBaz    | 
|   |------------------| isQuux   | 
+-----------+  isQuux +-------------------+ 

Quelle est la « bonne » façon de modéliser les attributs mutuellement exclusifs dans UML?

Répondre

1

Il n'existe que deux options, modélisez les attributs en tant qu'associations avec le type de données booléen ou utilisez une contrainte OCL.

simplifiée et corrigée (égal en OCL va avec un seul « = ») pourrait être: contexte SomeClassinv pas isBaz = isQuux

BTW, je ne suis pas sûr de la signification exacte pour vous du concept " mutuellement exclusifs ". Cela implique généralement un XOR (contrainte prédéfinie sur les associations dans la norme), mais vous utilisez ensuite une NAND. Est-il possible dans votre modèle que les deux attributs aient une valeur fausse? (Je suppose que cela n'est pas possible dans ma contrainte OCL)

+0

merci, grande précision. Oui, dans mon modèle, isBaz et isQuux sont vraiment 'Operating Operating' et 'Major Operating Expense' L'objet parent, un Contract, peut être classé comme l'un, l'autre, ou aucun (les deux faux), mais pas les deux. – Val

1

Je voudrais examiner en utilisant Object Constraint Language pour le décrire.

Je ne l'ai jamais vraiment utilisé au-delà de quelques conférences, mais je suis assez sûr que c'est ce dont vous avez besoin.

Quelque chose comme cela peut exprimer la condition que vous voulez:

{context SomeClass 
inv isBaz==True implies isQuux==False 
inv isQuux==True implies isBaz==False} 

Ce presentation peut vous donner un bon point de départ.

+0

Oui - le {NAND} dans mon deuxième diagramme est un raccourci pour une contrainte OCL; Scott Ambler utilise cela dans un exemple. J'ai scanné le preso auquel vous étiez lié. La plupart du temps, les contraintes sont appliquées aux associations, mais dans quelques endroits, elles flottent et référencent les attributs. Je suppose que je peux mettre votre expression proposée dans une annotation qui pointe vers la classe. – Val

Questions connexes