Geben Sie einen sicheren Weg ein, um Werte aus einer Skriptsprache in C # zurückzugeben.

8

Ich habe an einer kleinen mathematischen Skript-Engine (oder DSL, wenn Sie das bevorzugen) gearbeitet. Mach es zum Spaß, es ist nichts ernstes. In jedem Fall ist eines der Features, die ich möchte, die Möglichkeit, Ergebnisse auf typsichere Weise zu erhalten. Das Problem ist, dass es 5 verschiedene Typen gibt, die es zurückgeben kann.

Number, bool, Fun, FunN und NamedValue. Es gibt auch AnyFun, eine abstrakte Basisklasse für Fun und FunN. Der Unterschied zwischen Fun und FunN ist, dass Fun nur ein Argument benötigt, während FunN mehr als ein Argument benötigt. Es stellte sich heraus, dass es mit einem Argument genug war, um einen separaten Typ zu rechtfertigen (könnte falsch sein).

Im Moment verwende ich einen Wrapper-Typ namens Result und eine Klasse namens Matcher, um dies zu erreichen (inspiriert durch Mustervergleich in Sprachen wie F # und Haskell). Es sieht grundsätzlich so aus, wenn Sie es benutzen.

%Vor%

Dies ist meine aktuelle Implementierung. Es ist jedoch starr. Das Hinzufügen neuer Typen ist ziemlich mühsam.

%Vor%

Die Sache ist, dass ich mehr Typen hinzufügen möchte. Ich möchte so Funktionen machen kann Zahlen und Boole zurückgeben und Fun to Fun & lt; T & gt ;, wobei T der Rückgabetyp ist. Hier liegt das Hauptproblem. Ich habe AnyFun, Fun, FunN, und nach Einführung dieser Änderung würde ich AnyFun, Fun & lt; Nummer & gt;, Spaß & lt; bool & gt;, FunN & lt; Nummer & gt;, FunN & lt; bool & gt ;. Und selbst dann würde ich wollen, dass es AnyFun mit jeder Funktion abgleicht, die nicht selbst passt. So:

%Vor%

Hat jemand Vorschläge für eine bessere Implementierung, die das Hinzufügen neuer Typen besser behandelt? Oder gibt es noch weitere Vorschläge, wie das Ergebnis typsicher zu bekommen ist? Außerdem, sollte ich eine gemeinsame Basisklasse für alle Rückgabetypen haben (und einen neuen Typ für bool hinzufügen)?

Leistung ist kein Problem, übrigens.

Pass auf dich auf, Kerr

BEARBEITEN:

Nachdem ich das Feedback gelesen habe, habe ich stattdessen diese Matcher-Klasse erstellt.

%Vor%

Es ist kürzer, aber die Reihenfolge der Fälle ist wichtig. In diesem Fall wird die Fun-Option beispielsweise niemals ausgeführt.

%Vor%

Aber es wird, wenn Sie Orte wechseln.

%Vor%

Ist es möglich, das zu verbessern? Gibt es noch andere Probleme mit meinem Code?

EDIT 2:

Gelöst es: D.

    
Kerr 16.07.2013, 18:06
quelle

2 Antworten

2

Ihr Matcher könnte unbegrenzte Arten handhaben, indem er etwas wie folgt macht:

%Vor%

Ich glaube, du brauchst eigentlich keine Liste, es sei denn, dein Result hat bis später keinen Value . Ich verstehe Ihr Objektmodell nicht ganz, aber wenn der Typ des Ergebnisses bekannt ist, dann verwenden Sie keine Liste und führen Sie den Typentest sofort durch.

    
default.kramer 16.07.2013, 18:42
quelle
0

Wenn Sie immer ein DSL-Ergebnis auf die gleiche Weise behandeln möchten

Wenn Sie ein Ergebnis immer auf die gleiche Weise behandeln möchten (z. B. wenn Sie immer einen bestimmten Typ von DSL-Objekt auf die gleiche Weise konvertieren / anpassen möchten), empfehle ich, ein oder mehrere Wörterbücher zu verwenden, in denen Sie Adapterdelegaten platzieren so .

Ich weiß nicht genau, wie Sie Ihre Anwendung erweitern wollen, aber es scheint mir, als wäre es in Ihrem Fall eine gute Idee, für jeden Rückgabetyp ein separates Wörterbuch zu haben und sie alle null oder einen Eingabeparameter zu haben. (Anstatt mehrere Parameter zu verwenden, wickeln Sie einfach die DSL-Parameter ein, die Sie in ein einzelnes Objekt zurückgeben möchten.)

Ein Beispiel:

%Vor%

Wenn Sie ein DSL-Ergebnis anders behandeln möchten

Wenn Sie ein DSL-Ergebnis in Ihrem Code anders behandeln möchten, empfehle ich die Verwendung des TypeS mit hier . TypeSwitch ist einfach ein einfacherer Weg als die Verwendung mehrerer if / else-Anweisungen und Castings. Mit dieser Methode können Sie die Logik angeben, in der Sie sie verwenden. Sie sind also nicht auf die Logik beschränkt, die Sie in die Wörterbücher eingeben. (TypeSwitch kann leicht modifiziert werden, um eine Erweiterungsmethode zu werden, wenn Sie das bevorzugen).

Beispiel:

%Vor%     
lightbricko 16.07.2013 18:55
quelle

Tags und Links