Pergunta

Eu tenho uma aplicação onde para cada objeto, o usuário pode especificar o seu próprio measurepoints.Os valores de estas medidas irão então ser utilizada para classificar o objeto como eu e necessidades de serviço, B - o serviço deve ser agendado no prazo de X dias, C - nenhum serviço necessário ATM

No entanto estas objetos pode ser quase nada e não há nenhuma maneira que nós podemos código rígido como os valores medidos devem ser agregados a uma classificação, precisamos deixar isso para o usuário.

Tem alguma sugestão sobre como podemos fornecer uma maneira para que o usuário insira suas próprias fórmulas para isso?Ele não tem de ser idiota-prova, nós não temos o que muitos clientes para que possamos ajudá-los enquanto eles podem explicar-nos.

Foi útil?

Solução

Fugir avaliador de expressão

Você pode dar aos usuários uma lista de variáveis que são válidos para usar e deixe-os vir com suas próprias expressões.Em seguida, você deverá passar todas as expressões, nomes de variáveis e valores para Fugir e que iria resolver todas as expressões de um valor ou de verdadeiro/falso.

Outras dicas

Sua situação é um caso perfeito para uma linguagem específica de domínio.Uma DSL permite que você especifique um permitida a gramática para a sua "fórmula de linguagem" e, em seguida, fornecer feedback para o usuário, bem como calcular o resultado.

Antlr é uma ferramenta muito boa para isso.É um analisador/lexar gerador.Basicamente você especificar a gramática no Antlr própria descrição DSL, e gera robusto lexers e analisadores para você em seu idioma de escolha.

Por exemplo, se o seu idioma permite-se a cálculos simples, é assim que deve ser especificado no antlr da linguagem (a partir de 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' ;

Você pode descobrir mais sobre fanático por dsls em geral aqui.

SpreadsheetGear para .NET pode ser uma boa escolha.SpreadsheetGear aceita e calcula fórmulas na linguagem que a maioria dos usuários já sabe - Excel.SpreadsheetGear inclui um Windows Forms planilha de controle, ou você pode usá-lo como uma biblioteca, se você está fazendo ASP.NET ou um serviço web.

Você pode ver simples ASP.NET cálculo de amostras aqui, ou baixe a versão de avaliação gratuita aqui se você quiser tentar a WinForms de controle.

Isenção de responsabilidade:Eu próprio SpreadsheetGear LLC

Eu tenho escrito um projeto de código aberto, Dinâmica Expresso, que pode converter expressão de texto escrito com um C# sintaxe em delegados (ou árvore de expressão).Expressões são analisados e transformados em Árvores De Expressão sem o uso de compilação ou de reflexão.

Você pode escrever algo como:

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

Meu trabalho é baseado em Scott Gu artigo http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .

Você deve usar .NET 3.5 Expressões, no Sistema.Linq.Expressões.Scott Gu forneceu uma Expressão Dinâmica API que permite avaliar cadeias de caracteres para transformá-los em árvores de expressão, que pode, então, ser avaliados pelo código, ou para examinar o conteúdo de expressão, ou compilado para execução.

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

Você menciona os objetos podem ser "quase nada".Pode a medida de pontos de também ser quase qualquer coisa?Presumivelmente, as medições devem ser limitado a definida propriedades do objeto em questão, caso em que você pode provavelmente expor um assistente como o editor que permita ao usuário realizar cálculos com base nas propriedades do objeto descoberto por meio de reflexão.Uma coisa que você tem vai para você por meio de delimitadora o problema é que você parece ser fazer valer 3 pontos de extremidade de medição, em vez de 1 para N estados.

Uma última sugestão, eu acho que a flexibilidade suficiente você vai precisar de um independentes de medição de modelo de objeto que se liga aos objetos que você deseja medir.

Quão importante é para você impor exclusividade nas medições?Protegendo o usuário de definir a sobreposição de estados serão talvez os mais difíceis parte desta, uma vez que a partir da sua descrição parece que inteiramente diferentes medições são válidos para anexar a diferentes estados.

Além disso, você sabe como vai ser a consulta a objetos para calcular medidas para definir o estado dos objetos?

Desculpe falar assim, geralmente, mas realmente neste ponto, a sua pergunta é bastante geral.Boa sorte.

Poderia o usuário use o seu conhecimento do objeto e simplesmente decidir que categoria colocar em quando ele entra no sistema?Acho que precisamos de mais informações, mas se o usuário pode definir que measurepoints determinar a categoria, não podiam basta escolher a categoria?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top