Was unterscheidet ein Ruby DSL von einer normalen API?

7

Was sind einige definierende Eigenschaften einer Ruby DSL, die sie von einer normalen API trennt?

    
jrhicks 12.10.2009, 23:45
quelle

6 Antworten

11

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.

  • Interne domänenspezifische Sprache ist in eine Programmiersprache (z. B. Ruby) eingebettet. Es ist einfach zu implementieren, aber die Struktur der DSL hängt von der übergeordneten Sprache ab, in die sie eingebettet ist.
  • Externe domänenspezifische Sprache ist eine separate Sprache, die für die jeweilige Domäne entwickelt wurde. Es gibt Ihnen eine größere Flexibilität in Bezug auf die Syntax, aber Sie müssen den Code implementieren, um ihn zu interpretieren. Es ist auch sicherer, da die Person, die Domänenregeln bearbeitet, nicht auf alle Möglichkeiten der übergeordneten Sprache zugreifen kann.
Adam Byrtek 19.10.2009, 09:45
quelle
4

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.

    
cdiggins 12.10.2009 23:53
quelle
2

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.

    
DigitalRoss 13.10.2009 00:01
quelle
2

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.

    
Sarah Mei 13.10.2009 01:53
quelle
1

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.

    
Lolindrath 19.10.2009 11:48
quelle
1

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.).

    
edebill 19.10.2009 16:21
quelle

Tags und Links