Вопрос

У меня есть приложение, где для каждого объекта пользователь может указать свои собственные точки измерения.Значения этих измерений затем будут использованы для классификации объекта следующим образом: A - требуется обслуживание, B - обслуживание должно быть запланировано в течение X дней, C - обслуживание не требуется.

Однако эти объекты могут быть практически любыми, и мы не можем жестко запрограммировать, как измеренные значения должны быть объединены в классификацию, мы должны оставить это пользователю.

Есть ли у вас какие-либо предложения о том, как мы можем предоставить пользователю возможность вводить для этого свои собственные формулы?Это не обязательно должно быть доказательством идиотизма, у нас не так много клиентов, поэтому мы можем помогать им до тех пор, пока они могут нам это объяснить.

Это было полезно?

Решение

Оценщик выражения бегства

Вы можете предоставить пользователям список переменных, которые можно использовать, и позволить им создавать свои собственные выражения. Затем вы передадите все выражения, имена переменных и значения в Flee, и он разрешит все выражения в значение или true / false.

Другие советы

Ваша ситуация идеально подходит для языка, специфичного для домена. DSL позволит вам указать допустимую грамматику для вашего "языка формул" а затем предоставить обратную связь пользователю, а также рассчитать результат.

Antlr - очень хороший инструмент для этого. Это генератор парсера / лексара. По сути, вы задаете грамматику в собственном описании DSL Antlr, и она генерирует надежные лексеры и парсеры для вас на выбранном вами языке.

Например, если ваш язык допускает простые вычисления, это так, как это будет указано в языке antlr (из вики 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' ;

Вы можете узнать больше о DSL в целом здесь .

SpreadsheetGear for .NET может быть хорошим выбором. SpreadsheetGear принимает и рассчитывает формулы на языке, который большинство пользователей уже знает, - Excel. SpreadsheetGear включает элемент управления электронными таблицами Windows Forms, или вы можете использовать его в качестве библиотеки, если вы используете ASP.NET или веб-службу.

Вы можете посмотреть простые образцы вычислений ASP.NET здесь или загрузить здесь , если вы хотите попробовать элемент управления WinForms.

Отказ от ответственности: мне принадлежит SpreadsheetGear LLC

Я написал проект с открытым исходным кодом, Динамический Эспрессо, который может преобразовывать текстовое выражение, написанное с использованием синтаксиса C #, в делегаты (или дерево выражений).Выражения анализируются и преобразуются в Деревья выражений без использования компиляции или отражения.

Вы можете написать что-то вроде:

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

или

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

Моя работа основана на статье Скотта Гу http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .

Вы должны использовать выражения .NET 3.5 в System.Linq.Expressions. Скотт Гу предоставил API-интерфейс для динамических выражений, который позволяет вам оценивать строки, превращая их в деревья выражений, которые затем могут оцениваться кодом либо для проверки содержимого выражений, либо для компиляции для выполнения.

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

Вы упоминаете, что объекты могут быть "почти чем угодно". Могут ли точки измерения быть почти чем-нибудь? Предположительно, измерения будут ограничены определенными свойствами рассматриваемого объекта, и в этом случае вы, вероятно, могли бы открыть редактор в стиле мастера, который позволил бы пользователю выполнять вычисления на основе свойств объекта, обнаруженных с помощью отражения. Одна вещь, которую вы можете решить, ограничивая проблему, это то, что вы, похоже, применяете 3 конечные точки для измерения вместо 1 к N состояниям.

Последнее предложение, я думаю, что для достаточной гибкости вам понадобится независимая модель объекта измерения, которая связывается с объектами, которые вы хотите измерить.

Насколько важно для вас обеспечить эксклюзивность измерений? Защита пользователя от определения перекрывающихся состояний, возможно, будет самой сложной частью этого, поскольку из вашего описания может показаться, что совершенно разные измерения действительны для привязки к различным состояниям.

Кроме того, знаете ли вы, как вы будете опрашивать объекты для расчета измерений, чтобы определить состояние объектов?

Извините, что говорю в общем, но на самом деле на данный момент ваш вопрос довольно общий. Удачи.

Может ли пользователь использовать свои знания об объекте и просто решить, в какую категорию он будет добавлен, когда войдет в систему? Думаю, нам нужно больше информации, но если пользователь может определить, какие точки измерения определяют какую категорию, он не может просто выбрать категорию?

scroll top