Domanda

Quello che la tecnologia mi consiglia di creare un DSL per un business Rules e convalida Application Block per .NET ? E perché?

L'architettura del quadro è stabilito e correzione testato da una produzione. Voglio solo per creare un processore .NET per trasformare le regole leggibili ad un implementazioni regola compilati.

Le opzioni che io sappia sono:

Purtroppo nessuno di questi approcci offre nulla per costruire IDE più o meno amichevole per l'editing DSL, data la sintassi DSL (che evolverà).

Tutte le idee o suggerimenti?

È stato utile?

Soluzione

piattaforma di sviluppo di applicazioni Microsoft di nuova generazione, nome in codice Oslo

  

rende più facile per le persone a scrivere le cose in modi che hanno senso per il dominio del problema si sta lavorando in

Oslo sembra consistere di uno strumento di progettazione visiva chiamato "quadrante", un linguaggio di modellazione chiamato "M", e il repository "Oslo" (un database SQL Server) che memorizza le regole.

Quindi, se ho letto cose correttamente, è possibile definire un linguaggio di modellazione in M, utilizzare Quadrant per definire e modificare le regole di validazione usando il proprio linguaggio di modellazione, e scrivere un'applicazione che fa uso del repository di Oslo, generando le regole aziendali e convalida Application Block per .NET.

Altri suggerimenti

Un linguaggio grafico per le regole di business non è una buona idea. Vorrei evitare che regole di business hanno un sacco di se i controlli e loop in loro, che non visualizzano bene.

Tu sei molto meglio con un linguaggio testuale per descrivere le regole di business.

Per ottenere un'esperienza utente phenomenial per la modifica del codice è necessario:

  1. Un parser con un buon recupero degli errori
  2. La capacità di fare incrementale ri-compilazione

Buon recupero di errore consente di determinare in modo efficace l'intento programer da costrutti sintatticamente incomplete. Questo è fondamentale per l'attuazione Intellisence.

La capacità di fare incrementale-ricompilazione ti dà la possibilità di fare la compilazione sfondo efficiente in risposta alle modifiche degli utenti.

Il modo più semplice per ottenere un buon recupero di errore è quello di scrivere il parser a mano. In questo modo è possibile utilizzare qualsiasi quantità di guardare avanti, o le regole algrorithmic, per capire cosa fare in presenza di errori di sintassi.

Quando si utilizza un generatore di parser per creare il parser, si perde un sacco di flessibilità nel trattare con errori di sintassi. Che la flessibilità fa la differenza tra una buona esperienza a Intellisence e una crapy. Quindi, vi consiglio di basta scrivere a mano con discesa ricorsiva.

L'implementazione efficiente ri-compilazione richiede di essere in grado di: 1) rompere correttamente le analisi semantica in fasi (per qualcosa come C # questo sarebbe: prima costruire namespace e tipo simboli, quindi risolvere utilizzando le istruzioni, poi risolvere classi base, ecc). 2) La possibilità di creare un grafico delle dipendenze fase consapevole 3) Algoritmi per l'elaborazione del grafico di dipendenza, e invalidante parti di esso in risposta a modifiche degli utenti

Per la lingua full-flegged programmazione, attuazione di ri-compilazione può ottenere davvero difficile. Nel tuo caso, perché si sta descrivendo le regole di business, potrebbe essere molto più di Simplon per voi (o se la compilazione è abbastanza veloce si potrebbe anche non ne ha bisogno).

Quindi, vorrei iniziare con il parser, e poi costruire Intellisence su di esso.

Se si può evitare l'integrazione VS, lo farei. L'integrazione in VS richiede un sacco di impianto idraulico, e l'interoperabilità può causare mal di testa. Ci sono alcune aziende che vendono i controlli Windows Form Editor che collegare il vostro parser fino a. Che sono molto più facili da integrare con quello VS.

Un altro possibilmente interessante alternativa è quella di utilizzare F # citazioni.

Citazioni consentono di trattare parte del programma come dati, in modo da poter ottenere l'AST, analizzarlo e tradurre in altra lingua o eseguire in qualche modo non standard. Insieme con la flessibilità di F #, si dovrebbe essere in grado di esprimere molte cose, in modo che avrebbe dovuto sviluppare un F # biblioteca DSL / combinatore interna per la descrizione delle regole e un traduttore / interprete per F # citazioni per farli funzionare.

Non sono sicuro di come una regola di bussines potrebbe apparire come, ma si potrebbe scrivere qualcosa di simile a questo:

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

ho scritto un'introduzione a questo argomento sul mio blog. Purtroppo, ci sono stati alcuni grandi cambiamenti nel F # CTP e non ho ancora aggiornato il codice sorgente, ma dovrebbe darvi una buona idea di quali sono le possibilità e limiti di questo approccio.

Un buon esempio di DSL è F test # unità framewrok:

[EDIT] Giusto per chiarire il motivo per cui credo che questo possa essere un buon approccio:

  • Se si utilizza Visual Studio per editting i DSL (ed è possibile utilizzare la versione di Shell con F # installato gratuitamente), si otterrà un'esperienza molto positiva la modifica gratuitamente. Non solo l'evidenziazione della sintassi, ma anche Intellisense che ti suggeriscono le possibili costrutti e anche uno sfondo di tipo controllo che funge da correttore 'grammatica' per la vostra DSL.
  • Rispetto ad altri approcci questo è forse uno dei più facili da implementare.
  • L'unica limitazione è che si sta delimitata dalle # Sintassi F. Tuttavia, progettare il proprio linguaggio è davvero difficile, quindi questo non può essere così male a tutti. Soprattutto in considerazione la flessibilità di F #.

[/ EDIT]

Spero che questo aiuti!

userei Boo, penso che sia attualmente uno degli strumenti più flessibili per la creazione di DSL. C'è un ottimo libro sull'argomento. di Ayende e blog di Rodrigo sono buona ispirazione troppo.

A proposito l'IDE, si potrebbe estendere SharpDevelop , dare un'occhiata a questo .

Lo strumento standard per la creazione di cuciture di DSL ad essere ANTLR - si tratta di un potente generatore lexer / parser con un sacco di lingue di destinazione per l'output del compilatore. Ha backend per C #, Java, C / C ++, Python, ecc (vedi obiettivi di generazione di codice elenco ) e consente di iniettare codice personalizzato nel vostro compilatore nella lingua di destinazione con facilità.

C'è anche una molto potente IDE (ANTLRWorks) e un sacco di documentazione. (Check out Il Defenitive ANTLR Riferimento da Terrence Parr, il autore di ANTLR) per i riferimenti su chi altro lo usa vedere la pagina Testimonlals .

Hai ancora bisogno di fare la maggior parte l'impianto idraulico per l'IDE da soli, ma dovrebbe essere molto più facile dato il robusto quadro compilatore si otterrà da ANTLR. Questo dovrebbe essere il caso per la maggior parte delle soluzioni postato qui ...

Attualmente sto usando un compilatore scritto con ANTLR per pre-elaborare la nostra DSL per l'uscita C / C ++ e sono molto soddisfatto. Basta con la pubblicità, si dovrebbe provare per credere :) Buon divertimento!

Meta Programmazione del sistema

  

È possibile definire i redattori linguistici personalizzati e altri vincoli per qualsiasi nuova lingua, in modo che il lavoro con quelle DSL diventa davvero semplice. esperti del settore che non hanno familiarità con la programmazione tradizionale può facilmente lavorare in MPS con i loro linguaggi specifici del dominio utilizzando la terminologia specifica del dominio.

Sono nuovo di esso, ma Ometa sembra come un ideale strumento per lo sviluppo di DSL. Non sembra essere un IDE intorno ad esso, ma la buona notizia è che le "regole" si può scrivere in Ometa sono molto leggibile. (E si tratta di ricorsione sinistra, che è altamente fredda.)

Al momento non ci sono implementazioni Ometa in almeno Javascript (molto eccitante per me) e Python, forse altri. Per quanto riguarda C #, Jeff Moser sta lavorando su uno, che si può leggere su su il suo blog e vedere oltre a CodePlex . Buona fortuna.

Boo + Ometa = Boo.OMeta.Parser

Al momento il parser è in fase di sviluppo, ma può già essere utilizzato per la creazione di DSL esterni complessi. Ometa è uno strumento potente che consente ai programmatori di implementare facilmente gli analizzatori lessicali e parser. compilatore estensibile architettura pipeline di Boo permette di sostituire Boo.Parser serie con Boo.OMeta.Parser. Può essere utilizzato per estendere la sintassi Boo con quasi ogni tipo di sintassi. L'esempio può essere trovare qui .

Il mio progetto meta # sta cercando di risolvere questo problema.

Se si desidera creare un IDE amichevole che modifica i DSL, fare l'IDE completamente grafica, e compilare a .NET oggetti (o usare qualcosa come IronPython come lingua colla).

Se le regole sono abbastanza semplici, è possibile implementare l'intera regola-struttura graficamente. Se le regole sono abbastanza complesse, "leggibilità umana" diventa un obiettivo impossibile.

In entrambi i casi, se un insieme di classi .NET o oggetti IronPython che creano il codice intermediario non è "leggibile" abbastanza, quindi le probabilità sono, si vuole manichino a prova di qualcosa di più di una grammatica.

Detto questo, se si desidera solo per creare un linguaggio semplice che i programmatori possono utilizzare per creare regole di business, sentitevi liberi di utilizzare una di queste, e rendere la sintassi abbastanza da non minimalista avere bisogno di IDE di Visual Studio.

Ruby è un grande linguaggio per la creazione di DSL. Per esempio Rake è un DSL script di build scritto con Ruby.

Con l'imminente rel="nofollow IronRuby è possibile scrivere script che chiamano il vostro C # codice direttamente.

Ecco href="http://obiefernandez.com/presentations/obie_fernandez-agile_dsl_development_in_ruby.pdf" rel="nofollow noreferrer"> articoli sulla scrittura DSL in Ruby.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top