Frage

Ein C ++ Regeln-Engine definiert Regeln in XML, wobei jede Regel nach unten läuft darauf hinaus, „wenn X, Y“, wobei X eine Reihe von Tests und Y eine Reihe von Aktionen. In C ++ Code, ‚Funktionen‘ verwendbar in Tests / Aktionen werden als eine Klasse für jede ‚Funktion‘ erstellt, die jeweils ein „run (args)“ mit Methode ... jeder hat seinen eigenen Satz von Parametern.

Das funktioniert gut.

Aber, ein separates Werkzeug will Benutzer von Hand Crafting XML speichern; die Regeln Motor bei Nicht-Programmierer richtet. Die Werkzeug Bedürfnisse kennen alle ‚Funktionen‘ zur Verfügung, sowie deren erforderlichen Eingabeparameter. Was ist der beste Weg, dies zu berücksichtigen tun? Ich hielt ein paar Möglichkeiten:

  1. Eine Konfigurationsdatei beschreibt die ‚Funktionen‘ und deren Parameter und wird durch das Werkzeug zu lesen. Dies ist sehr einfach, und der tatsächliche C ++ Code kann es Argumentüberprüfung durchführen verwenden, aber immer noch die C ++ und XML sind nicht synchron sein garantiert - ein Programmierer könnte C ändern ++ und vergessen Sie die XML, die zu Validierungs Fehlern zu aktualisieren
  2. Jede ‚Funktion‘ Klasse verfügt über Methoden, die sie beschreiben. Irgendwie ist das Werkzeug lädt die C ++ Klassen ... das wäre einfach, in einer Sprache unterstützt Reflexion, sondern messier in C ++, wahrscheinlich würden Sie eine spezielle DLL mit allen ‚Funktionen‘ oder etwas zu bauen. Das bedeutet zusätzlichen Aufwand.

Was Sinn macht, speziell die Art von C ++ gegeben?

EDIT: ist der Titel beschreibend? Ich kann nicht denken Sie an eine bessere.

War es hilfreich?

Lösung

Es gibt einen dritten Weg - IDL.

Stellen Sie eine Client-Server-Anwendung, und Sie haben einen Code-Generator, die Wrapper-Klassen erzeugt, dass Sie auf Client und Server bereitstellen können, damit der Benutzer eine App, den Client-API schreiben kann und die Verarbeitung erfolgt auf dem Server .. . dies ein typisches Szenario RPC ist und in DCE-RPC, ONC-RPC, CORBA, COM und andere.

verwendet

Der Trick hier ist die Signaturen der Methoden zur Definition der Client aufrufen kann, die in einem Interface Definition Language erfolgt. Dies muss nicht schwierig sein, aber es ist die Quelle für die Client / Server-API, Sie führen Sie es durch einen Generator und erzeugt die C ++ Klassen, die Sie für den Client zu verwenden kompilieren werden.

In Ihrem Fall, es klingt wie das XML die IDL ist. so können Sie ein Tool erstellen, die XML und erzeugt die C ++ Header beschreibt die Funktionen, die Ihr Code Exposes nimmt. Sie müssen nicht wirklich die CPP-Dateien erzeugen (man konnte), aber seine einfacher, nur die Kopfzeilen erzeugen, so dass der Programmierer, der eine neue Funktion hinzufügt / Parameter kann nicht vergessen, die Implementierung zu aktualisieren - es wird einfach nicht einmal die Header kompilieren wurden neu generiert.

Sie können einen Header generieren, die in den vorhandenen c ++ Header #include wird, wenn es mehr gibt als nur die Funktionsdefinitionen ist.

.

Also - das ist mein Vorschlag, # 3: die Definitionen von Ihren endgültigen XML-Signaturen erzeugt

Andere Tipps

Es gibt eine andere Art und Weise:

  • Fügen Sie eine Einschränkung, dass die Argumenttypen einheitlich in einem Funktionsaufruf sein.
  • definiert einige maximale Anzahl von Argumenten
  • beschreiben die Typen und die Priorität d double converrts zu String aber nicht umgekehrt

dann haben Sie

void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) .. 

Und andere konkrete Datentypen wie String, Datum, usw.

Vorteile:

  • Variationen in Unterschrift feste und regelmäßige
  • ist es möglich, nur, um die „größte“ Art Signatur (T)
  • funktioniert gut mit Vorlagen und Sprechen Brücken
  • kann warnen Aktion f mit 2 Integer-Parameter nicht definiert
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top