"고퍼는 규칙을 유지합니다"
import "github.com/hyperjumptech/grule-rule-engine"
Grule은 Go(Golang) 프로그래밍 언어용 규칙 엔진 라이브러리입니다. 호평을 받은 JBOSS Drools에서 영감을 받아 훨씬 간단한 방식으로 수행되었습니다.
Drools 와 마찬가지로 Grule에는 자체 DSL 또는 도메인별 언어가 있습니다.
다음은 Drools의 DRL 또는 Drools 규칙 언어의 예입니다.
rule "SpeedUp"
salience 10
when
$TestCar : TestCarClass( speedUp == true && speed < maxSpeed )
$DistanceRecord : DistanceRecordClass()
then
$TestCar.setSpeed($TestCar.Speed + $TestCar.SpeedIncrement);
update($TestCar);
$DistanceRecord.setTotalDistance($DistanceRecord.getTotalDistance() + $TestCar.Speed);
update($DistanceRecord);
end
Grule의 GRL은 다음과 같습니다.
rule SpeedUp "When testcar is speeding up we keep increase the speed." salience 10 {
when
TestCar . SpeedUp == true && TestCar . Speed < TestCar . MaxSpeed
then
TestCar . Speed = TestCar . Speed + TestCar . SpeedIncrement ;
DistanceRecord . TotalDistance = DistanceRecord . TotalDistance + TestCar . Speed ;
}
Martin Fowler가 작성한 기사보다 더 나은 설명은 없습니다. 여기에서 기사를 읽을 수 있습니다(Martin Fowler의 RulesEngine).
TutorialsPoint 웹사이트에서 가져옴(약간의 수정 포함)
Grule Rule Engine은 전문가 시스템을 구현하기 위해 규칙 기반 접근 방식을 사용하는 생산 규칙 시스템입니다. 전문가 시스템은 획득한 지식을 추론에 사용할 수 있는 지식베이스로 처리하기 위해 지식 표현을 사용하는 지식 기반 시스템입니다.
생산 규칙 시스템은 명제 및 1차 논리를 간결하고 모호하지 않으며 선언적인 방식으로 표현하기 위해 지식 표현에 중점을 둔 Turing 완전체입니다.
생산 규칙 시스템의 두뇌는 수많은 규칙과 사실로 확장할 수 있는 추론 엔진 입니다. 추론 엔진은 생산 규칙( 생산 또는 단순히 규칙 이라고도 함)과 사실 및 데이터를 일치시켜 조치를 취하는 결론을 추론합니다.
생산 규칙은 지식 표현에 대한 추론을 위해 1차 논리를 사용하는 두 부분으로 구성된 구조입니다. 비즈니스 규칙 엔진은 런타임 프로덕션 환경에서 하나 이상의 비즈니스 규칙을 실행하는 소프트웨어 시스템입니다.
규칙 엔진을 사용하면 "어떻게 할지" 가 아닌 "무엇을 할지"를 정의할 수 있습니다.
(TutorialsPoint에서도 가져옴)
규칙은 종종 "어떤 조건이 발생하면 몇 가지 작업을 수행합니다."로 표현되는 지식 조각입니다.
When
< Condition is true >
Then
< Take desired Action >
규칙의 가장 중요한 부분은 부분입니다. when 부분이 만족되면 then 부분이 트리거됩니다.
rule < rule_name > < rule_description >
< attribute > < value > {
when
< conditions >
then
< actions >
}
규칙을 사용하면 어려운 문제에 대한 해결책을 쉽게 표현하고 검증도 받을 수 있습니다. 코드와 달리 규칙은 덜 복잡한 언어로 작성됩니다. 비즈니스 분석가는 일련의 규칙을 쉽게 읽고 확인할 수 있습니다.
데이터는 도메인 개체에 있고 비즈니스 논리는 규칙에 있습니다. 프로젝트의 종류에 따라 이러한 분리는 매우 유리할 수 있습니다.
규칙을 사용하면 실행 가능한 지식 저장소(지식 기반)를 생성할 수 있습니다. 이는 비즈니스 정책에 대한 단일 진실점입니다. 이상적으로 규칙은 읽기 쉬워서 문서로도 사용할 수 있습니다.
비즈니스 규칙은 실제로 데이터로 취급되기 때문입니다. 비즈니스의 역동적인 성격에 따라 규칙을 조정하는 것은 쉽지 않습니다. 일반적인 소프트웨어 개발처럼 코드를 다시 빌드하거나 배포할 필요가 없습니다. 규칙 세트를 롤아웃하고 지식 저장소에 적용하기만 하면 됩니다.
다음 경우는 규칙 엔진을 사용하여 더 잘 해결됩니다.
일종의 실제 결론을 제공하기 위해 사실을 평가해야 하는 전문가 시스템입니다. RETE 스타일 규칙 엔진을 사용하지 않으면 if
/ else
문의 계단식 세트를 코딩하게 되며 이를 평가할 수 있는 조합의 순열은 금방 관리가 불가능해집니다. 테이블 기반 규칙 엔진이면 충분할 수 있지만 여전히 변경에 취약하고 코딩하기가 매우 쉽지 않습니다. Grule과 같은 시스템을 사용하면 시스템의 규칙과 사실을 설명할 수 있으므로 해당 사실에 대해 규칙이 어떻게 평가되는지 설명할 필요가 없으며 복잡성의 대부분을 숨길 수 있습니다.
등급 시스템. 예를 들어, 은행 시스템은 고객의 거래 기록(사실)을 기반으로 각 고객에 대한 "점수"를 생성하려고 할 수 있습니다. 우리는 은행과의 상호 작용 빈도, 입출금 금액, 청구서 지불 속도, 발생 이자를 얼마나 많이 받는지, 자신이나 은행을 위해 벌어들이는 금액에 따라 점수가 변하는 것을 볼 수 있습니다. 곧. 규칙 엔진은 개발자가 제공할 수 있으며, 사실과 규칙의 사양은 은행 고객 분석 부서 내의 해당 분야 전문가가 제공할 수 있습니다. 이러한 서로 다른 팀을 분리하면 책임이 있어야 할 곳에 두게 됩니다.
컴퓨터 게임. 플레이어 상태, 보상, 처벌, 손상, 점수 및 확률 시스템은 대부분의 컴퓨터 게임에서 규칙이 중요한 역할을 하는 곳을 보여주는 다양한 예입니다. 이러한 규칙은 개발자가 예상하지 못한 방식으로 매우 복잡한 방식으로 상호 작용할 수 있습니다. 스크립팅 언어(예: Lua)를 사용하여 이러한 동적 상황을 코딩하는 것은 매우 복잡할 수 있으며 규칙 엔진은 작업을 엄청나게 단순화하는 데 도움이 될 수 있습니다.
분류 시스템. 이는 실제로 위에서 설명한 등급 시스템을 일반화한 것입니다. 규칙 엔진을 사용하여 신용 적격성, 생화학적 식별, 보험 상품에 대한 위험 평가, 잠재적인 보안 위협 등을 분류할 수 있습니다.
조언/제안 시스템. "규칙"은 단순히 또 다른 종류의 데이터이므로 다른 프로그램에서 정의할 수 있는 주요 후보입니다. 이 프로그램은 또 다른 전문가 시스템일 수도 있고 인공지능일 수도 있다. 규칙 세트가 모델링하려는 도메인에 대해 새로운 유형의 사실이나 새로 발견된 정보를 처리하기 위해 다른 시스템에서 규칙을 조작할 수 있습니다.
규칙 엔진을 사용하면 이점을 얻을 수 있는 다른 사용 사례가 많이 있습니다. 위의 사례는 잠재적인 사례 중 극히 일부에 불과합니다.
그러나 규칙 엔진은 만능이 아니라는 점을 기억하는 것이 중요합니다. 소프트웨어의 "지식" 문제를 해결하기 위한 많은 대안이 존재하며, 이러한 대안은 가장 적절한 곳에 채택되어야 합니다. 예를 들어 간단한 if
/ else
분기로 충분할 경우 규칙 엔진을 사용하지 않을 것입니다.
주목해야 할 또 다른 사항이 있습니다. 일부 규칙 엔진 구현은 비용이 매우 많이 들지만 많은 기업은 이를 통해 많은 가치를 얻으므로 이를 실행하는 데 드는 비용이 해당 가치로 쉽게 상쇄됩니다. 적당히 복잡한 사용 사례의 경우에도 팀을 분리하고 비즈니스 복잡성을 완화할 수 있는 강력한 규칙 엔진의 이점은 매우 분명한 것 같습니다.
문서 페이지는 여기
튜토리얼을 자세히 알아보려면 여기 Github의 Wiki Docs를 참조하세요.
Loading rules into KnowledgeBase
:
100
규칙을 KnowledgeBase에 로드하려면 작업당 ~99.342047ms
및 ( 49295906 B/op
) ~49.295906MB
메모리와 동일한 99342047 ns/op
(가장 높은 값 사용)이 필요했습니다.
1000
규칙을 KnowledgeBase에 로드하려면 작업당 ~933.617752ms
및 ( 488126636 B/op
) ~488.126636
메모리와 동일한 933617752 ns/op
(가장 높은 값 사용)이 필요했습니다.
Executing rules against a fact
:
100개의 규칙에 대해 팩트를 실행하기 위해 Grule Engine은 ~0.009697ms
에 거의 미치지 않는 ~9697 ns/op
(기본으로 가장 높은 값을 사용)와 매우 빠른 3957 B/op
사용했습니다.
1000개의 규칙에 대해 팩트를 실행하기 위해 Grule Engine은 약 ~0.568959ms
에 불과한 ~568959 ns/op
(기본으로 가장 높은 값을 사용함)와 꽤 빠른 293710 B/op
사용했습니다.
여기에서 세부 보고서를 읽을 수 있습니다.
예. 오픈 소스 커뮤니티에서 Grule을 더욱 개선하고 유용하게 만들려면 기여자가 필요합니다.
정말로 우리를 돕고 싶다면 프로젝트를 Fork
하고 Pull Request를 신청하세요. 우리의 기여 매뉴얼과 행동 강령을 읽어보십시오.