2012-12-14 4 views
0

drools 규칙을 작성할 때, 검사를 더 많은 규칙으로 분리하거나 'then'부분에 더 많은 if를 갖도록 하나의 규칙으로 그룹화합니까? 관리 문제는 고려하지 않고 성능 (예 : 실행 시간, 메모리 사용)을 고려해야합니다.Drools 규칙을 분리하거나 그 결과가 더 많습니까?

나는 조건과 물건이 90 % 유사하고 각각 10 % 만 남겨진 여러 가지 작업이 있다고 가정 해보십시오. 당신은

rule A 
when (90% conditions) and (task 1 or task 2 or task n) 
then 
    if (10% conditions for task 1) ...(10% stuff-to-do for task 1) 
    else if (10% conditions for task 2) ...(10% stuff-to-do for task 2) 
    else if (10% conditions for task n) ...(10% stuff-to-do for task n) 
    (90% common stuff-to-do) 
end 

또는

rule B-1 
when (90% conditions) and (10% conditions for task 1) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task 1) 
end 
rule B-2 
when (90% conditions) and (10% conditions for task 2) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task 2) 
end 
rule B-n 
when (90% conditions) and (10% conditions for task n) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task n) 
end 

감사합니다 쓰기 마세요!

답변

1

조건과 작업을 함께 그룹화하는 대신 다음 예제와 같이 개별 조건으로 그룹화해야합니다. 실행 시간은 RETE 덕분에별로 중요하지 않으며 메모리 사용량은 규칙이 아니라 사실에 따라 다릅니다.

조건부 논리를 별도의 규칙으로 분리하면 테스트 가능하고 관리하기 쉬운 코드 기반을 얻을 수 있습니다. 모든 것을 큰 규칙에 넣는 것은 일반 Java 코드에서 if-else 문을 사용하는 것과 크게 다르지 않습니다.이 경우 Drools는 아무런 이점도없이 프로젝트에 복잡성을 추가합니다.

rule 90_1 
when 
    //first rule for common stuff 
then 
    // 
end 


rule 90_2 
when 
    //second rule for common stuff 
then 
    // 
end 


rule 90_N 
when 
    //last rule for common stuff 
then 
    // 
end 

rule A_1 
when 
    //first rule for A 
then 
    // 
end 


rule A_2 
when 
    //second rule for a 
then 
    // 
end 

rule B 
when 
    //rule for B 
then 
    // 
end 
+0

그래서 좀 더 미세한 규칙이 Drools에서 더 우수하다는 것을 알았습니다. – user1589188

+0

고려해야 할 추가 항목은 유사한 규칙을 많이 사용하여 코드베이스가 복잡해 졌다고 생각할 때 고려해야 할 가치가있는 항목입니다. 간단한 DSL 또는 의사 결정 테이블 작성. – Steve

3

Rete 엔진에 대한 전문가는 아니지만 일반적으로 규칙의 왼쪽에 결정 사항이있는 한 엔진은 Rete 트리를 최적화하여 결정에 도달 할 수 있도록합니다 가장 효율적입니다. 따라서 이 LHS의 모든 것을 유지하는 것이 더 효율적이어야합니다. LHS에서 'eval'과 같은 이유는 역병처럼 피해야합니다.

마이크로 최적화 규칙을 제외하고 각 의사 결정이 별도의 규칙으로 선언 된 경우 정확한 조건이 다른 상황에서 활성화되었는지 평가하는 단위 테스트를 작성하는 것이 간단합니다. 규칙을 합병하면 더 이상 규칙이 발사되고 있는지 여부를 테스트 할 수 없습니다.

+0

오른쪽 모두 나에게 의미가 있습니다, 감사합니다! – user1589188

2

나는 두 번째 것을 선호합니다. 별도의 작은 규칙을 갖는 것은 깨끗합니다. Drools의 목적은 규칙을 귀하의 규칙으로 변경하는 것이므로

+0

좋은 지적! – user1589188

관련 문제