Wenn Sie eine API verwenden, instanzieren Sie Objekte und Aufrufmethoden auf zwingende Weise. Auf der anderen Seite sollte eine gute DSL deklarativ sein und Regeln und Beziehungen in Ihrer Problemdomäne repräsentieren, nicht Anweisungen, die ausgeführt werden müssen. Außerdem sollte DSL idealerweise von jemandem lesbar und modifizierbar sein, der kein Programmierer ist (was bei APIs nicht der Fall ist).
Bitte beachten Sie auch die Unterscheidung zwischen internen und externen DSLs.
DSL (domänenspezifische Sprache) ist ein überhypter Begriff. Wenn Sie nur eine Untergruppe einer Sprache verwenden (sagen Ruby), wie ist es eine andere Sprache als das Original? Die Antwort ist, ist es nicht.
Wenn Sie jedoch eine Vorverarbeitung des Quelltexts durchführen, um eine neue Syntax oder eine neue Semantik einzuführen, die in der Kernsprache nicht gefunden wird, haben Sie tatsächlich eine neue Sprache, die möglicherweise domänenspezifisch ist.
Die Kombination von Ruby's Poesie-Modus und Operator-Überladung bietet die Möglichkeit, etwas zu haben, das gleichzeitig legale Ruby-Syntax und eine vernünftige DSL-Lösung ist.
Und die anhaltende Erschwerung, dass XML ist, zeigt, dass vielleicht die einfache DSL, die in all diesen Konfigurationsdateien eingebaut wurde, nicht völlig fehlgeleitet war.
Erstellen einer DSL:
Hinzufügen neuer Methoden zur Object-Klasse, so dass Sie sie einfach aufrufen können, als wären sie integrierte Sprachkonstrukte. (siehe Rake)
Erstellen von Methoden für ein benutzerdefiniertes Objekt oder eine Gruppe von Objekten und anschließende Skriptdateien führen die Anweisungen im Kontext eines übergeordneten Objekts aus. (siehe capistrano)
API-Design:
Erstellen von Methoden für ein benutzerdefiniertes Objekt oder eine Gruppe von Objekten, sodass der Benutzer ein Objekt für die Verwendung der Methoden erstellt.
Erstellen von Methoden als Klassenmethoden, damit der Benutzer den Klassennamen vor allen Methoden vorstellt.
Erstellen von Methoden als eine Mischung, die Benutzer einschließen oder erweitern, um die Methoden in ihren benutzerdefinierten Objekten zu verwenden.
Also, die Linie ist dünn zwischen ihnen. Es ist trivial, einen benutzerdefinierten Satz von Objekten in eine DSL umzuwandeln, indem eine Methode hinzugefügt wird, die eine Skriptdatei im richtigen Kontext ausführt.
Der Unterschied zwischen einer DSL und einer API besteht darin, dass eine DSL zumindest verstanden (und verifiziert) werden kann, wenn sie nicht von jemanden in dieser Domäne als Subsprache von Ruby geschrieben wird.
Zum Beispiel könnten Sie Finanzanalysten schreiben Regeln für eine Aktienhandelsanwendung in einem Ruby DSL und sie würden nie wissen müssen, dass sie Ruby verwenden.
Sie sind in der Tat das Gleiche. DSLs werden in der Regel über die normalen Sprachmechanismen in Ruby implementiert, also sind sie technisch gesehen alle APIs.
Damit die Leute jedoch etwas als DSL erkennen können, fügt es normalerweise vorhandenen deklarativen Anweisungen hinzu. So etwas wie die Validatoren und Beziehungserklärungen in ActiveRecord.
%Vor%sieht wie ein DSL aus, während das folgende nicht:
%Vor%Sie werden beide mit normalem Ruby-Code implementiert. Es sieht nur so aus, als hättest du coole neue Sprachkonstrukte, während der andere eher fussläufig wirkt (und viel zu ausführlich usw.).
Tags und Links ruby design-patterns dsl