은/

2014-12-02 8 views
0

내가은/

Parameter -> Condition -> Rule

하자 아래와 같은 구조를 가지고 매개 변수 내가 만들 필요가 말하는 Business rule, Customer Age > 18

나는 두 개의 매개 변수, Customer Age (P1) and 18(P2), P1 is Field Parameter (Ognl)P2 is constant Parameter와이 value 18.

Condition이 이제 Customer Age > 18이고 내 Rule입니다.

문제점 설명 : 사용자가 중복 매개 변수/조건 및 규칙을 작성하지 않도록하십시오.

해결책 : Constant Parameters, Field Parameters etc 나는 DB를 체크인하고 이미 존재하는지 비교할 수 있습니다. 나를 위해

지금 상태

Customer Age > 1818 < Customer Age 비즈니스 측면에서 동일합니다.

위의 경우는 더 복잡 할 수 있습니다.

(a + b) * (c + d) is same as (b + a) * (d + c) 

위의 표현식의 유효성을 검사해야합니다.

첫 번째 접근 - DB (10000 일 수 있음)에서 모든 표현식을로드하고 using Stack/Tree Structure을 비교하면 내 목표를 실제로 죽일 것입니다.

두 번째 방법 - 나는 전체 전력을 구축 생각하고 있었는데, hashcode generator을 가정 해 봅시다 또는 우리는 (또한 운영자/브라켓을 고려하여) 모든 표현에 대해 하나의 int value을 말할 수 있습니다. 이 값은 위의 표현식을 검증하는 방식으로 생성되어야합니다.

수단 a + bb + a 다른 생성한다 같은 int valuea - bb - a를 생성한다.

답변

1

첫 번째 접근 방식을 단순화 한 버전 일 수 있습니다. 데이터베이스에 삽입하려는 내용과 유사한 내용을 검색하여 관련 표현식 만 필터링하면 어떨까요?

Customer Age을 삽입하려는 경우이 매개 변수가 포함 된 모든 표현식을 찾아 축소 된 표현식 집합을 기반으로 스택/트리를 작성할 수 있습니다.

+0

올바른지, 나는 출력/반복을 줄일 수 있지만 여전히 내 응용 프로그램은 100의 조건, 규칙에서 동일한 매개 변수를 사용합니다. –

+0

커스텀 해시 함수를 사용하는 방식이 정말 마음에 듭니다. 문제는 해시 된 값 (예 : 문자열 '고객 연령')이 사용되었을 때 (고객 연령대 등이 아닌) 정확히 일치하는지 확인해야한다는 것입니다. –

+0

값이 18 인 매개 변수가 18 또는 18 또는 18 등으로 명명 될 수있는 것처럼 이름에 대해 걱정할 필요가 있습니다. 사용자가 매개 변수 아래에있는 콘텐츠, 조건을 해시 코드 계산에 사용하려고합니다. –

1

식의 구문 분석기 작성을 피하고 식의 AST를 작성하고 식을 등가 식을 검색하는 코드 다시 작성 규칙을 피할 수는 없다고 생각합니다.

생각만큼 시간이 오래 걸리지 않을 수 있습니다.

구문 분석 및 AST 건물 부분에 대한

, 당신은 exp4j에서 시작할 수 있습니다 : 당신이 분석해야 100 % 안전한 솔루션을 Strategies for simplifying math expressions

+0

내가 언급 한 것과 똑같은 문제가 있지만 시간이 많이 걸릴 것입니다. 규칙, 3-5K 조건, ..... –

+0

"시간이 많이 걸립니다": 코드 작성 또는 실행 의미입니까? –

+0

두 경우 모두, 뭔가를 창출하는 데 시간이 걸리는 클라이언트에게 뭔가를 줄 수는 없습니다. –

1

: 재 작성 규칙에 대한 http://www.objecthunter.net/exp4j/

, 당신은 한 번 봐 가질 수 수학적으로 동등한지를 알기 위해 컴퓨터 대수학 시스템을 사용한 표현. 하지만 그렇게 쉬운 것은 아닙니다.

두식이 유사한 여부를 테스트 할 수있는 실용적인 접근 방식 : 그들은

  • 다른 입력의 번호를 자신의 출력을 비교하여 같은 변수가 있는지 여부를

    • 확인, 출력되는지 확인 같음

    변수 목록을 저장하고 미리 정의 된 입력 집합에 대한 출력을 표현식의 "해시"로 저장할 수 있습니다. 이 해시는 두 표현이 동일하다는 사실을 보증하지 않지만이 새로운 규칙이 이와 유사한 해시와 같은지 묻는 표현식을 사용자에게 표시 할 수 있습니다.