Génération de Design Patterns

De ImInfoWiki.

Sommaire

Introduction

Cette technologie s'appuyant sur la démarche MDA permet de générer automatiquement le code associé à des Design Patterns à partir d'un modèle UML stéréotypé. L'opération s'effectue en 2 transformations : M2M et M2T.

image non restituée

Pré-requis

  • Installer Enterprise Architect version 7.5 (Build: 845) ou supérieur
  • Importer le profil ImInfoProfilePattern
  • Installer Microsoft .net

Utilisation de la technologie

La réalisation d'une transformation complète s'effectue en plusieurs étapes qui sont détaillées dans la section suivante. Voici la liste de ces étapes :

  • Lancer le modeleur Enterprise Architect
  • Créer un nouveau projet Enterprise Architect
  • Créer un nouveau diagramme
  • Choisir la Toolbox "DesignPatternsToolbox"
  • Ajouter une classe stéréotypée appartenant à l'une des 3 sections suivantes :
    • Behavioral Pattern
    • Creational Pattern
    • Structural Pattern
  • Renseigner les Tagged Values correspondant à la classe stéréotypée ajoutée
  • Lancer la transformation
  • Lancer la génération de code


Présentation d'une chaîne complète de transformation

Cette présentation est réalisée avec le pattern Visitor

Transformation M2M

Étape 1 : Afficher la classe correspondant au Design Pattern Visitor.

image non restituée

Réalisation : On sélectionne dans la « ToolBox » l'élément que l'on souhaite ajouter à notre diagramme. On dépose cet élément sur le diagramme. La classe stéréotypée du nom du Design Pattern s'affiche avec toutes les Tagged Values qui lui ont été associée.

Étape 2 : Remplir les Tagged Values

image non restituée

Réalisation : On remplie les Tagged Values en tenant compte des indications données. Cette étape n'est pas obligatoire, mais elle nous permet de définir un cas d'utilisation plus spécifique. Si nous n'entrons aucune valeur dans les Tagged Values, le Design Pattern créé par la suite sera le moins détaillé possible.

Étape 3 : Lancer la transformation

image non restituée

Réalisation : Pour lancer la transformation, on effectue un clique droit sur la classe à transformer, puis on sélectionne transform ».

On sélectionne ensuite le type de transformation que l'on veut effectuer. Dans notre cas, une transformation Design Patterns M2M a été crée.

Une nouvelle boîte de dialogue nous demande dans quel package nous souhaitons que le diagramme UML généré soit rangé.

Une fois le package choisi, on n'a plus qu'à cliquer sur le bouton « Do Transform ».

Transformation M2T

Le but de cette transformation est d'obtenir, à partir d'un diagramme UML représentant un Design Pattern de générer un maximum de code.

La transformation M2T est beaucoup plus simple que la transformation M2M, il suffit seulement de lancer la transformation à partir du diagramme UML obtenu lors de la transformation M2M.

On a ci-dessous le diagramme UML correspondant au Design Pattern State Visitor obtenu lors de la transformation « model to model ».

image non restituée

On lance ensuite la transformation directement à partir du « projet browser » en sélectionnant directement le package qu'on souhaite transformer d'un clic droit :

image non restituée

Une nouvelle fenêtre s'affiche alors :

image non restituée

Cette fenêtre nous montre les classes dont le code sera généré.

Une fois la transformation effectuée, on obtient le maximum de code source Java. Comme exemple, vous trouverez ci-dessous le code généré pour la classe ConcreteElement1 :

image non restituée


Informations sur les Tagged Values à renseigner

Pour chaque Design Pattern, il y a un certain nombre de Tagged Values à renseigner. Cette section détaille Pattern par Pattern les Tagged Values à renseigner.

Patterns de Comportement

Chain of Responsability

Tagged Value Description
Client Nom du client
Concret_count Designe le nombre de Gestionnaires Concrets
Concrete_enum Liste des noms des Gestionnaire concrets
Name Nom du gestionnaire abstrait


Command

Tagged Value Description
AbstractCommand
Action_count Crée une méthode du même nom dans l'interface Command, qui sera appelée par une méthode de la classe stéréotypée "command", et appellera une ou plusieurs méthodes sur un objet. Les champs associés à des noms de classe ou de méthode doivent être rigoureusement identiques. (Min : 0, Max : infini)
Action_enum Crée une méthode du même nom dans l'interface Command, qui sera appelée par une méthode de la classe stéréotypée "command", et appellera une ou plusieurs méthodes sur un objet. Les champs associés à des noms de classe ou de méthode doivent être rigoureusement identiques. (Min : 0, Max : infini)
Concrete_count Désigne une commande concrète, c'est à dire une astreinte entre un objet récepteur et une action. Cette classe concrétise les "Command_Action" par l'invocation des opérations adéaquates du récepteur. La valeur associée sera découpée par des "_" en deux champs. 1-Nom de la méthode 2-Nom du receveur (TaggedValue "Command_Receiver") sur lequel on souhaite appliquer la méthode
Concrete_enum Désigne une commande concrète, c'est à dire une astreinte entre un objet récepteur et une action. Cette classe concrétise les "Command_Action" par l'invocation des opérations adéaquates du récepteur. La valeur associée sera découpée par des "_" en deux champs. 1-Nom de la méthode 2-Nom du receveur (TaggedValue "Command_Receiver") sur lequel on souhaite appliquer la méthode
Receiver_Method_count Crée une méthode du même nom dans l'interface Command, qui sera appelée par une méthode de la classe stéréotypée "command", et appellera une ou plusieurs méthodes sur un objet
Receiver_Method_enum Crée une méthode du même nom dans l'interface Command, qui sera appelée par une méthode de la classe stéréotypée "command", et appellera une ou plusieurs méthodes sur un objet


Interpreter

Tagged Value Description
AbstractExpression Nom de la classe "AbstractExpression"
Client_Name Nom du client
Contexte_Name Nom du contexte
NonTerminalExpression_count Nombre de classe "NonTerminalExpression"
NonTerminalExpression_enum Liste des noms des classes "NonTerminalExpression"
TerminalExpression_enum Liste des noms des classes "TerminalExpression"
TerminalExpression_count Nombre de classes "TerminalExpression"


Iterator

Tagged Value Description
Aggregate_Name Nom de l'aggregat à parcourir
ConcreteAggregate_Name
ConcreteIterator_Name
Iterator_Name Nom de l'itérateur


Mediator

Tagged Value Description
AbstractColleagueName Nom du collegue abstrait
AbstractMediatorName Nom du Mediateur Abstrait
ConcreteColleague_count Nombre de classe "ConcreteColleague"
ConcreteColleague_enum Liste des nom des classe "ConcreteColleague"
ConcreteMediatorName Nom du médiateur concret


Memento

Tagged Value Description
Caretaker Désigne le nom du Caretaker (surveillant)
Originiator Désigne le nom du Originator (auteur)


Observer

Tagged Value Description
ConcreteObserver_count Nombre d'obsevateurs concrets (Min : 1, Max : infini)
ConcreteObserver_enum Noms des obsevateurs concrets (Min : 1, Max : infini) (NomConcreteSubject_NomConcreteObserver)
ConcreteObserverAttribute_count Si la valeur associée à ce TaggedValue correspond au nom d'un observateur concret, l'attribut sera déclaré dans la classe de cet observateur concret (Min : 0, Max : infini)
ConcreteObserverAttribute_enum Si la valeur associée à ce TaggedValue correspond au nom d'un observateur concret, l'attribut sera déclaré dans la classe de cet observateur concret (Min : 0, Max : infini)
ConcreteSubjectMethode_count Méthode définie dans le sujet concret
ConcreteSubjectMethode_enum Méthode définie dans le sujet concret
Observer Nom de l'interface de mise à jour pour les objets notifiés, par défaut, le nom est "Observer" (Min : 0, Max 1)
SubjectMethod_count Nombre de méthode définie dans le sujet
SubjectMethod_enum Nombre de méthode définie dans le sujet
ConcreteSubject_count
ConcreteSubject_enum Nom du sujet concret (Min : 1, Max : 1)
ConcreteSubjectAttribute_count L'attribut sera déclaré dans la classe de l'observateur concret (Min : 0, Max : infini)
ConcreteSubjectAttribute_enum L'attribut sera déclaré dans la classe de l'observateur concret (Min : 0, Max : infini)


State

Tagged Value Description
ActionMethod_count Désigne le nombre de méthode qui peuvent changer l'état courant (Min : 1, Max : infini)
ActionMethod_enum Désigne une méthode qui peut changer l'état courant (Min : 1, Max : infini)
Concrete_count Spécifie le nombre d'états concrets de la classe context (Min : 1, Max : infini)
Concrete_enum
GetMethod Ce TagValue associé à la valeur "true" va créer des méthodes associées aux états qui retourneront la valeur de l'état associé. Ces méthodes porteront le nom des états précédé du préfixe "get_". (Min : 0, Max : 1)
Initial Définit l'état initial, sa valeur doit être rigoureusement identique à un état définit par le TaggedValue "State_Concrete" (Min : 0, Max : 1)
Name La valeur associée à ce TagValue nommera le type "state". Si il n'y a pas de valeur affectée, la valeur par défaut sera le nom de la classe stéréotypée "state" suivi du suffixe "_state" (Min : 0, Max : 1)


Strategy

Tagged Value Description
AlgorithmInterface Définira le nom de l'algorithme généralisé (Min : 1, Max : 1)
Concrete_count Spécifie le nombre de stratégies concrètes implémentants l'interface (Min : 1, Max : infini)
Concrete_enum
ConcreteStrategyAttribute_count Un attribut associé à ce TagValue sera déclaré dans toutes les classes dites "Concrete Strategy" si la valeur associée au TaggedValue est nulle. En revanche si la valeur est identique au nom d'une classe "Concrete Strategy", l'attribut sera déclaré dans la classe associée (Min : 0, Max : infini).
ConcreteStrategyAttribute_enum Un attribut associé à ce TagValue sera déclaré dans toutes les classes dites "Concrete Strategy" si la valeur associée au TaggedValue est nulle. En revanche si la valeur est identique au nom d'une classe "Concrete Strategy", l'attribut sera déclaré dans la classe associée (Min : 0, Max : infini).
ConcreteStrategyMethod_count Une méthode associée à ce TagValue sera déclarée dans toutes les classes dites "Concrete Strategy" si la valeur associée au TaggedValue est nulle. En revanche si la valeur est identique au nom d'une classe "Concrete Strategy", la méthode sera déclarée dans la classe associée (Min : 0, Max : infini).
ConcreteStrategyMethod_enum Une méthode associée à ce TagValue sera déclarée dans toutes les classes dites "Concrete Strategy" si la valeur associée au TaggedValue est nulle. En revanche si la valeur est identique au nom d'une classe "Concrete Strategy", la méthode sera déclarée dans la classe associée (Min : 0, Max : infini).
ContextInterfaceName Définit le nom de l'interface qui va autoriser les strategies à accéder au données du contexte. Si il n'y a pas de valeur affectée, la valeur par défaut sera "ContextInterface" (Min : 0, Max : 1)
InterfaceName Définit le nom de l'interface Stratégie. Si il n'y a pas de valeur affectée, la valeur par défaut sera "strategy" suivi du nom de la classe stéréotypée "strategy" (Min : 0, Max : 1)


Template Method

Tagged Value Description
AbstractClass_name Nom de la classe "AbstractClass"
ConcreteClass_count Nombre de classe "ConcreteClass"
ConcreteClass_enum Liste des noms des classes "ConcreteClass"
Method_count Nombre de méthode
Method_enum


Visitor

Tagged Value Description
AbstractElement_Name Nom de la classe "AbstractElement"
AbstractVisitor_Name Nom de la classe "AbstractVisitor"
ConcreteElement_count Nombre de classe "ConcreteElement"
Concrete_Element_enum Liste des noms des classes "ConcreteElement"
ConcreteVisitor_enum Liste des noms des classes "ConcreteVisitor"
ConcreteVisitor_count Nombre de classe "ConcreteVisitor"
ConcreteVisitor_enum Liste des noms des classes "ConcreteVisitor"
ObjectStructure_Name Nom de la structure d'objet


Patterns de Création

Abstract Factory

Tagged Value Description
Abstract_Factory_Product_count Ce TaggedValue crée un produit en renseignant son nom, son "Produit Abstrait" et sa "Fabrique Concrète" La valeur associée sera découpée par des "_" en trois champs. 1-Nom de la "Fabrique Abstraite" qui va créer le produit 2-Nom du "Produit Abstrait" (famille de produits) dont le produit fait partie. 3-Nom du produit
Abstract_Factory_Product_enum Ce TaggedValue crée un produit en renseignant son nom, son "Produit Abstrait" et sa "Fabrique Concrète" La valeur associée sera découpée par des "_" en trois champs. 1-Nom de la "Fabrique Abstraite" qui va créer le produit 2-Nom du "Produit Abstrait" (famille de produits) dont le produit fait partie. 3-Nom du produit
Abstract_Product_count Ce TaggedValue crée un produit abstrait
Abstract_Product_enum Ce TaggedValue crée un produit abstrait
Concrete_Factory_count Ce TaggedValue crée un Concrete_Factory
Concrete_Factory_enum Ce TaggedValue crée un Concrete_Factory


Builder

Tagged Value Description
AbstractBuilder_Name Nom de la classe "AbstractBuilder"
ConcreteBuilder_count Nombre de classes "ConcreteBuilder"
ConcreteBuilder_enum Liste des noms des classes "Concrete Builder"
Director_Name Nom du directeur
Product_Builder_count Nombre des classes "Product_Builder"
Product_Builder_enum Liste des noms des classes "Product_Builder"

(NomConcreteBuilder_NomProductBuilder)


Factory Method

Tagged Value Description
AbstractProduct
Method_Concrete_Creator_count
Method_Concrete_Creator_enum
Method_Concrete_Product_count
Method_Concrete_Product_enum
Method_Creator_Method_count
Method_Creator_Method_enum
Method_Product_Method_count
Method_Product_Method_enum


Prototype

Tagged Value Description
AbstractPrototype_Name Nom de la classe "AbstractPrototype"
Client_Prototype_Name Nom de la classe "Client_Prototype"
Concrete_Prototype_count Nombre de classe "Concrete_Prototype"
Concrete_Prototype_enum Liste des noms des classes "Concrete_Prototype"


Singleton

Tagged Value Description
Instance
Thread1
Thread2


Patterns de Structure

Adapter

Tagged Value Description
Adaptee_count
Adaptee_enum
Adapter_count
Adapter_enum
Client
SpecificAttribute_count
SpecificAttribute_enum
SpecificRequestMethod_count
SpecificRequestMethod_enum
Target


Bridge

Tagged Value Description
Abstraction
Abstraction_Method_count
Abstraction_Method_enum
Concrete_Implementor_count
Concrete_Implementor_enum
Implementor
Implementor_Method_count
Implementor_Method_enum
Refined_Abstraction


Composite

Tagged Value Description
Client
Component
Composite
Leaf


Façade

Tagged Value Description
Facade_Name
Method_count
Method_enum
SubSystem_Class_count
SubSystem_Class_enum


Flyweight

Tagged Value Description
Client_name
ConcreteFlyweight Nom de la classe "ConcreteFlyweight"
Flyweight_name Nom de la classe "AbstractFlyweight"
FlyweightFactory_name Nom de la classe "FlyweightFactory"
UnsharedConcreteFlyweight Nom de la classe "UnshardConcreteFlyweight"


Proxy

Tagged Value Description
Method_name
Proxy_name
RealSubject
Subject


Démonstration Vidéo

M2M

[1]

M2T

[2]

Liens Utiles

Outils personnels