Question

J'ai une application où, pour chaque objet, l'utilisateur peut spécifier ses propres points de mesure. Les valeurs de ces mesures seront ensuite utilisées pour classer l’objet dans les catégories suivantes: service A à besoin, service B à planifier dans un délai de X jours, C ATM sans service requis

Cependant, ces objets peuvent être presque n'importe quoi et il n’ya aucun moyen de coder en dur la façon dont les valeurs mesurées doivent être agrégées dans une classification, nous devons laisser cela à l’utilisateur.

Avez-vous des suggestions sur la manière dont nous pouvons fournir à l’utilisateur un moyen de saisir ses propres formules à cet effet? Il n’est pas nécessaire que ce soit infaillible, nous n’avons que peu de clients pour pouvoir les aider dans la mesure où ils peuvent nous les expliquer.

Était-ce utile?

La solution

évaluateur d'expressions Flee

Vous pouvez donner aux utilisateurs une liste de variables valides à utiliser et leur permettre de créer leurs propres expressions. Vous feriez alors passer toutes les expressions, noms de variables et valeurs à Flee, ce qui résoudrait toutes les expressions en une valeur ou vrai / faux.

Autres conseils

Votre situation est idéale pour une langue spécifique à un domaine. Un DSL vous permettrait de spécifier une grammaire autorisée pour votre "langage de formule". puis fournissez un retour à l'utilisateur et calculez le résultat.

Antlr est un très bon outil pour cela. C'est un générateur d'analyseur syntaxique / lexar. Fondamentalement, vous spécifiez la grammaire dans la propre DSL de description d’Antlr, qui génère des lexeurs et des analyseurs syntaxiques robustes dans la langue de votre choix.

Par exemple, si votre langue permet des calculs simples, voici comment cela serait spécifié dans la langue d'antlr (à partir du wiki d'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' ;

Pour en savoir plus sur les DSL en général, ici .

SpreadsheetGear pour .NET pourrait être un bon choix. SpreadsheetGear accepte et calcule des formules dans le langage que la plupart des utilisateurs connaissent déjà - Excel. SpreadsheetGear inclut un contrôle de feuille de calcul Windows Forms. Vous pouvez également l’utiliser comme bibliothèque si vous utilisez ASP.NET ou un service Web.

Vous pouvez voir de simples exemples de calcul ASP.NET ici , ou télécharger l'essai gratuit ici si vous souhaitez essayer le contrôle WinForms.

Clause de non-responsabilité: je possède SpreadsheetGear LLC

J'ai écrit un projet open source, Expresso dynamique , permettant de convertir une expression texte écrite à l'aide d'un Syntaxe C # en délégués (ou arbre d’expression). Les expressions sont analysées et transformées en arbres d'expression sans utiliser la compilation ou la réflexion.

Vous pouvez écrire quelque chose comme:

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

ou

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

Mon travail est basé sur l'article de Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx .

Vous devez utiliser les expressions .NET 3.5, dans System.Linq.Expressions. Scott Gu a fourni une API d’expression dynamique qui vous permet d’évaluer les chaînes pour les transformer en arborescences d’expressions, qui peuvent ensuite être évaluées par code pour examiner le contenu de l’expression ou compilées pour exécution.

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

Vous mentionnez que les objets peuvent être "presque n'importe quoi". Les points de mesure peuvent-ils aussi être presque n'importe quoi? Vraisemblablement, les mesures seraient limitées à des propriétés définies de l'objet en question, auquel cas vous pourriez probablement exposer un éditeur de type assistant qui permettrait à l'utilisateur d'effectuer des calculs en fonction des propriétés de l'objet découvertes par réflexion. Le problème, c’est que vous avez tendance à appliquer 3 points de terminaison pour la mesure au lieu de 1 à N états.

Une dernière suggestion, je pense que pour une flexibilité suffisante, vous aurez besoin d’un modèle d’objet de mesure indépendant se liant aux objets que vous souhaitez mesurer.

Dans quelle mesure est-il important pour vous d'appliquer l'exclusivité sur les mesures? Protéger l'utilisateur de la définition d'états superposés constituera peut-être l'élément le plus difficile, car, d'après votre description, il semblerait que des mesures totalement différentes valent pour être rattachées à différents états.

Aussi, savez-vous comment vous allez interroger les objets pour calculer les mesures et définir leur état?

Désolé de parler de manière aussi générale, mais pour le moment, votre question est assez générale. Bonne chance.

L’utilisateur peut-il utiliser sa connaissance de l’objet et décider simplement dans quelle catégorie le mettre quand il l’entre dans le système? Nous avons besoin de plus d'informations, mais si l'utilisateur peut définir quels points de mesure déterminent quelle catégorie, ne pourrait-il pas simplement choisir la catégorie?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top