2012-09-27 4 views
1

데이터를보다 효율적으로 처리 할 방법을 생각 중입니다. 내가 그것을 설명하자최적화를위한 데이터 구조

현재

는, 클래스가, Rules라고, 그것은 Rules::isForwardEligible(), Rules::isCurrentNumberEligible() .... 그래서이 기능은 특정 상황을 확인하는 데 사용됩니다 (다른 프로세스 호출과 같은 멤버 함수를 많이 가지고 그들 모두)은 bool 값을 반환합니다.

이 함수의 본문에는 if이 있습니다. DB를 쿼리하여 데이터를 비교하고, 마지막으로 turn 또는 false를 반환합니다.

그래서 모든 게 같다 --->if(xxxx) (또 다른 기능, 쿼리 DB 될 것 xxxx는) 내가 이런 종류의 방법은 좋지 않다라고 생각합니다 --->Rules::isCurrentNumberEligible() 콘텐츠를 확인합니다. 나는 그것을 향상시키고 싶다.

내가 상상하는 것은 코드를 적게 사용하지만 정보를 더 많이 쿼리하는 것입니다.

첫 번째 단계 에서 쿼리 할 수 ​​있으므로 다른 테이블을 쿼리 용으로 설정할 수 있으므로 if(xxx){if(xx){if(xx)....}}과 같은 것들은 적습니다. 솔루션은 코디네이터와 같은 역할을하는 클래스를 작성하고 매번 다른 쿼리를 요청합니다. 적합한가요?

나는 이것을 제어하는 ​​좋은 방법인지 확신 할 수 없거나 좋은 해결책을 제쳐두고 있습니다. 제발 도와주세요, 고마워요!

+3

당신은'if' 문수를 줄이기 위해 비트 마스크를 사용할 수 있습니다. 모든 쿼리를 하나의 비트 마스크로 병합 할 수 있습니다. 비트 마스크는 비트별로 검사하거나 미리 정의 된 값과 비교할 수 있습니다. 수업에 넣는 것이 어렵지 않을 것입니다. –

+0

[Guard Clause] (http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html)도 도움이 될 것 같습니다. – timrau

+0

네,하지만 이건 이전과 거의 같습니다. 데이터베이스 나 코디네이터를 사용하여 처리하고 싶습니다. –

답변

1

규칙 기반 시스템의 기존 알고리즘은 RETE algorithm입니다. 평가할 규칙의 수를 최소화하기 위해 노력합니다. 트릭은 하나 이상의 관련 사실이 변경되지 않는 한 규칙의 재평가는 의미가 없다는 것입니다.

일반적으로 정보를 최대한 얻을 수있는 규칙을 먼저 쿼리해야합니다. 이것은 가능한 한 적은 질문으로 각각의 경우를 정확하게 파악하는 데 도움이됩니다. 감별 진단을 담당하는 의사는 항상 자신의 질문을 일반에서 특정으로 주문합니다. 정보 이론에서는 이것을 principle of maximum entropy이라고합니다.