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.
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.
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
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
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 ».
On lance ensuite la transformation directement à partir du « projet browser » en sélectionnant directement le package qu'on souhaite transformer d'un clic droit :
Une nouvelle fenêtre s'affiche alors :
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 :
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 |








