Question

Quelle technologie recommanderiez-vous pour créer un DSL pour un Bloc d'application de règles métier et de validation pour .NET?Et pourquoi?

L'architecture du framework est établie et testée par une production.Je veux juste créer un processeur .NET pour transformer des règles lisibles par l'homme en implémentations de règles compilées.

Les options que je connais sont :

  • Utiliser le pipeline du compilateur de .NET Bouh
  • Utilisez les générateurs d'analyseurs fournis avec F# - FsLex et FsYacc

Malheureusement, aucune de ces approches ne permet de créer un IDE plus ou moins convivial pour l'édition DSL, étant donné la syntaxe DSL (qui évoluerait).

Des idées ou des conseils ?

Était-ce utile?

La solution

Plate-forme de développement d'applications de nouvelle génération de Microsoft, nom de code Oslo

  

rend plus facile pour les gens d'écrire les choses de manière logique pour le domaine des problèmes qu'ils travaillent dans

Oslo semble consister en un outil de conception visuelle nommé référentiel « Quadrant », un langage de modélisation nommé « M » et le « Oslo » (une base de données SQL Server) stockant les règles.

Donc, si je lis bien les choses, vous pouvez définir un langage de modélisation dans M, utilisez Quadrant pour définir et modifier vos règles de validation en utilisant votre propre langage de modélisation, et d'écrire une application qui utilise le dépôt d'Oslo, générant vos règles d'affaires et l'application de validation de bloc pour .NET.

Autres conseils

Un langage graphique des règles d'affaires ne sont pas une bonne idée. J'éviter les règles d'affaires ont beaucoup de contrôles et si les boucles en eux, qui ne visualisent pas bien.

Vous êtes beaucoup mieux avec un langage textuel pour décrire les règles métier.

Pour obtenir une expérience utilisateur phenomenial pour le code d'édition dont vous avez besoin:

  1. Un analyseur avec bonne récupération d'erreur
  2. La possibilité de faire re-compilation incrémentale

Bonne récupération d'erreur vous permet de déterminer efficacement l'intention de programer de constructions syntaxiquement incomplètes. C'est crucial pour la mise en œuvre intellisence.

La capacité à faire-recompilation incrémentale vous donne la possibilité de faire la compilation d'arrière-plan efficent en réponse aux modifications de l'utilisateur.

La meilleure façon d'obtenir une bonne récupération d'erreur est d'écrire votre analyseur manuellement. De cette façon, vous pouvez utiliser quelque quantité de regard vers l'avenir, ou des règles algrorithmic, pour déterminer ce qu'il faut faire en présence d'erreurs de syntaxe.

Lorsque vous utilisez un générateur d'analyseur pour créer votre analyseur, vous perdez beaucoup de flexibilité dans le traitement des erreurs de syntaxe. Cette flexibilité fait la différence entre un bon intellisence expereince et un crapy. Donc, je vous conseille d'écrire simplement à la main en utilisant la descente récursive.

La mise en œuvre recompilation de efficent vous oblige à être en mesure de: 1) correctement décomposer l'analyse sémantique en phases (quelque chose comme C # ce serait: d'abord construire des symboles d'espace de noms et le type, puis résoudre en utilisant des instructions, puis résoudre les classes de base, etc.). 2) La possibilité de construire un graphe de dépendance-courant de phase 3) Les algorithmes de traitement du graphe de dépendance, et invalider des parties de celui-ci en réponse à des modifications de l'utilisateur

Pour langage de programmation complet flegged, la mise en œuvre recompilation peut être vraiment difficile. Dans votre cas, parce que vous décrivez les règles d'affaires, il pourrait être beaucoup pour vous du Simplon (ou si la compilation est assez rapide, vous pourriez même pas besoin).

Alors, je voudrais commencer par l'analyseur, puis construire intellisence sur le dessus de celui-ci.

Si vous pouvez éviter l'intégration VS, je le ferais. L'intégration dans VS nécessite beaucoup de plomberie, et l'Interop est susceptible de causer des maux de tête. Il y a quelques entreprises qui vendent des contrôles Windows Forms de l'éditeur que vous accrochez votre analyseur jusqu'à. Ce sont beaucoup plus faciles à intégrer que VS.

Une autre alternative intéressante est peut-être d'utiliser des citations F #.

Citations vous permettent de traiter une partie du programme en tant que données, de sorte que vous pouvez obtenir l'AST, l'analyser et de le traduire en d'autres langues ou l'exécuter d'une manière non standard. En collaboration avec la flexibilité de F #, vous devriez être en mesure d'exprimer beaucoup de choses, de sorte que vous auriez à développer une bibliothèque F # interne DSL / combinateur pour décrire les règles et un traducteur / interprète pour les citations F # pour les exécuter.

Je ne sais pas comment une règle bussines pourrait ressembler, mais vous pouvez écrire quelque chose comme ceci:

let rule = <@
  if (exists customer having validEmail) then success
  else require whatever 
@>

J'ai écrit une introduction à ce sujet sur mon blog. Unfortunatelly, il y a eu de grands changements dans la F # CTP et je n'ai pas encore mis à jour le code source, mais il devrait vous donner une bonne idée de ce que sont les possibilités et les limites de cette approche.

Un bon exemple de DSL est F # test unitaire framewrok:

[EDIT] Juste pour préciser pourquoi je pense que cela peut être une bonne approche:

  • Si vous utilisez Visual Studio pour Editting les DSLs (et vous pouvez utiliser la version Shell avec F # installé gratuitement), vous aurez une très bonne expérience d'édition gratuitement. Non seulement la coloration syntaxique, mais aussi IntelliSense que vous conseillerons les constructions possibles et aussi un type de vérification de l'arrière-plan qui sert de vérificateur « grammaire » pour votre DSL.
  • Par rapport à d'autres approches celui-ci est peut-être l'un des plus faciles à mettre en œuvre.
  • La seule limitation est que vous Délimité par la syntaxe F #. Cependant, la conception de votre propre langue est ce qui peut vraiment difficile, donc pas mal du tout. En particulier, compte tenu de la flexibilité de F #.

[/ EDIT]

Hope this helps!

Je l'utilise Boo, je pense qu'il est actuellement l'un des outils les plus flexibles pour la création de DSL. Il y a un très bon livre sur le sujet. de Ayende et blogs de Rodrigo sont bonne inspiration aussi.

A propos de l'IDE, vous pourriez étendre SharpDevelop , jetez un oeil à cette .

L'outil standard pour la construction des coutures de DSL à être ANTLR - il est un puissant générateur lexer / analyseur avec beaucoup de langues cibles pour la sortie du compilateur. Il a pour C # backends, Java, C / C ++, Python, etc. (voir le Le Defenitive ANTLR Référence de Terrence Parr, la auteur de ANTLR) Pour les références sur qui d'autre l'utilise voir la page Testimonlals .

Vous devez toujours faire la plupart de la plomberie pour l'IDE vous-même, mais il devrait être beaucoup plus facile compte tenu du cadre robuste du compilateur que vous obtiendrez de ANTLR. Cela devrait être le cas pour la plupart des solutions publiées ici ...

Je suis actuellement en utilisant un compilateur écrit avec ANTLR pour prétraiter notre propre DSL à la sortie de C / C et je suis très heureux avec elle. Assez de la publicité, vous devriez essayer pour vous-même :) Amusez-vous!

JetBrains Système de méta-programmation

Vous pouvez définir des éditeurs de langue personnalisés et d'autres contraintes pour toute nouvelle langue, afin que travailler avec ces DSL devienne vraiment simple.Les experts du domaine qui ne sont pas familiers avec la programmation traditionnelle peuvent facilement travailler dans MPS avec leurs langages spécifiques à leur domaine en utilisant la terminologie spécifique au domaine.

Je suis nouveau, mais Ometa semble comme un idéal outil de développement DSLs. Il ne semble pas être un IDE autour, mais les bonnes nouvelles sont que les « règles », on peut écrire dans Ometa sont très lisibles. (Et il traite de gauche récursion, ce qui est très cool.)

Il existe actuellement mises en œuvre Ometa dans au moins Javascript (très excitant pour moi) et Python, peut-être d'autres. En ce qui concerne C #, Jeff Moser travaille sur un, que vous pouvez lire sur son blog voir plus CodePlex . Bonne chance.

Boo + Ometa = Boo.OMeta.Parser

Actuellement, l'analyseur est en cours de développement, mais il peut déjà être utilisé pour la création de DSLs externes complexes. Ometa est un outil puissant qui permet aux programmeurs d'implémenter facilement des analyseurs lexicaux et parseurs. architecture pipeline du compilateur prorogeable de Boo permet de remplacer Boo.Parser standard avec Boo.OMeta.Parser. Il peut être utilisé pour étendre la syntaxe Boo avec presque tous les types de syntaxe. L'exemple peut être trouver .

Mon projet meta # tente de résoudre ce problème.

Si vous voulez créer un IDE convivial qui édite les DSLs, faire l'IDE entièrement graphique, et de compiler des objets .NET (ou utiliser quelque chose comme IronPython comme langue de la colle).

Si les règles sont assez simples, vous pouvez mettre en œuvre l'ensemble des règles la structure graphique. Si les règles sont assez complexes, « lisibilité humaine » devient un objectif impossible.

De toute façon, si un ensemble de classes .NET ou des objets IronPython qui créent le code intermédiaire ne suffit pas « lisible », alors les chances sont, vous voulez quelque chose de plus que la preuve factice une grammaire.

Cela dit, si vous voulez juste créer un langage simple que les programmeurs peuvent utiliser pour créer des règles de gestion, ne hésitez pas à utiliser l'une des ci-dessus, et de faire la syntaxe assez minimalistes pas besoin de l'IDE de Visual Studio.

Ruby est un langage pour la création DSLs. Par exemple Rake est un DSL de script de compilation écrit avec Ruby.

Avec la rel="nofollow prochaine IronRuby il est possible d'écrire des scripts qui appellent votre code C # directement.

Voici href="http://obiefernandez.com/presentations/obie_fernandez-agile_dsl_development_in_ruby.pdf" rel="nofollow noreferrer"> articles sur l'écriture DSLs en Ruby.

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