Pregunta

Tengo una aplicación donde para cada objeto el usuario puede especificar sus propios puntos de medida. Los valores de estas medidas se utilizarán para clasificar el objeto como i e A - necesita servicio, B - el servicio debe programarse dentro de X días, C - no se necesita servicio ATM

Sin embargo, estos objetos pueden ser casi cualquier cosa y no hay forma de que podamos codificar cómo se deben agregar los valores medidos a una clasificación, debemos dejar eso al usuario.

¿Tiene alguna sugerencia sobre cómo podemos proporcionar una manera para que el usuario ingrese sus propias fórmulas para esto? No tiene que ser a prueba de idiotas, no tenemos tantos clientes para poder ayudarlos siempre que nos lo expliquen.

¿Fue útil?

Solución

Evaluador de expresiones de fuga

Puede proporcionar a los usuarios una lista de variables que son válidas para usar y dejar que presenten sus propias expresiones. Luego pasaría todas las expresiones, nombres de variables y valores a Flee y resolvería todas las expresiones a un valor o verdadero / falso.

Otros consejos

Su situación es un caso perfecto para un idioma específico de dominio. Un DSL le permitiría especificar una gramática permitida para su " lenguaje de fórmulas " y luego proporcionar comentarios al usuario, así como calcular el resultado.

Antlr es una muy buena herramienta para esto. Es un generador de analizador / lexar. Básicamente, usted especifica la gramática en la descripción DSL de Antlr, y genera lexers y analizadores robustos para usted en el idioma que elija.

Por ejemplo, si su idioma permite cálculos simples, así es como se especificaría en el idioma de antlr (del wiki de 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' ;

Puede obtener más información sobre DSL en general aquí .

SpreadsheetGear para .NET podría ser una buena opción. SpreadsheetGear acepta y calcula fórmulas en el idioma que la mayoría de los usuarios ya conocen: Excel. SpreadsheetGear incluye un control de hoja de cálculo de formularios Windows Forms, o puede usarlo como una biblioteca si está utilizando ASP.NET o un servicio web.

Puede ver ejemplos simples de cálculo de ASP.NET aquí , o descargue la prueba gratuita aquí si desea probar el control WinForms.

Descargo de responsabilidad: soy dueño de SpreadsheetGear LLC

He escrito un proyecto de código abierto, Dynamic Expresso , que puede convertir la expresión de texto escrita usando un Sintaxis de C # en delegados (o árbol de expresión). Las expresiones se analizan y transforman en Árboles de expresión sin usar compilación o reflexión.

Puedes escribir algo como:

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

Mi trabajo se basa en el artículo de Scott Gu http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx .

Debería usar .NET 3.5 Expressions, en System.Linq.Expressions. Scott Gu ha proporcionado una API de expresión dinámica que le permite evaluar cadenas para convertirlas en árboles de expresión, que luego pueden evaluarse mediante código para examinar el contenido de la expresión o compilarse para su ejecución.

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

Usted menciona que los objetos pueden ser "casi cualquier cosa". ¿Los puntos de medida también pueden ser casi cualquier cosa? Presumiblemente, las mediciones se limitarían a las propiedades definidas del objeto en cuestión, en cuyo caso podría presumiblemente exponer un editor similar a un asistente que permitiría al usuario realizar cálculos basados ??en las propiedades del objeto descubiertas a través de la reflexión. Una cosa que tiene para usted al limitar el problema es que parece estar aplicando 3 puntos finales para la medición en lugar de 1 a N estados.

Una última sugerencia, creo que para una flexibilidad suficiente necesitará un modelo de objeto de medición independiente que se una a los objetos que desea medir.

¿Qué tan importante es para usted hacer cumplir la exclusividad en las mediciones? Proteger al usuario de la definición de estados superpuestos quizás sea la parte más difícil de esto, ya que, según su descripción, parecería que medidas completamente diferentes son válidas para adjuntar a diferentes estados.

Además, ¿sabe cómo va a sondear los objetos para calcular las medidas y definir el estado de los objetos?

Perdón por hablar de manera general, pero realmente en este punto su pregunta es bastante general. Buena suerte.

¿Podría el usuario usar su conocimiento del objeto y simplemente decidir en qué categoría colocarlo cuando lo ingresa al sistema? Supongo que necesitamos más información, pero si el usuario puede definir qué puntos de medición determinan qué categoría, ¿no podrían simplemente elegir la categoría?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top