Les paramètres qui influent sur la transformation d'un modèle PIM en modèle PSM sont situés dans la fenêtre des Options accessible depuis le menu Tools
(raccourci clavier Ctrl + F9
).
Les paramètres qui ont un impact direct dans la transformation en modèle PSM Java sont :
Source Code Engineering
Auto generate roles names when creating code: cette option est nécessaire pour que EA ajoute à la classe traitée un attribut (y compris les accesseurs et modifieurs) correspondant à la classe reliée par une association qui ne dispose pas de nom de rôle explicite.
Contratprésentée dans l'étude de cas, elle est reliée à la classe
LigneDetailpar une association de type composition ne disposant pas de nom de rôle côté
LigneDetail. EA a malgré tout généré un membre nommé
m_LigneDetail
et les accesseur et modifieur correspondant (également désignés getter et setter si j'utilise les termes anglais).Do not generate members where association direction is 'Unspecified': comme son intitulé l'indique, cette option lorsqu'elle est activée, exclut de la transformation les associations pour lesquelles la direction n'est pas spécifiée (valeur de la Direction à
unspecifieddans les propriétés de l'association).
Unspecified.
Bi-Directiondans les propriétés de l'association) pour qu'un attribut de la classe distante soit ajouté aux deux classes reliées entre-elles.
Remove prefixes when generating Get/Set properties: permet de supprimer les préfixes renseignés dans la liste pour générer les accesseurs et modifieurs dans la classe transformée. Par exemple, pour un attribut nommé
m_prenom
, l'accesseur se nomme getPrenom()
et le modifieur setPrenom()
.Capitalized Attribute Name for Properties: indique lorsque l'option est cochée que le nom de l'attribut doit commencer par une lettre majuscule pour nommer les accesseurs et mutateurs.
nomdans le modèle PIM l'accesseur
getNom()
et le mutateur setNom()
dans le modèle PSM.Java
Get prefixet
Set prefix: vous pouvez personnaliser le préfixe des méthodes d'accès aux membres des classes. Les valeurs
get
et set
proposées par défaut conviennent cela dit parfaitement.Default Collection Class: nom de la classe de collection à utiliser par défaut comme type des membres ajoutés aux classes disposant d'associations
1..*.
m_LigneDetail
généré pour la classe Contrat(voir l'exemple de la rubrique Le code Java généré) devient :
private java.util.List m_LigneDetail;
Il est possible d'aller encore plus loin dans la définition des classes de collection en cliquant sur le bouton Collection Classes
de l'écran 2.
Java - Collection Casses
La fenêtre Collection Classes for Association Roles
prévoit la saisie d'une classe de collection par défaut pour les associations d'une multiplicité > à 1, mais également une classe de collection en particulier pour les associations dont le rôle cible dispose de l'option ordered
ou encore pour les associations disposant d'un ou plusieurs qualificatifs
(voir les onglets Source Role
ou Target Role
dans les propriétés de l'association).
A noter également que EA supporte les collections Java de type Generics
. Le mot clé #TYPE#
peut être ajouté à la définition de la classe de collection pour préciser le type des objets qu'elle devra contenir. Par exemple :
java.util.Collection<#TYPE#>
java.util.List<#TYPE#>
java.util.Map<KeyType, #TYPE#>
Sachez pour finir que la définition des collections est permise pour une classe en particulier, depuis la fenêtre d'affichage de ses propriétés (menu Element | Properties...
) à l'onglet Details en cliquant sur le bouton Collection Classes...
Details
La classe pour laquelle la collection est redéfinie correspond aux objets contenus dans la collection en question.
Les paramètres qui interviennent dans la génération de code sont également situés dans la fenêtre des Options accessible depuis le menu Tools
(raccourci clavier Ctrl + F9
).
Object Lifetime
Generate constructor: lorsque cette option est cochée, un constructeur par défaut est ajouté à la classe PSM.
Generate destructor: ajoute un finaliseur (méthode
finalize()
) à la classe dans le cas d'un génération en code Java et un destructeur dans les langages objets tels que le C++. Cette option peut à mon sens être décochée compte-tenu du besoin plutôt rare de nettoyage de l'objet avant sa désallocation par le ramasse-miettesAttributes/Operations
Default name for associated attrib: indique le format des attributs ajoutés à une classe pour accéder aux objets liés dont la multiplicité est supérieure à 1. Par défaut, le format proposé est
m_$LinkClassoù
$LinkClassest le nom de classe de l'objet lié.
La conversion des types de données des attributs de classes PIM lors du processus de transformation est réalisé à partir d'une table de correspondance des types de données de la fenêtre Programming Language Datatypes, accessible à partir du menu Settings | Code Datatypes...
Dans cette table, le terme Common type
désigne le type de données générique utilisé dans le modèle de classes PIM.
Le terme Datatype
quant à lui correspond au type de données spécifique au langage de développement cible du modèle PSM.
Par exemple, si je choisis Java
dans la liste déroulante Product Name, puis sélectionne dans la liste Defined Datatypes for Programming Languages
la première ligne (Datatype
est boolean
), je constate que le type Boolean
(Common type) de la classe PIM est converti en boolean
(Datatype) dans la classe PSM.
Pour convertir un type générique qui ne figure pas dans la table de conversion, je peux l'ajouter en cliquant sur le bouton New
. Par exemple Text
pour Common type et String
pour Datatype. Un attribut de type Text
de la classe PIM devient alors String
dans la classe PSM.
L'autre solution consiste à définir le type String
dans la classe PIM. Comme il n'existe pas de Common type
à la valeur String
, le processus de transformation reporte ce même type pour l'attribut de classe PSM.
Les templates (ou modèles
en français) de transformation peuvent être assimilés à des fonctions, appelées successivement par le processus de transformation MDA, et chargées chacunes de réaliser une partie des tâches telles que la transformation des paquetages, des classes, des attributs, associations.
Le code de ces templates peut être personnalisé pour obtenir un modèle PSM adapté aux besoins du projet. Ce code est basé sur un langage de macros spécifique à EA et sur un jeu de fonctions répondant aux besoins particuliers de transformation.
L'éditeur de templates de transformation est affiché dans l'espace de travail en sélectionnant l'élément de menu Settings | Transformation Templates...
(raccourci clavier Ctrl + Alt + H
).
Regardons d'un peu plus près les templates de transformation du langage Java.
Ils sont affichés dans la liste de gauche dans leur ordre d'appel par le traitement de transformation :
File: ce premier template constitue le point d'entrée de la transformation. Il consiste à créer le paquetage racine (namespaceroot) nommé
Java Modeldans lequel le modèle PSM et à générer.
%list
permet par l'appel d'un template dédié, de générer une liste d'éléments).Namespace: crée un a un les sous-paquetages du paquetage racine à partir des informations des paquetages sources.
%TRANSFORM_CURRENT()%
. Invoquée sans paramètre, cette macro reproduit à l'identique le paquetage source du modèle PIM dans le modèle PSM (sous le paquetage Java Model).
%list
invoque le template Classpour transformer la liste des classes PIM du paquetage source.
Class: il est chargé de recréer les classes dans le modèle PSM. Pour cela, il utilise à nouveau la fonction
%TRANSFORM_CURRENT()%
en passant cette fois en paramètre l'attribut languagepour indiquer que la classe source doit être reproduite à l'identique dans le modèle cible, excepté pour cet attribut dont la valeur est redéfinie à
Javaà la ligne suivante.
%TRANSFORM_REFERENCE()%
. Chaque classe créée par transformation doit contenir un appel à cette fonction pour permettre à Enterprise Architect de la relier à une autre classe, notamment par une association.%list
.Attribute: il recrée les attributs de classe. On retrouve ici toujours les appels aux fonctions
%TRANSFORM_REFERENCE()%
et %TRANSFORM_CURRENT()%
. Cette dernière reçoit les paramètres scope,
typeet
stereotype, propriétés de l'attribut redéfinies en particulier comme suit :
enumpour leur déclaration en Java
%CONVERT_TYPE()
qui s'appuie sur la table de trans-typage présentée au paragraphe Conversion des types de données.Linked Attribute: il est appelé de manière implicite par EA après exécution du template
Attribut. Ne vous attendez pas par conséquent à trouver un appel explicite du genre
%list="Linked_Attribute"
; c'est l'instruction %list="Attribute"
qui se charge également d'invoquer le template Linked Attribute.
%COLLECTION_CLASS()
invoquée pour obtenir le nom de la classe de collection paramétrée pour le langage Java ). Si un nom de rôle a été renseigné, il est repris pour nommer l'attribut; autrement, c'est le nom par défaut défini dans les paramètres qui est appliqué, après remplacement du texte $LinkClasspar le nom de la classe distante (voir paramètre
Default name for associated attribdu paragraphe Paramètres de génération de code) à l'aide de la fonction
%REPLACE()
.Propertiesest appelé pour créer également les accesseur et modifieur (getter et setter en anglais) de l'attribut.
Attribute_AsProperties: appelle le template
Propertiesde création des accesseur et modifieur des attributs publics de la classe PIM.
Operation: prend en charge la transformation des opérations de classe et convertit le type de la donnée retournée par chacune d'entre-elles.
Parameter: recrée les paramètres des fonctions transformées par le précédent template et effectue la conversion de leur type de données.
Connector: recrée les relations entre classes en prenant soin de changer l'accès de sa source et sa cible de Public en Private.
Properties: ajoute un accesseur et modifieur à la classe transformée pour le membre dont le nom et le type sont passés en paramètre du template (appel depuis les templates
Attribute_AsPropertieset
Linked Attribute).
%REMOVE_PREFIX()
pour supprimer dans le nom du membre en paramètre un éventuel préfixe parmi ceux paramétrés (voir paramètre Remove prefixes when generating Get/Set propertiesdu paragraphe Paramètres de transformation de classes).
%CONVERT_NAME()
enfin permet de modifier la casse du nom passé en paramètre en indiquant le format source et cible, à savoir dans l'exemple camel case(première lettre en minuscule comme par exemple monAttributDeClasse) et
pascal case(première lettre en majuscule comme par exemple MaClasseDuModele).
Les templates de génération de code (ou modèles de génération de code
) sont assez similaires à ceux utilisés par les traitements de transformation.
Ils sont invoqués pour produire le code source du logiciel à partir des classes PSM.
Ils peuvent également être personnalisés en vue de générer du code sur mesure
.
Le langage utilisé pour coder les traitements de génération de code correspond à celui utilisé par les templates de transformation.
La documentation en ligne livrée avec EA décrit en détail la syntaxe de ce langage à la rubrique SDK for Enterprise Architect | Code Template Framework in SDK | Code Template Syntax
, également consultable sur le site internet de Sparx Systems.
L'éditeur de templates de génération de code est affiché en cliquant dans le menu Settings | Code Generation Templates...
(raccourci clavier Ctrl + Maj + P
).
A l'instar du processus de transformation, le template File
affiché en premier dans la liste intitulée Templates
, est le premier appelé par EA à la génération de code.
Je ne passerai pas en revue les templates du langage Java comme j'ai pu le faire au paragraphe précédent, mais je souhaite malgré tout m'arrêter quelques instants sur les templates suivants :
Class Notes,
Attribute Notes,
Linked Attribute Noteset
Operation Notes: la fonction
JAVADOC_COMMENT()
ajoute sous forme de commentaires Javadoc les notes renseignées pour les classes et les attributs de classe.Import Section: il ajoute en début de fichier du code Java généré, autant d'instructions
import
que de classes à importer parmi celles renseignées à la génération de code (voir champ Import(s) / Header(s)de la fenêtre
Generate Codeau paragraphe Génération du code Java).
Importchargé d'ajouter une instruction d'import pour chacune des classes reliées (association, généralisation, réalisation et dépendance) connectées à la classe en cours de génération de code.
Operation Body: notez pour ce template-ci, qu'il en existe plusieurs variantes (concept de
Stereotype Overridespour désigner les variantes de code d'un template, applicables à un stéréotype en particulier, voire même à la combinaison de deux stéréotypes).
property get, EA ajoute dans le corps de la méthode l'instruction
return
appliquée au membre de la classe pris en charge par l'accesseur.opTag
qui associée au nom de la Tagged Value attribute_name, permet de retrouver le nom de l'attribut de classe dont il est question dans l'accesseur. Ce nom d'attribut a été associé à l'opération lors du processus de transformation grâce à la fonctionnalité de Tagged Values disponible dans EA pour associer à tout élément UML, des propriétés supplémentaires à celles prévues en standard.
Maintenant que vous êtes familiers des concepts de transformation de classes UML et de génération de code en langage Java, je vous invite à lire le chapitre suivant Quelques limites rencontrées.