Frage

Ich habe eine Anwendung, bei der für jeden der Benutzer das Objekt seine eigene measurepoints angeben. Die Werte von theese Messungen werden dann verwendet werden, um das Objekt zu klassifizieren, wie ich eine E - Service benötigt, B - Service soll innerhalb von X Tagen, C geplant werden - kein Service erforderlich ATM

Allerdings theese Objekte können fast alles sein, und es gibt keinen Weg, wir hart Code, wie die Messwerte sollten zu einer Einstufung aggregiert werden, müssen wir, dass für den Benutzer lassen.

Haben Sie irgendwelche Vorschläge, wie wir einen Weg für den Benutzer seine eigenen Formeln für diese Eingabe zur Verfügung stellen kann? Es ist nicht idiotensicher sein müssen, haben wir nicht, dass viele Kunden, damit wir sie so lange unterstützen, wie sie es uns erklären kann.

War es hilfreich?

Lösung

Ausdrucksauswerter Flee

Sie können den Benutzern eine Liste von Variablen geben, die gültig sind zu verwenden, und lassen Sie sie mit ihrem eigenen Ausdrücke kommen. Sie würden dann alle Ausdrücke, Variablennamen und Werte übergeben zu fliehen, und es würde alle Ausdrücke auf einen Wert oder wahr / falsch lösen.

Andere Tipps

Ihre Situation ist ein perfektes Beispiel für eine domänenspezifische Sprache. Ein DSL Sie erlauben würde, eine zulässige Grammatik für Ihre „Formelsprache“ zu spezifizieren und dann Rückmeldung, den Benutzer bereitstellen und das Ergebnis zu berechnen.

Antlr ist ein sehr gutes Werkzeug. Es ist ein Parser / lexar Generator. Grundsätzlich geben Sie die Grammatik in Antlr eigene Beschreibung DSL, und es erzeugt robust lexers und Parser für Sie in der Sprache Ihrer Wahl.

Zum Beispiel, wenn Ihre Sprache einfache Berechnungen ermöglicht es dies ist, wie es in antlr Sprache angegeben werden würde (von antlr Wiki):

grammar SimpleCalc;

options {
    language=CSharp2;
}

tokens {
    PLUS    = '+' ;
    MINUS   = '-' ;
    MULT    = '*' ;
    DIV = '/' ;
}

@members {
    public static void Main(string[] args) {
        SimpleCalcLexer lex = new SimpleCalcLexer(new ANTLRFileStream(args[0]));
        CommonTokenStream tokens = new CommonTokenStream(lex);

        SimpleCalcParser parser = new SimpleCalcParser(tokens);

        try {
            parser.expr();
        } catch (RecognitionException e)  {
            Console.Error.WriteLine(e.StackTrace);
        }
    }
}

/*------------------------------------------------------------------
 * PARSER RULES
 *------------------------------------------------------------------*/

expr    : term ( ( PLUS | MINUS )  term )* ;

term    : factor ( ( MULT | DIV ) factor )* ;

factor  : NUMBER ;


/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

NUMBER  : (DIGIT)+ ;

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

fragment DIGIT  : '0'..'9' ;

Sie können mehr über DSLs im allgemeinen hier .

SpreadsheetGear for .NET könnte eine gute Wahl sein. SpreadsheetGear akzeptiert und berechnet Formeln in der Sprache der meisten Anwender bereits kennen - Excel. SpreadsheetGear enthält eine Windows Forms-Spreadsheet-Steuerelement, oder Sie können es als eine Bibliothek verwenden, wenn Sie ASP.NET oder einen Web-Service tun.

Sie sehen einfach ASP.NET Berechnung Proben hier oder herunterladen die kostenlose Testversion hier , wenn Sie die WinForms Kontrolle versuchen.

Disclaimer: Ich besitze SpreadsheetGear LLC

Ich habe ein Open-Source-Projekt geschrieben, Dynamische Expresso , dass Textausdruck umwandeln kann mit einem schriftlichen C # Syntax in Teilnehmer (oder Ausdrucksbaum). Ausdrücke werden analysiert und umgewandelt in Expression Trees ohne Kompilierung oder Reflexion verwendet wird.

Sie können so etwas wie schreiben:

var interpreter = new Interpreter();
var result = interpreter.Eval("8 / 2 + 2");

oder

var interpreter = new Interpreter()
                .SetVariable("service", new ServiceExample());

string expression = "x > 4 ? service.SomeMethod() : service.AnotherMethod()";

Lambda parsedExpression = interpreter.Parse(expression, 
                        new Parameter("x", typeof(int)));

parsedExpression.Invoke(5);

Meine Arbeit basiert auf Scott Gu Artikel http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- abfrage library.aspx .

Sie sollten .NET 3.5 Ausdrücke, in System.Linq.Expressions verwenden. Scott Gu hat einen dynamischen Ausdruck API zur Verfügung gestellt, die Sie Zeichenfolgen zu bewerten ermöglicht es ihnen, in den Ausdruck Bäume zu verwandeln, die dann entweder durch Code ausgewertet werden, um die Expression Inhalt oder zur Ausführung kompiliert zu untersuchen.

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Sie erwähnen die Objekte „fast alles“ sein kann. Können die Messpunkte auch fast alles? Vermutlich würden die Messungen an definierten Eigenschaften des Objekts in Frage beschränkt, in dem Fall, dass Sie vermutlich wie ein Assistenten Editor aussetzen könnten, die die Benutzer Berechnungen erlauben würde, auf Objekteigenschaften über Reflexion entdeckten auszuführen basieren. Eine Sache, die Sie haben für Sie durch gehen, das Problem begrenzende scheinen Sie 3 Endpunkte für die Messung werden die Durchsetzung anstelle von 1 bis N-Staaten.

Ein letzter Vorschlag, ich denke, für eine ausreichende Flexibilität benötigen Sie ein unabhängiges Messobjektmodell, das Sie auf die Objekte messen möchten bindet.

Wie wichtig ist es für Sie Exklusivität auf die Messungen durchzusetzen? Schutz des Anwenders von der Definition der überlappenden Staaten wird vielleicht das härteste Stück das geschehen, da aus Ihrer Beschreibung würde es sein, dass ganz andere Messungen gelten scheinen verschiedene Zustände zu befestigen.

Auch wissen Sie, wie Sie Polling werden die Objekte Messungen zu berechnen, die den Zustand der Objekte zu definieren?

Leider so im Allgemeinen zu sprechen, aber wirklich Ihre Frage an dieser Stelle ist ziemlich allgemein. Viel Glück.

Kann der Benutzer seine Kenntnisse über das Objekt verwendet und nur entscheiden, welche Kategorie es in setzen, wenn er es in das System eingibt? Ratet mal, wir weitere Informationen benötigen, aber wenn der Benutzer definieren kann, welche measurepoints bestimmen, welche Kategorie, konnten sie nicht wählen Sie einfach die Kategorie?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top