Depuis quelques temps, je tombe fréquemment sur des articles au sujet des DSL de Microsoft. Je me demande: « pourquoi un autre langage de modélisation ? UML ne remplit-il pas déjà cette fonction ? Et quand bien même, non seulement je ne crois pas en une modélisation front-end (une modélisation exhaustive en début de projet), mais de plus cette pratique va à l’encontre de mes principes d’agilité »
Ces lignes vont montrer pourquoi j’ai eu tort de tourner la page.
Microsoft Domain Specific Language Tools sont des outils permettant d’implémenter des DSL, des langages spécifiques conçus pour répondre à un problème donné. Ils sont fournis sous la forme d’un SDK installable sur Visual Studio 2005 Professional. Attention, il ne faut pas pour autant voir les DSL Tools comme une partie intégrante de Visual Studio mais plutôt comme une solution à part entière.
« Un outil pour fabriquer des outils » : cette définition, celle de Microsoft, souligne la différence avec les outils UML. La démarche MDA (Model Driven Architecture) est jalonnée d’une série de transformations de modèles UML, depuis un haut niveau d’abstraction, le CIM (Computation Independent Model), jusqu’au PSM (Platform Specific Model) et l’implémentation.
C’est la différence clé. Voici ce que Microsoft propose :
• Dans une première phase, l’architecte construit la définition du langage pour un domaine spécifique, avec ses règles, ses validations, ses entités et leurs relations (cette spécificité garantit l’adéquation avec le domaine) et il intègre le tout dans un outil de modélisation.
• Dans une deuxième phase, il laisse à l’utilisateur du DSL (développeur, analyste, ou autre expert du domaine) le soin d’utiliser cet outil et ses éléments pour implémenter la partie concernée de l’application.
• Tout le long du développement, la définition du DSL peut évoluer en fonction des nouveaux besoins identifiés par les utilisateurs du DSL. Tout comme du code, le DSL peut donc s’adapter et se perfectionner pendant toute la durée du projet, et être ensuite réutilisé sur d’autres projets portant sur le même domaine.
J’ai jusqu’à maintenant parlé des DSL dans leur aspect vertical, c’est-à-dire propre à un domaine métier. Je vais illustrer l’utilisation des DSL dans une démarche plutôt horizontale, technique, pour apporter la preuve de leur flexibilité.
Ma démonstration traite du pattern MVP (Model View Presenter). Je constate que le concept de code behind est souvent mal compris par les développeurs. Certains ont tendance à y inclure beaucoup de logique applicative. Or, tout ce qui est dans le code behind n’est ni testable, ni réutilisable !
Le pattern de conception MVP apporte une réponse intéressante à cette problématique en déportant la logique de présentation dans un composant spécifique testable indépendant de la technologie choisie pour la vue. Il offre ainsi un découpage des responsabilités sain et robuste.
Mais n’allons pas plus loin dans la description de ce pattern (voir les références pour plus d’informations) et revenons aux DSL Tools.
Il revient à l’architecte :
• De définir le méta-modèle du MVP (la sémantique du langage)
• De créer un outil intégrable à l’environnement de développement Visual Studio et de définir son apparence
• D’assurer la validité du modèle implémenté en s’appuyant sur le méta-modèle par la définition de règles de validation (la syntaxe du langage).
A partir d’un nouveau projet de type « Langage Minimal », l’architecte définit le méta-modèle, composé des éléments suivants :
• View (qui correspond à une vue, de type WinForm, WebForm, XAML,…)
• ViewContract (une interface pour la vue)
• Presenter
• Model (référence un élément métier)
…et des relations suivantes :
• Un ViewContract est implémenté par une ou plusieurs View
• Un Presenter manipule une vue par son contrat (ViewContract)
• Un Presenter « utilise » un élément du modèle

Sont ensuite définies les règles de validation qui permettent d’assurer la cohérence :
• Erreur bloquante si une View n’implémente aucun ViewContract
• Erreur bloquante si un ViewContract n’est référencée par aucun Presenter
• Message d’alerte si un ViewContract n’est implémenté par aucune View
• Message d’alerte si un Presenter ne référence aucun ViewContract.
using System;
using Microsoft.VisualStudio.Modeling.Validation;
using System.Globalization;
namespace Valtech.ModelViewPresenter
{
///
/// Validation checks that will be applied to every ViewContract
///
[Microsoft.VisualStudio.Modeling.Validation.ValidationState
(Microsoft.VisualStudio.Modeling.Validation.ValidationState.Enabled)]
public partial class ViewContract
{
///
/// PresenterReference : Validates that ViewContract is manipulated by a Presenter
///
///
[ValidationMethod(ValidationCategories.Menu
| ValidationCategories.Open
| ValidationCategories.Save)]
private void ValidatePresenterReference(ValidationContext context)
{
if (this.Presenters == null || this.Presenters.Count != 1)
{
string description = String.Format(CultureInfo.CurrentCulture,
Validation.DomainModel_Resource.PresenterReference);
context.LogError(description, “PresenterReference”, this);
}
}
[ValidationMethod(ValidationCategories.Menu
| ValidationCategories.Open
| ValidationCategories.Save)]
private void ValidateContractImplemented(ValidationContext context)
{
if (this.Views == null || this.Views.Count == 0)
{
string description = String.Format(CultureInfo.CurrentCulture,
Validation.DomainModel_Resource.ContractImplemented);
context.LogWarning(description, “ContractImplemented”, this);
}
}
}
}
Le développeur peut alors implémenter ses modèles grâce à une interface graphique sur laquelle il dépose les composants du MVP et définit leurs relations. La qualité de son implémentation est garantie par les règles de validation.

Une dernière étape consiste à mettre en oeuvre des « text templates » qui permettent de générer du code pour les classes, les tests unitaires, des bouchons (mocks).
<#@ template inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#>
<#@ ModelViewPresenter processor="ModelViewPresenterDirectiveProcessor" requires="fileName='../mvp.mvp'" #>
<#
foreach(MVPComponents type in this.MVP.Elements)
{
if (type is ViewContract)
{
#>
public interface <#= type.Name#>
{
}
<#
}
}
#>
Le GAT (Guidance Automation Toolkit), qui est une évolution des « Entrerprise Templates », peut être utilisé pour la définition de la structure des solutions et des projets ou pour ajouter une aide contextuelle à l’utilisateur de DSL.
D’autres fonctionnalités seront certainement proposées dans les futures versions du SDK pour une plus grande flexibilité et une meilleure « expérience utilisateur ». Citons la synchronisation bidirectionnelle entre le code et le modèle.
Parlons maintenant Agilité. La démarche de Microsoft DSL Tools n’est pas celle d’une modélisation front-end. Il s’agit de donner la responsabilité de la définition d’un langage spécifique aux experts du domaine et aux architectes, qui détiennent les règles métier de validation, tout en offrant suffisamment de souplesse à l’utilisateur avec un outil pouvant être utilisé dans une démarche agile itérative (conception, implémentation, tests).
Un aspect sur lequel ces DSL spécifiques sont supérieurs à de l’UML stéréotypé, est leur réutilisabilité car ils sont conçus spécifiquement pour tout un domaine (métier ou technique). On peut ainsi imaginer que des DSL Tools feront l’objet d’offres commerciales de la part d’éditeurs spécialisés soit sur un métier (ex: la finance) soit sur une technologie (ex: le mapping O/R).
Les DSL occupent une place importante dans la vision de l’usine logicielle selon Microsoft (Software Factory Initiative). Utilisés conjointement avec le GAT, ils contribuent à l’extensivité de l’environnement de développement et c’est bien dans ce contexte qu’ils montrent toute leur valeur. A l’heure de l’industrialisation et alors que les méthodes agiles apportent la preuve de leur efficacité, nous pouvons être certains qu’il s’agit d’une technologie sur laquelle il faut compter.
Décembre 2006
Sadek Drobi
Sadek.Drobi@valtech.fr
http://www.sadekdrobi.com
Julien Delhomme
Julien.Delhomme@valtech.fr
http://www.juliendelhomme.com
Consultants Valtech, experts .NET - Industrialisation
Références
Martin Fowler
Supervising Presenter
Article MSDN sur MVP
http://msdn.microsoft.com/msdnmag/issues/06/08/DesignPatterns/
Page d’accueil DSL Tools sur le site de Microsoft
http://msdn.microsoft.com/vstudio/DSLTools
Books
“Software Factories: Assembling Applications with Patterns, Models, Frameworks, and Tools” - John Crupi, Jack Greenfield, et Keith Short - Wiley 2004