- MDA en pratique
- Résultats obtenus passés au crible
- Les paramètres du moteur MDA
- Quelques limites rencontrées
- Pour conclure...
Commençons par prendre connaissance du modèle d'objets métier PIM et en particulier, des classes du domaine Contrat
.
Contrat
La classe Contrat
est une classe abstraite (son nom est affiché en italique) dont héritent les classes Commande
et Facture
.
Un contrat est composé d'une ou plusieurs lignes de détail.
La ligne de détail reprend les caractéristiques de la classe Article
.
Les classes Commande
et Facture
disposent d'un statut spécifique parmi ceux définis dans les énumérations respectives StatutCommande
et StatutFacture
.
Une facture fait toujours référence à une commande.
Un contrat s'adresse à un contact et est envoyé à une adresse particulière.
A noter que les associations de classes sont toutes navigables de la classe source vers la classe cible. Cette navigabilité se traduit visuellement par une flèche du côté de la classe cible à laquelle la classe source souhaite accéder.
Un rôle est défini pour chacune des classes cibles d'une association. Par exemple le rôle representant
attribué à la classe Contact
pour son association avec la classe Contrat
.
Intéressons-nous à présent au domaine Securite
.
Securite
Dans le paquetage Securite
, les classes Utilisateur
et GroupeUtilisateur
sont reliées par une association de type * - *
pour laquelle la navigation est indéfinie (pas de flèche dans un sens ou dans l'autre de l'association).
Neanmoins, la classe Utilisateur
correspond à la classe source de cette association et GroupeUtilisateur
à la classe cible.
A présent que nous avons pris connaissance du diagramme de classes des domaines Contrat
et Securite
, considérons l'ensemble des domaines du modèle d'objets métier.
Le diagramme de paquetages représenté ci-dessous donne un aperçu de la répartition des classes par domaine (par paquetage en l'occurrence) du modèle PIM.
Il a également pour vocation de montrer les dépendances entre paquetages induites par les relations entre classes.
On peut en particulier constater qu'un lien de type import
relie les paquetages Contrat
et Client
, avec la pointe de la flèche orientée vert Client
.
Ce lien d'import se justifie par rapport aux associations qui existent entre la classe Contrat
du paquetage de même nom d'une part, et les classes Contact
et Adresse
du package Client
d'autre part.
Les objets de classe Contrat
ont besoin d'accéder aux objets de classes Adresse
et Contact
externes au domaine (ces deux classes sont d'une couleur différente dans le précédent diagramme de classes présenté), et pour cette raison, le paquetage Client
doit être importé dans le fichier Java de la classe Contrat
.
Le modèle Java PSM obtenu après transformation est constitué des mêmes classes et des mêmes relations entre classes que le modèle PIM original.
Contratdu modèle PSM
On remarque néanmoins les transformations évidentes opérées sur les nouvelles classes Java :
«property get»
et «property set»
),getLigneDétail()
et setLigneDetail(LigneDetail)
à la classe Contraten traduction du lien de composition avec la classe
LigneDetail,
getCommandeFacturee()
et setCommandeFacturee(Commande)
à la classe Factureen réponse à l'association orientée vers la classe
Commande.
commandeFactureedu rôle attribué à la commande dans son association avec la facture a été repris pour nommer les méthodes d'accès à la classe
Commandedepuis la classe
Facture.
Quelques imperfections subsistent néanmoins dans le résultat obtenu.
Tout d'abord, le type des attributs de classe ne semble pas avoir été transformé.
Tous les types utilisés dans le modèle PIM ont été repris à l'identique dans le modèle PSM.
Cela peut sembler normal à première vue puisque les types char
, date
, int
, long
, double
sont des types simples valides en langage Java.
Nous verrons toutefois au paragraphe Conversion des types de données, les réglages qui sont à réaliser pour obtenir un trans-typage adapté à nos attentes, par exemple pour transformer le type générique int
en Integer
ou date
en Date
...
D'autre part, la méthode getLigneDetail()
évoquée précédemment devrait retourner une collection d'objets LigneDetail
.
Or dans le modèle PSM obtenu, on constate qu'un simple objet LigneDetail
est retourné.
Quelques tours de tournevis sont également nécessaires ici pour préciser les classes de collection à utiliser dans les relations de type 1 - *
ou * - *
.
Cela sera fait au paragraphe Paramètres de transformation de classes.
Pour ce qui est des classes du paquetage Securite
, on notera qu'un accesseur et un modifieur ont été ajoutés à la classe Utilisateur
pour accéder aux instances de la classe GroupeUtilisateur
.
Securitedu modèle PSM
Bien que la direction soit Unspecified
, EA considère que la classe source de l'association doit pouvoir accéder à la classe cible, à moins que les paramètres proposés en standard ne soient modifiés, auquel cas les associations dont la direction est indéfinie sont exclues de la transformation (voir le paragraphe Paramètres de transformation de classes).
Pour finir, je ferai la même remarque que pour le modèle Contrat
à propos de la collection d'objets que devrait retourner la méthode GetGroupeUtilisateur()
ou que devrait recevoir en paramètre la méthode SetGroupeUtilisateur()
.
Cette question sera approfondie dans la suite de cet article.
EA a généré autant de fichiers source .java que de classes sélectionnées à la génération de code.
Passons en revue le fichier Contrat.java :
package Contrat; import Client.Adresse; import Client.Contact; /** * Contrat commercial * @author Pascal Martinez * @version 1.0 * @created 11-mai-2013 14:14:14 */ public abstract class Contrat { /** * Numéro du contrat */ private long numero; /** * Date d'émission du contrat */ private date dateEmission; /** * Taux de remise globale consenti au Client */ private double tauxRemiseGlobale; /** * Montant total HT du contrat */ private double montantTotalHt; /** * Montant total TTC du contrat */ private double montantTotalTtc; private Adresse adresseEnvoi; private Contact representant; private LigneDetail m_LigneDetail; public Contrat(){ } } private void calculerMontantTotalHt(){ } private void calculerMontantTotalTtc(){ } public Adresse getAdresseEnvoi(){ return adresseEnvoi; } public date getDateEmission(){ return dateEmission; } public double getMontantTotalHt(){ return montantTotalHt; } public double getMontantTotalTtc(){ return montantTotalTtc; } public long getNumero(){ return numero; } public Contact getRepresentant(){ return representant; } public double getTauxRemiseGlobale(){ return tauxRemiseGlobale; } /** * * @param newVal newVal */ public void setAdresseEnvoi(Adresse newVal){ adresseEnvoi = newVal; } /** * * @param newVal newVal */ public void setDateEmission(date newVal){ dateEmission = newVal; } /** * * @param newVal newVal */ public void setMontantTotalHt(double newVal){ montantTotalHt = newVal; } /** * * @param newVal newVal */ public void setMontantTotalTtc(double newVal){ montantTotalTtc = newVal; } /** * * @param newVal newVal */ public void setNumero(long newVal){ numero = newVal; } /** * * @param newVal newVal */ public void setRepresentant(Contact newVal){ representant = newVal; } /** * * @param newVal newVal */ public void setTauxRemiseGlobale(double newVal){ tauxRemiseGlobale = newVal; } }
Contrat.java
Contratest déclarée membre du paquetage de même nom, conformément à l'organisation en paquetages de nos classes d'objets métier dans EA. A noter que le nom du paquetage devrait commencer par une lettre minuscule pour être conforme aux recommandations de nommage des paquetages Java.
package Contrat;
Contactet
Adressea été ajoutée puisqu'elles sont toutes les deux membres de la Classe
Contratet étrangères au paquetage
Contrat.
import Client.Adresse; import Client.Contact;
/** * Contrat commercial * @author Pascal Martinez * @version 1.0 * @created 11-mai-2013 14:14:14 */
abstract
a été ajouté à la déclaration de la classe Contratpuisqu'il s'agit d'une classe abstraite.
public abstract class Contrat {
/** * Numéro du contrat */ private long numero;
m_LigneDetail
a été ajouté pour répondre au lien de composition avec la classe LigneDetail, le préfixe
m_
traduisant la multiplicité des objets contenus par la variable membre. Cette déclaration est incomplète puisque une classe de collection devrait être ajoutée pour contenir la liste des lignes de détail du contrat.
private LigneDetail m_LigneDetail;
Contrat()
et de la méthode finalize()
.
public Contrat(){ } }
Le restant du code généré est conforme à la description faite pour la classe PSM Contrat
.