Fórmulas definidas pelo usuário em C#
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.
Soluçã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.
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?