Question

Actuellement, le projet sur lequel je travaille n'a pas de modèles complètement fixes (en raison d'influences externes) et, par conséquent, j'aimerais une certaine souplesse pour les écrire. Actuellement, ils sont répliqués sur trois couches différentes de l'application (db, web api et client) et chacun contient une logique similaire (c.-à-d. Validation).

Je me demandais s'il existait une approche qui me permettrait d'écrire un fichier de modèle (par exemple en ruby), puis de le convertir en fichiers c # nécessaires. Actuellement, il semble que je suis en train d’écrire beaucoup de code passe-partout qui peut changer à tout moment, alors que cette approche générée me permettrait de me concentrer sur des choses bien plus importantes.

Quelqu'un a-t-il une recommandation pour quelque chose comme ceci, un dsl / langage dans lequel je peux le faire, et quelqu'un a-t-il déjà une expérience concernant quelque chose comme ceci?

Était-ce utile?

La solution

Cela peut être facilement réalisé avec ANTLR . Si le résultat est suffisamment similaire, vous pouvez simplement utiliser le mécanisme de création de modèles de texte & # 8212; sinon, il peut générer un arbre de syntaxe abstraite que vous pourrez parcourir.

Autres conseils

J'ai vu un système qui utilisait des classes partielles et des méthodes partielles pour permettre la régénération de code sans affecter le code personnalisé. Le & Quot; moteur de règles & Quot; si vous voulez a été complètement généré à partir d'un diagramme d'état Visio. Ceci est fondamentalement un flux de travail médiocre mais très facile à modifier. Le diagramme Viso a été exporté au format XML, lequel a été lu à l’aide de powershell et de T4 pour générer les classes.

L'exemple ci-dessus est celui d'un DSL externe. C'EST À DIRE. externe au langage de programmation dans lequel l'application est exécutée. Vous pouvez par contre créer un DSL interne implémenté et utilisé dans un langage de programmation.

Ceci et le précédent article sur les DSLS de Code-Magazine sont plutôt bons .

Dans le lien ci-dessus, Neal Ford vous explique comment créer un DSL interne en C # à l’aide d’une interface fluide.

Une chose qu’il n’a pas encore mentionnée, c’est que vous pouvez attribuer cet attribut [EditorBrowsable (EditorBrowsableState.Never)] à vos méthodes afin qu’elles n'apparaissent pas dans intellisense. Cela signifie que vous pouvez masquer les méthodes non-DSL (si vous voulez) de la classe à l'utilisateur de la DSL, ce qui rend l'API fluide beaucoup plus découvrable.

Vous pouvez voir une interface fluide écrite en direct dans cette série de vidéos par Daniel Cazzulino dans écrire un conteneur IoC avec TDD

En ce qui concerne les DSL externes, vous avez également la possibilité de Oslo (CTP en ce moment) , qui est assez puissant pour vous permettre de créer des DSL externes pouvant être exécutés directement plutôt que pour l'utilisation de la génération de code pense que ce n'est pas vraiment une DSL du tout.

Je pense que vous êtes sur la bonne voie.

Ce que je fais habituellement dans une situation comme celle-ci est de concevoir un langage simple qui capture mes besoins et d’écrire un analyseur syntaxique LL1 (récursif, descente).

Si le langage doit contenir une syntaxe non triviale en C #, je peux le citer ou le mettre entre crochets que je peux reconnaître et le transmettre au code de sortie.

Je peux le faire générer une structure d’arbre d’analyse, et générer 3 types de code différents à partir de cela, ou bien le générer à la volée, en utilisant une variable de mode avec 3 valeurs ou tout simplement écrire simultanément code vers 3 fichiers de sortie différents.

Il y a plus d'une façon de le faire. Si vous avez peur d’écrire des analyseurs syntaxiques (comme le sont certains programmeurs), vous trouverez beaucoup d’aide ailleurs sur SO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top