3

Ich spiele mit fließenden Interfaces im Stil von Martin Fowlers Text herum und frage mich, ob die Grammatik, die sie beschreiben, kontextfrei oder regelmäßig ist? Ich spreche über Schnittstellen wie folgt:Werden fließende Schnittstellen durch kontextfreie oder reguläre Grammatiken beschrieben?

var car = new Car(); 
car.Configure().MakeCar.With.Wheels(4).And.Engine.Using.Petrol; 

Was ich versuche zu tun, ist ein Programm schreiben, die sie generieren können. Momentan erfordert es eine Eingabe einer kontextfreien Grammatik, aber ich habe Schwierigkeiten, diese in eine Quellcodeanwendung umzuwandeln. Ich vermute, dass die Antwort ist, dass ich nur für reguläre Grammatiken erreichen kann, da der Zustand des "Stapels" nicht bekannt sein kann, da das Ergebnis jeder "terminalen" Methode vorher bekannt sein muss.

Was ich jetzt habe funktioniert, aber es auf bestimmte Grammatiken Fehler.

Edit: Ich ging mit regulären Grammatiken, der Code ist Open Source und funktioniert jetzt, wenn jemand daran interessiert ist, damit herumspielen. https://github.com/Dervall/Snout

+0

Es sollte Eigenschaften in C# als Beispielsprache sein. – Dervall

+0

In der Tat, mein Fehler. Ich vermisste die 'var' und nahm aufgrund der Fowler-Erwähnung Java an. BTW, nette Idee, dies aus CFGs zu generieren! –

+0

Das ist zumindest die Idee, aber ich denke, wir müssen uns mit regulären Grammatiken begnügen, oder ich schreibe Buggy-Code. :) – Dervall

Antwort

2

Die Optionen zu einem beliebigen Punkt werden durch die Methoden bestimmt, die zu diesem Zeitpunkt in der Klasse verfügbar sind. Die von dieser Methode zurückgegebene Klasse bestimmt die nächste Gruppe von Methoden.

so die Regeln für die Grammatik, die die Kette erzeugt ein right regular grammar wo die Startsymbole Klassen sind, die Symbole sind Verfahren, und die nicht-Terminals sind die Klassen, die durch die Verfahren zurückgegeben:

class Car: 
    configure: Configurator 

class Configurator: 
    with: Configurator // noise method 
    and: Configurator // noise method 
    wheels: int -> Configurator 
    windows: int -> WindowDetails 

class WindowDetails: 
    transparent -> Configurator 
    tinted -> Configurator 

ignorierend die Methode args (int):

Car -> "configure" Configurator 
Configurator -> "with" Configurator 
Configurator -> "and" Configurator 
Configurator -> "wheels" Configurator 
Configurator -> "windows" WindowDetails 
WindowDetails -> "transparent" Configurator 
WindowDetails -> "tinted" Configurator 

aber, was diese zu erfassen versagt ist das Argument auf die Räder (die Anzahl der Räder). und eine regelmäßige Grammatik nicht umgehen kann, dass da verschiedene Integer-Argumente zu verschiedenen Klassen führen könnten (zB nach „(2)“ haben Sie einen Konfigurator oder einen WindowDetails haben?):

Configurator -> "wheels" Integer 
Configurator -> "windows" Integer 
Integer -> ? 

so kommt es, was Sie wollen . Die Kette von Methoden kann durch eine reguläre Grammatik beschrieben werden. aber eine reguläre Grammatik kann auch nicht die Argumente beschreiben, die an die Methoden übergeben werden. Fehler.

Sie können Argumente behandeln, indem die Komplexität von kontextfreien Grammatiken Zugabe, denn dann können Sie so etwas wie tun:

Configurator -> "wheels" Integer Configurator 
Configurator -> "windows" Integer WindowDetails 

, die die zusätzlichen Informationen hat benötigt korrekt nach dem Integer-Argument, um fortzufahren.

HINWEIS: Das oben genannte Verfahren geht davon aus, dass Methodennamen in allen Klassen eindeutig sind. Wenn Sie zwei verschiedene Klassen mit demselben Methodennamen haben, dann werden Sie offensichtlich (hoffentlich) Probleme haben (und das ist vielleicht nicht so selten, wenn Sie Dinge wie "mit" und "und" verwenden ....)

+0

Mir geht es gut mit den Argumenten nicht behandelt werden, können sie nicht, da wir kompilieren müssen, welche Klasse zurückgegeben wird, um die nächste Reihe von Optionen zu präsentieren. Aber was Sie sagen, ist, dass die Klasse von Grammatiken ** reguläre ** Grammatiken statt von ** kontextfreiem ** ist, richtig? – Dervall

+0

oben verwendet normale Grammatiken. Ich sehe keine Notwendigkeit für kontextfreie Grammatiken in einer einfachen Methodenkette. Sie würden benötigt, um mit den Argumenten umzugehen (zur Vereinfachung, aber alles mit eckigen Klammern neigt dazu, kontextfrei zu implizieren, denn sobald die Klammern geschlossen sind, müssen Sie zu dem zurückkehren, was Sie vorher gemacht haben). also ja". siehe Aktualisierung. –

+0

aber bitte beachten Sie Anmerkung über eindeutige Methodennamen ... –

Verwandte Themen