Domanda

Ho un'applicazione in cui per ogni oggetto l'utente può specificare i propri punti di misura. I valori di queste misurazioni verranno quindi utilizzati per classificare l'oggetto come ad es. A - necessita di servizio, B - servizio deve essere programmato entro X giorni, C - nessun servizio necessario ATM

Tuttavia questi oggetti possono essere praticamente qualsiasi cosa e non è possibile codificare in modo rigido come i valori misurati dovrebbero essere aggregati in una classificazione, dobbiamo lasciarli all'utente.

Hai qualche suggerimento su come possiamo fornire all'utente la possibilità di inserire le sue formule per questo? Non deve essere a prova di idiota, non abbiamo così tanti clienti in modo da poterli assistere finché possono spiegarcelo.

È stato utile?

Soluzione

Valutatore di espressioni di fuga

Potresti dare agli utenti un elenco di variabili valide da usare e far loro trovare le loro espressioni. Passeresti quindi tutte le espressioni, i nomi delle variabili e i valori a Fuggi e risolverà tutte le espressioni su un valore o vero / falso.

Altri suggerimenti

La tua situazione è il caso perfetto per una lingua specifica del dominio. Un DSL ti consentirebbe di specificare una grammatica consentita per il tuo "linguaggio di formula" e quindi fornire feedback all'utente e calcolare il risultato.

Antlr è un ottimo strumento per questo. È un generatore parser / lexar. Fondamentalmente si specifica la grammatica nella descrizione DSL di Antlr, e genera robusti lexer e parser per te nella tua lingua preferita.

Ad esempio, se la tua lingua consente calcoli semplici, è così che verrebbe specificato nel linguaggio di antlr (dal wiki di antlr):

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' ;

Puoi trovare ulteriori informazioni sui DSL in generale qui .

SpreadsheetGear for .NET potrebbe essere una buona scelta. SpreadsheetGear accetta e calcola le formule nella lingua che molti utenti già conoscono: Excel. SpreadsheetGear include un controllo del foglio di calcolo di Windows Form oppure puoi usarlo come libreria se stai eseguendo ASP.NET o un servizio web.

Puoi vedere semplici esempi di calcolo ASP.NET qui , oppure scaricare la prova gratuita qui se vuoi provare il controllo WinForms.

Disclaimer: possiedo SpreadsheetGear LLC

Ho scritto un progetto open source, Dynamic Expresso , che può convertire espressioni di testo scritte usando un Sintassi C # in delegati (o albero delle espressioni). Le espressioni vengono analizzate e trasformate in Alberi delle espressioni senza utilizzare la compilazione o la riflessione.

Puoi scrivere qualcosa del tipo:

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

o

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);

Il mio lavoro si basa sull'articolo di Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx .

Dovresti usare .NET 3.5 Expressions, in System.Linq.Expressions. Scott Gu ha fornito un'API Dynamic Expression che consente di valutare le stringhe per trasformarle in alberi delle espressioni, che possono quindi essere valutate tramite codice per esaminare il contenuto dell'espressione o compilate per l'esecuzione.

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

Dici che gli oggetti possono essere "quasi tutto". I punti di misura possono anche essere quasi qualsiasi cosa? Presumibilmente le misurazioni sarebbero limitate a proprietà definite dell'oggetto in questione, nel qual caso si potrebbe presumibilmente esporre un editor simile a un wizard che consentirebbe all'utente di eseguire calcoli basati sulle proprietà dell'oggetto scoperte tramite la riflessione. Una cosa che hai scelto per limitare il problema è che stai imponendo 3 endpoint per la misurazione anziché da 1 a N stati.

Un ultimo suggerimento, penso che per una flessibilità sufficiente avrai bisogno di un modello di oggetti di misura indipendente che si leghi agli oggetti che desideri misurare.

Quanto è importante per te applicare l'esclusività sulle misurazioni? Proteggere l'utente dalla definizione di stati sovrapposti sarà forse il pezzo più difficile di questo, poiché dalla tua descrizione sembrerebbe che misure completamente diverse siano valide per essere attaccate a stati diversi.

Sai anche come eseguirai il polling degli oggetti per calcolare le misure per definire lo stato degli oggetti?

Mi dispiace parlare così in generale, ma davvero a questo punto la tua domanda è piuttosto generale. Buona fortuna.

L'utente può usare la sua conoscenza dell'oggetto e decidere semplicemente in quale categoria inserirlo quando lo inserisce nel sistema? Immagino che abbiamo bisogno di maggiori informazioni ma se l'utente può definire quali punti di misurazione determinano quale categoria, non possono semplicemente scegliere la categoria?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top