문제

각 객체에 대해 사용자가 자신의 측정 점을 지정할 수있는 응용 프로그램이 있습니다. 그런 다음 theese 측정 값은 객체를 즉, a a -a 니드 서비스, b- 서비스를 x 일 내에 예약해야합니다. c- 서비스가 필요하지 않아야합니다.

그러나 객체는 거의 모든 것이 될 수 있으며 측정 된 값을 분류로 집계하는 방법을 하드 코딩 할 수있는 방법은 없습니다. 우리는이를 사용자에게 맡겨야합니다.

사용자가 자신의 공식을 입력 할 수있는 방법을 제공 할 수있는 방법에 대한 제안이 있습니까? 그것은 바보를 방지 할 필요가 없으며, 우리는 많은 고객이 있지 않으므로 그들이 우리에게 설명 할 수있는 한 고객을 도울 수 있습니다.

도움이 되었습니까?

해결책

도약 표현 평가자

사용자에게 사용하는 데 유효한 변수 목록을 제공하고 자신의 표현을 제시 할 수 있습니다. 그런 다음 모든 표현식, 가변 이름 및 값을 전달하여 모든 표현식을 값 또는 참/거짓으로 해결합니다.

다른 팁

귀하의 상황은 도메인 특정 언어의 완벽한 사례입니다. DSL을 사용하면 "공식 언어"에 허용 된 문법을 지정한 다음 사용자에게 피드백을 제공하고 결과를 계산할 수 있습니다.

antlr 이것을위한 아주 좋은 도구입니다. 파서/렉사르 생성기입니다. 기본적으로 ANTLR의 설명 DSL에 문법을 지정하고 선택한 언어로 강력한 Lexers와 Parsers를 생성합니다.

예를 들어, 귀하의 언어가 간단한 계산을 허용하는 경우 ANTLR의 언어 (Antlr 's 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' ;

일반적으로 DSL에 대한 자세한 내용을 확인할 수 있습니다 여기.

.NET 용 스프레드 시트 기어 좋은 선택 일 수 있습니다. 스프레드 시트 기어는 대부분의 사용자가 이미 알고있는 언어로 공식을 수락하고 계산합니다. 스프레드 시트 기어에는 Windows 양식 스프레드 시트 제어가 포함되거나 ASP.NET 또는 웹 서비스를 수행하는 경우 라이브러리로 사용할 수 있습니다.

간단한 ASP.NET 계산 샘플을 볼 수 있습니다 여기, 또는 무료 평가판을 다운로드하십시오 여기 Winforms 컨트롤을 시도하려면.

면책 조항 : 스프레드 시트 기어 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);

저의 작품은 Scott Gu 기사를 기반으로합니다 http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-linq-dynamic-query-library.aspx .

system.linq.expressions에서 .net 3.5 표현식을 사용해야합니다. Scott Gu는 문자열을 평가하여 표현 트리로 전환 할 수있는 동적 표현식 API를 제공했으며, 이는 표현 내용을 검사하거나 실행을 위해 컴파일하기 위해 코드에 의해 평가 될 수 있습니다.

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

당신은 객체가 "거의 모든 것"일 수 있다고 언급합니다. 측정 지점도 거의 무엇이든 할 수 있습니까? 아마도 측정 값은 해당 객체의 정의 된 특성으로 제한 될 것이며,이 경우 사용자가 반사를 통해 발견 된 객체 속성을 기반으로 계산을 수행 할 수있는 마법사와 같은 편집기를 노출시킬 수 있습니다. 문제를 해결하기 위해 당신을 위해 가고있는 한 가지는 1에서 N 상태 대신 측정을 위해 3 개의 엔드 포인트를 시행하는 것 같습니다.

마지막 제안 중 하나는 충분한 유연성을 위해 측정하려는 객체에 바인딩하는 독립적 인 측정 객체 모델이 필요하다고 생각합니다.

측정에서 독점 성을 시행하는 것이 얼마나 중요합니까? 겹치는 상태를 정의하지 못하도록 보호하는 것은 아마도 가장 어려운 부분 일 것입니다. 설명에서 완전히 다른 측정이 다른 상태에 부착하는 데 유효한 것처럼 보일 것입니다.

또한, 객체의 상태를 정의하기 위해 측정을 계산하기 위해 객체를 폴링하는 방법을 알고 있습니까?

일반적으로 말해서 죄송하지만 실제로이 시점에서 귀하의 질문은 꽤 일반적입니다. 행운을 빕니다.

사용자가 객체에 대한 지식을 사용하고 시스템에 들어갈 때 어떤 카테고리를 투입 할 것인지 결정할 수 있습니까? 더 많은 정보가 필요하지만 사용자가 어떤 척도 점을 결정할 수 있다면 어떤 범주를 결정할 수 있는지, 카테고리 만 선택할 수 없습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top