2009-03-27 2 views
0

Ich arbeite an einem Projekt, das eine komplizierte Analyse einiger vom Benutzer bereitgestellter Eingaben durchführen wird. Es werden 3 Teile des Codes sein:Komplizierter Algorithmus - Wie speichert man Regeln getrennt vom Verarbeitungscode?

1) Eingaben durch den Benutzer geliefert, wie Schlüsselwörter

2) Die Regeln, wie wenn Schlüsselwort 1 wiederholt wird 3-mal in Stichworten 5, dies zu tun, usw.

3) Und die Analyse selbst, die die Regeln ausführt und verarbeitet die Benutzereingabe und generiert die Ausgabe auf der Grundlage der Verarbeitung erforderlich.

Natürlich wird dies zu viel Spaghetti-Code und vielen, vielen if-Anweisungen im Verarbeitungscode führen. Ich möchte das vermeiden und die Regeln (d. H. Die if-Anweisungen) getrennt von dem Code halten, der die Benutzereingabe durchläuft und die Ausgabe erzeugt.

Wie kann ich das tun, d. H. Was ist der beste Weg?

Antwort

2

Wenn Sie genug Regeln, die Sie externalisieren wollen, könnten Sie versuchen, ein Geschäftsregeln Engines, wie Drools in Java.

Eine Business Rules Engine ist ein Softwaresystem, das eine oder mehrere Geschäftsregeln in einer Laufzeitproduktionsumgebung ausführt. Die Regeln könnten aus gesetzlichen Regelungen stammen ("Ein Mitarbeiter kann aus irgendeinem Grund oder ohne Grund entlassen werden, aber nicht aus einem illegalen Grund"), Unternehmensrichtlinie ("Alle Kunden, die mehr als 100 US-Dollar ausgeben, erhalten 10% Rabatt")) oder andere Quellen. (Wikipedia)

Je nach dem, was Sie versuchen, könnte es ein wenig Overhead sein. In meiner Firma verwenden wir solche Werkzeuge für unser Qualitätsanalyse-Tool.

1

Speichern Sie es in XML. Einfach zu parsen und zu aktualisieren.

Ich hatte einen Code-Generator entwickelt, der aus einer XML-Datei gesteuert werden kann. Für jeden Befehl hatte ich einen Eintrag in der XML. Ich habe den Knoten verarbeitet, um den Opcode für diesen Befehl zu generieren. Der Knoten selbst enthält die Aktionen, die ich ausführen muss, um den Opcode zu erhalten. Für einige Befehle musste ich in die Datenbank schauen, all diese Dinge, die ich in diese XML-Datei gesteckt hatte.

0

Sie können Factory immer implementieren, die bestimmte Strategien nach übergebenen Parametern erstellt. Und dann werden Sie diese Strategien in Ihrem Code ohne Wenn verwenden.

0

Hinzufügen einer eingebetteten Skriptsprache zu Ihrer Anwendung könnte helfen. Die Regeln würden dann in Skripten ausgedrückt, die von den Anwendungen bei der Verarbeitung ausgeführt werden.

Die Idee ist, dass Skripte einfach zu ändern sind und High-Level-Logik enthalten, die von Ihrer Anwendung im Detail ausgeführt werden.

Es gibt eine Menge von Skriptsprachen zur Verfügung, dies zu tun: lua, Python, Falcon, Eichhörnchen, Angelscript usw.

0

Wenn es nur Schlüsselwörter, einen endlichen Automaten oder ähnliches erkennt. Wenn es mehr tut, dann andere Pattern-Matching-Systeme, wie zum Beispiel Regel-Engines.

1

Nun, ich bezweifle, dass es notwendig ist, hughe if-Anweisungen zu haben, wenn Polymorphie korrekt angewendet wird.

Eigentlich benötigen Sie ein korrektes Domänenmodell für Ihre Regeln. Dies geht irgendwie in die Richtung des Befehlsmusters, abhängig von der Komplexität Ihres Codes, möglicherweise in Verbindung mit dem Zustandsautomatenmuster.

Sobald Sie Ihr Modell haben, werden sie durch die Definition von Regeln korrekt instanziiert.

Dies könnte durch eine XML-Definition erfolgen, die analysiert und in Ihr Modell transformiert wird. Aber der neue moderne und noch schickere Weg wäre die Verwendung von DSLs. Wenn Sie in Java programmieren und eine gewisse Freiheit in Bezug auf Ihre Bibliotheken haben, wäre dies ein geeigneter Anwendungsfall für Embedded DSLs with Groovy. Im Grunde benötigen Sie einen Builder, der Ihr Modell erstellt, das ist alles.

0

Schauen Sie sich rule engines an!

Der Ansatz von Lars kann auch strittig sein.