Résultats obtenus passés au crible

Le modèle PIM

Commençons par prendre connaissance du modèle d'objets métier PIM et en particulier, des classes du domaine Contrat.

classes contrat mdaDiagramme 1 : modèle PIM du domaine 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.

classes securité mdaDiagramme 2 : modèle PIM du domaine 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.

diagramme de paquetage pim mdaDiagramme 3 : répartition des classes par domaine

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 PSM

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.

modele psm contrat mdaDiagramme 4 : classes Contrat du modèle PSM

On remarque néanmoins les transformations évidentes opérées sur les nouvelles classes Java :

  • Les attributs publics ont été changés en attributs privés et des acesseurs et modifieurs pour y accéder ont été ajoutés (méthodes «property get» et «property set»),
  • Des acesseurs et modifieurs supplémentaires ont été ajoutés aux classes source pour accéder aux objets des classes cible reliées par une association ou une agrégation. Notons en particulier :
    • L'ajout des méthodes getLigneDétail() et setLigneDetail(LigneDetail) à la classe Contrat en traduction du lien de composition avec la classe LigneDetail,
    • Ou encore l'ajout des méthodes getCommandeFacturee() et setCommandeFacturee(Commande) à la classe Facture en réponse à l'association orientée vers la classe Commande.
    Vous avez remarqué que pour ce dernier cas, le nom commandeFacturee du rôle attribué à la commande dans son association avec la facture a été repris pour nommer les méthodes d'accès à la classe Commande depuis 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 .

modele psm securite mdaDiagramme 5 : classes Securite du 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.

Le code Java généré

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 :

  1. package Contrat;
  2. import Client.Adresse;
  3. import Client.Contact;
  4.  
  5. /**
  6.  * Contrat commercial
  7.  * @author Pascal Martinez
  8.  * @version 1.0
  9.  * @created 11-mai-2013 14:14:14
  10.  */
  11. public abstract class Contrat {
  12.  
  13. /**
  14. * Numéro du contrat
  15. */
  16. private long numero;
  17. /**
  18. * Date d'émission du contrat
  19. */
  20. private date dateEmission;
  21. /**
  22. * Taux de remise globale consenti au Client
  23. */
  24. private double tauxRemiseGlobale;
  25. /**
  26. * Montant total HT du contrat
  27. */
  28. private double montantTotalHt;
  29. /**
  30. * Montant total TTC du contrat
  31. */
  32. private double montantTotalTtc;
  33. private Adresse adresseEnvoi;
  34. private Contact representant;
  35. private LigneDetail m_LigneDetail;
  36.  
  37. public Contrat(){
  38.  
  39. }
  40.  
  41. public void finalize() throws Throwable{
  42.  
  43. }
  44.  
  45. private void calculerMontantTotalHt(){
  46.  
  47. }
  48.  
  49. private void calculerMontantTotalTtc(){
  50.  
  51. }
  52.  
  53. public Adresse getAdresseEnvoi(){
  54. return adresseEnvoi;
  55. }
  56.  
  57. public date getDateEmission(){
  58. return dateEmission;
  59. }
  60.  
  61. public double getMontantTotalHt(){
  62. return montantTotalHt;
  63. }
  64.  
  65. public double getMontantTotalTtc(){
  66. return montantTotalTtc;
  67. }
  68.  
  69. public long getNumero(){
  70. return numero;
  71. }
  72.  
  73. public Contact getRepresentant(){
  74. return representant;
  75. }
  76.  
  77. public double getTauxRemiseGlobale(){
  78. return tauxRemiseGlobale;
  79. }
  80.  
  81. /**
  82. *
  83. * @param newVal newVal
  84. */
  85. public void setAdresseEnvoi(Adresse newVal){
  86. adresseEnvoi = newVal;
  87. }
  88.  
  89. /**
  90. *
  91. * @param newVal newVal
  92. */
  93. public void setDateEmission(date newVal){
  94. dateEmission = newVal;
  95. }
  96.  
  97. /**
  98. *
  99. * @param newVal newVal
  100. */
  101. public void setMontantTotalHt(double newVal){
  102. montantTotalHt = newVal;
  103. }
  104.  
  105. /**
  106. *
  107. * @param newVal newVal
  108. */
  109. public void setMontantTotalTtc(double newVal){
  110. montantTotalTtc = newVal;
  111. }
  112.  
  113. /**
  114. *
  115. * @param newVal newVal
  116. */
  117. public void setNumero(long newVal){
  118. numero = newVal;
  119. }
  120.  
  121. /**
  122. *
  123. * @param newVal newVal
  124. */
  125. public void setRepresentant(Contact newVal){
  126. representant = newVal;
  127. }
  128.  
  129. /**
  130. *
  131. * @param newVal newVal
  132. */
  133. public void setTauxRemiseGlobale(double newVal){
  134. tauxRemiseGlobale = newVal;
  135. }
  136.  
  137. }
Code : classe Java Contrat.java
  • Ligne 1, la classe Contrat est 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.
    1. package Contrat;
  • Lignes 2 et 3, l'instruction d'import des classes Contact et Adresse a été ajoutée puisqu'elles sont toutes les deux membres de la Classe Contrat et étrangères au paquetage Contrat.
    1. import Client.Adresse;
    2. import Client.Contact;
  • Lignes 5 à 10, des commentaires conformes au standard Javadoc ont été ajoutés à partir des notes et de la version renseignées pour la classe.
    1. /**
    2.  * Contrat commercial
    3.  * @author Pascal Martinez
    4.  * @version 1.0
    5.  * @created 11-mai-2013 14:14:14
    6.  */
  • Ligne 11, le mot clé abstract a été ajouté à la déclaration de la classe Contrat puisqu'il s'agit d'une classe abstraite.
    1. public abstract class Contrat {
  • Lignes 13 à 15 et lignes suivantes, les attributs sont également précédés de commentaires Javadoc, générés cette fois à partir des notes renseignées pour chacun d'eux.
    1. /**
    2. * Numéro du contrat
    3. */
    4. private long numero;
  • Ligne 35, l'attribut 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.
    1. private LigneDetail m_LigneDetail;
  • Lignes 37 et 41, ajout du constructeur par défaut Contrat() et de la méthode finalize().
    1. public Contrat(){
    2.  
    3. }
    4.  
    5. public void finalize() throws Throwable{
    6.  
    7. }

Le restant du code généré est conforme à la description faite pour la classe PSM Contrat.

Le chapitre qui suit, Les paramètres du moteur MDA, présente les paramètres qui nous permettront de corriger et ajuster la transformation et génération MDA.