Widerruf o2 dsl Muster

Ich denke, dass viele Leute davon ausgehen, dass fließende Schnittstellen und Methodenverkettung die einzigen Möglichkeiten zum Erstellen von DSLs innerhalb von C` sind. Früher habe ich das auch geglaubt, aber seitdem habe ich andere Techniken und Muster gefunden, die oft viel einfacher zu implementieren sind als Methodenverkettung. Ein immer beliebter werdendes Muster ist das verschachtelte Verschlussmuster: Immer häufiger verwende ich Erweiterungsmethoden für grundlegende Objekte wie Zeichenfolgen und Zahlen, um die Wiederholungsfähigkeit in den .NET Framework-Kern-APIs zu reduzieren und die Lesbarkeit zu erhöhen. Dieses Muster des Erweiterns von Wertobjekten wird als « Literalerweiterungen » bezeichnet. Meine Frage ist: Sind das Builder-Muster und ein DSL-Äquivalent – oder ist man ausdrucksstärker? Ich habe das geschachtelte Verschlussmuster in diesen Artikel aufgenommen, da es in.NET Open-Source-Projekten von Framework simmert wird, wie Rhino Mocks, Fluent NHibernate und viele IoC-Tools. Außerdem habe ich häufig festgestellt, dass das geschachtelte Verschlussmuster wesentlich einfacher zu implementieren ist als nur die Methodenverkettung. Der Nachteil ist, dass viele Entwickler immer noch mit Lambda-Ausdrücken unzufrieden sind. Darüber hinaus ist diese Technik in VB.NET kaum einsetzbar, da VB.NET keine mehrzeiligen Lambda-Ausdrücke unterstützt. Sie können eine DSL mit dem Builder-Muster implementieren ODER Sie können DSL auch mit anderen Mustern implementieren. Ein Muster ist eine Lösungsvorlage für eine Reihe von Problemen, Builder-Muster ist eine solche Vorlage für das Problem der Implementierung einer DSL, aber es ist nicht die einzige. Der Punkt hier ist, dass fließende Schnittstellen nicht das einzige Muster zum Erstellen von lesbareren APIs in .NET Framework sind. Dieser Ansatz ist viel häufiger in JavaScript, wo Sie JavaScript Object Notation (JSON) verwenden können, um Objekte vollständig in einer Codezeile anzugeben, und in Ruby, wo es idiomatisch ist, Namens-/Werthashes als Argumente für Methoden zu verwenden.

Natürlich enthalten DSLs viele Dinge, die kein Builder-Muster sind. Also nein, sie sind nicht dasselbe. In meinem Buch über domänenspezifische Sprachen wird eine Musterstruktur verwendet, um die Konzepte zu organisieren, die ich zum Beschreiben von DSLs verwende. Hier ist eine Liste der Muster in diesem Buch. Jede ist mit einer Seite für jedes Muster verknüpft. Die Seiten enthalten nicht viel Detail, wenig mehr als einen Hinweis auf das relevante Kapitel im Buch. Mein Hauptzweck für diese ist es, einen Referenz-URI für jedes Muster bereitzustellen. In einem komplizierteren Szenario können Sie die fließende Schnittstelle in zwei Teile trennen: das semantische Modell, das das Laufzeitverhalten bereitstellt (mehr zu diesem Muster später) und eine Reihe von « Expression Builder »-Klassen, die die DSL-Grammatik implementieren. Bitte beachten Sie, dass ich nicht annehme, dass die DSLs in diesem Artikel für die Überprüfung durch Wirtschaftsexperten geeignet sind. In diesem Artikel werde ich mich nur darauf konzentrieren, wie die Muster interner DSLs unsere Aufgaben als Entwickler erleichtern können, indem APIs hergestellt werden, die leichter zu lesen und zu schreiben sind. Ich habe das verschachtelte Verschlussmuster in diesem Fall aus mehreren Gründen verwendet. Die erste ist, dass der StructureMap-Container funktioniert, indem er die vollständige Konfiguration in einem Schritt übernimmt und dann Reflection.Emit verwendet, um dynamisch « Builder »-Objekte zu generieren, bevor der Container verwendet werden kann.

Wenn ich die Konfiguration durch einen verschachtelten Verschluss einnehme, kann ich die gesamte Konfiguration gleichzeitig erfassen und die Emittierung ruhig erledigen, bevor der Container für die Verwendung zur Verfügung gestellt wird. Der andere Grund ist, die Methoden zum Registrieren von Typen mit dem Container zur Konfigurationszeit von den Methoden zu trennen, die Sie zur Laufzeit zum Abrufen von Diensten verwenden würden (dies ist ein Beispiel für das Interface Segregation Principle, das « I » in S.O.L.I.D.). Wissen Sie, für die Konstruktion von Plain Old Java Objects ist das Builder-Muster eine Art DSL. Ich verwende ein Beispiel für dieses Muster in der StoryTeller-Benutzeroberfläche zum Definieren von Tastenkombinationen und dynamischen Menüs. Ich wollte eine schnelle programmgesteuerte Möglichkeit, eine Tastenkombination für eine Aktion in der Benutzeroberfläche zu definieren.