2009-03-19 6 views
6

Momentan hat das Projekt, mit dem ich arbeite, keine komplett fixierten Modelle (aufgrund eines externen Einflusses) und daher hätte ich gerne etwas Flexibilität beim Schreiben. Gegenwärtig werden sie über drei verschiedene Schichten der Anwendung (db, web api und client) repliziert und jede hat eine ähnliche Logik (dh Validierung).Verwendung eines DSL zum Generieren von C# Code

Ich frage mich, ob es einen Ansatz gibt, der es mir erlauben würde, eine Modelldatei (etwa in Ruby) zu schreiben und dann dieses Modell in die notwendigen C# -Dateien konvertieren zu lassen. Momentan scheint es, dass ich nur eine Menge Code schreibe, der sich in jedem Stadium ändern kann, während dieser generierte Ansatz es mir erlauben würde, mich auf viel wichtigere Dinge zu konzentrieren.

Hat jemand eine Empfehlung für so etwas, eine DSL/Sprache, in der ich das tun kann, und hat irgendjemand Erfahrung in Bezug auf so etwas?

Antwort

5

Dies kann problemlos mit ANTLR durchgeführt werden. Wenn die Ausgabe ähnlich genug ist, können Sie einfach den Text-Templating-Mechanismus verwenden - andernfalls kann er einen abstrakten Syntaxbaum erzeugen, den Sie durchlaufen können.

5

Ich habe ein System gesehen, das partielle Klassen und partielle Methoden verwendet hat, um die Neugenerierung von Code zu ermöglichen, ohne den benutzerdefinierten Code zu beeinflussen. Die "Rules Engine", wenn Sie wollen, wurde vollständig aus einem Visio-Zustandsdiagramm generiert. Dies ist im Grunde armer mans Workflow, aber sehr einfach zu ändern. Das Viso-Diagramm wurde in XML exportiert, das mit Powershell eingelesen wurde, und T4, um die Klassen zu generieren.

Das obige Beispiel ist von einem externen DSL. I.E. außerhalb der Programmiersprache, in der die Anwendung läuft. Sie könnten andererseits eine interne DSL erstellen, die in einer Programmiersprache implementiert und verwendet wird.

Dies und die vorherige article on DSLSs von Code-Magazine sind ziemlich gut.

In der obigen Verbindung zeigt Ihnen Neal Ford, wie Sie eine interne DSL in C# mit einer fließenden Schnittstelle erstellen.

Eine Sache, die er noch nicht erwähnt hat, ist, dass Sie dieses Attribut [EditorBrowsable (EditorBrowsableState.Never)] auf Ihre Methoden setzen können, damit sie nicht intellisense erscheinen. Dies bedeutet, dass Sie die Nicht-DSL-Methode (wenn Sie wollen) der Klasse vor dem Benutzer des DSL verbergen, wodurch die fließende API viel besser erkennbar wird.

können Sie sehen, eine fließend Schnittstelle leben in dieser Videoserie mit TDD einen IoC-Container von Daniel Cazzulino geschrieben

Zum Thema externen DSLs auf das Schreiben auch Sie die Möglichkeit, Oslo (CTP at the moment) haben, die in seiner Fähigkeit, sehr mächtig ist Damit Sie externe DSLs erstellen können, die direkt ausgeführt werden können, anstatt für die Verwendung von Code-Generierung, die daran denken, ist nicht wirklich viel von einem DSL überhaupt.

+1

Viele vollwertige Compiler sind wirklich Codegeneratoren. Der ursprüngliche C++ - Compiler, cfront, erzeugte geraden C-Code, und Eiffel und Haskell kompilieren auch nach C, bevor sie in den Binärcode übergehen. –

+0

Alle Compiler sind Codegeneratoren, sie generieren möglicherweise keinen menschenfreundlichen Code. Selbst Maschinencode-Befehle sind typischerweise nur Befehle auf höherer Ebene, die von Mikrocode interpretiert werden, der in einem Prozessor eingebettet ist. –

1

Ich denke, Sie sind auf dem richtigen Weg.

Was ich normalerweise in einer Situation wie diesem tue, ist eine einfache Sprache zu entwerfen, die meine Bedürfnisse erfasst und einen LL1 (Recursive Descent) Parser dafür schreibt.

Wenn die Sprache eine nicht-triviale C# -Syntax enthalten muss, kann ich das entweder zitieren oder einfach in Klammern, die ich erkennen kann, umwandeln und sie einfach an den Ausgabecode übergeben.

Ich kann es entweder generieren eine Syntaxanalyse Baumstruktur, und generieren Sie sagen, dass 3 verschiedene Arten von Code aus diesem, oder ich kann nur Code generieren im laufenden Betrieb, entweder mit einer Modusvariablen mit 3 Werte oder nur gleichzeitig schreibe Code in 3 verschiedene Ausgabedateien.

Es gibt mehr als eine Möglichkeit, dies zu tun. Wenn Sie Angst davor haben, Parser zu schreiben (wie es manche Programmierer tun), gibt es an anderer Stelle auf SO eine Menge Hilfe.

Verwandte Themen