質問

各オブジェクトに対してユーザーが独自の測定ポイントを指定できるアプリケーションがあります。これらの測定値を使用して、オブジェクトをiに分類します。A-サービスが必要、B-サービスはX日以内にスケジュール、C-サービスは不要ATM

ただし、これらのオブジェクトはほとんど何でもかまいませんし、測定値を分類に集計する方法をハードコーディングする方法はありません。ユーザーに任せる必要があります。

このためにユーザーが独自の式を入力する方法をユーザーに提供する方法についての提案はありますか?それはばか防止である必要はありません、私たちはそれを説明できる限り彼らを助けることができるので、私たちはそのような多くの顧客を持っていません。

役に立ちましたか?

解決

逃亡式エバリュエーター

ユーザーに使用に有効な変数のリストを提供し、ユーザーが独自の式を作成できるようにすることができます。その後、すべての式、変数名、および値をFleeに渡し、すべての式を値またはtrue / falseに解決します。

他のヒント

あなたの状況は、ドメイン固有の言語に最適です。 DSLを使用すると、「式言語」に使用できる文法を指定できます。その後、ユーザーにフィードバックを提供し、結果を計算します。

Antlr は、このための非常に優れたツールです。これはパーサー/レクサージェネレーターです。基本的には、Antlr独自の記述DSLで文法を指定し、選択した言語で堅牢なレクサーとパーサーを生成します。

たとえば、ご使用の言語で単純な計算が許可されている場合、これは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またはWebサービスを実行している場合は、ライブラリとして使用できます。

ASP.NETの簡単な計算サンプルをこちらで見るか、ダウンロードできますWinFormsコントロールを試したい場合は、こちらの無料トライアルをご覧ください。

免責事項:SpreadsheetGear LLCを所有しています

私はオープンソースプロジェクト Dynamic Expresso を作成しました。デリゲート(または式ツリー)への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);

私の仕事はScott Guの記事 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx

System.Linq.Expressionsの.NET 3.5 Expressionsを使用する必要があります。 Scott Guが提供するDynamic Expression APIを使用すると、文字列を評価して式ツリーに変換し、コードで評価して式の内容を調べるか、実行用にコンパイルできます。

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

オブジェクトは「ほぼすべてのもの」にできると述べています。測定ポイントもほとんど何でもかまいませんか?おそらく、測定は問題のオブジェクトの定義されたプロパティに制限されます。その場合、ユーザーはリフレクションによって発見されたオブジェクトプロパティに基づいて計算を実行できるウィザードのようなエディターを公開できます。問題を制限するために行っていることの1つは、1〜Nの状態ではなく、3つのエンドポイントを測定に適用しているように見えることです。

最後の提案として、十分な柔軟性を確保するには、測定するオブジェクトにバインドする独立した測定オブジェクトモデルが必要だと思います。

測定に排他性を強制することはどれほど重要ですか?重複する状態を定義することからユーザーを保護することは、おそらく最も難しい部分です。説明から、異なる状態にアタッチするのにまったく異なる測定値が有効であると思われるためです。

また、測定値を計算してオブジェクトの状態を定義するためにオブジェクトをポーリングする方法を知っていますか?

非常に一般的にはごめんなさい。しかし実際のところ、あなたの質問はかなり一般的です。幸運を祈ります。

ユーザーはオブジェクトに関する知識を使用して、システムに入力するときにどのカテゴリに入れるかを決定できますか?さらに情報が必要だと思いますが、ユーザーがどのメジャーポイントでどのカテゴリーを決定するかを定義できる場合、カテゴリーを選択することはできませんか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top