"โกเฟอร์ถือกฎ"
import "github.com/hyperjumptech/grule-rule-engine"
Grule เป็นไลบรารี Rule Engine สำหรับภาษาโปรแกรม Go (Golang) แรงบันดาลใจจาก JBOSS Drools ที่ได้รับการยกย่อง และทำในลักษณะที่เรียบง่ายกว่ามาก
เช่นเดียวกับ Drools Grule มี DSL หรือภาษาเฉพาะโดเมนของตัวเอง
ด้านล่างนี้คือตัวอย่างภาษาของ Drools's DRL หรือ Drools Rule:
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
GRL ของ Grule มีดังนี้:
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 คุณสามารถอ่านบทความได้ที่นี่ (RulesEngine โดย Martin Fowler)
นำมาจากเว็บไซต์ TutorialsPoint (มีการแก้ไขเล็กน้อย)
Grule Rule Engine คือระบบกฎการผลิตที่ใช้วิธีการตามกฎเพื่อนำระบบผู้เชี่ยวชาญไปใช้ ระบบผู้เชี่ยวชาญคือระบบฐานความรู้ที่ใช้การนำเสนอความรู้เพื่อประมวลผลความรู้ที่ได้รับให้เป็นฐานความรู้ที่สามารถใช้เพื่อการให้เหตุผล
ระบบกฎการผลิตกำลังดำเนินการโดยทัวริงโดยมุ่งเน้นไปที่การนำเสนอความรู้เพื่อแสดงตรรกะเชิงประพจน์และลำดับแรกในลักษณะที่กระชับ ไม่คลุมเครือ และเปิดเผย
สมองของระบบกฎการผลิตคือ กลไกการอนุมาน ที่สามารถขยายกฎและข้อเท็จจริงจำนวนมากได้ เครื่องมือการอนุมานจะจับคู่ข้อเท็จจริงและข้อมูลกับกฎการผลิต หรือที่เรียกว่า การผลิต หรือเพียงแค่ กฎ เพื่ออนุมานข้อสรุปที่ส่งผลให้เกิดการดำเนินการ
กฎการผลิตเป็นโครงสร้างสองส่วนที่ใช้ตรรกะลำดับแรกสำหรับการให้เหตุผลมากกว่าการเป็นตัวแทนความรู้ เอ็นจิ้นกฎธุรกิจคือระบบซอฟต์แวร์ที่ดำเนินการกฎทางธุรกิจตั้งแต่หนึ่งกฎขึ้นไปในสภาพแวดล้อมการใช้งานจริงแบบรันไทม์
Rule Engine ช่วยให้คุณกำหนด "สิ่งที่ต้องทำ" ไม่ใช่ "จะทำอย่างไร"
(นำมาจาก TutorialsPoint ด้วย)
กฎเกณฑ์คือชิ้นส่วนความรู้ที่มักแสดงออกมาเป็น "เมื่อมีเงื่อนไขบางอย่างเกิดขึ้น ให้ทำภารกิจบางอย่าง"
When
< Condition is true >
Then
< Take desired Action >
ส่วนที่สำคัญที่สุดของกฎก็คือเมื่อเป็นส่วนหนึ่ง ถ้าส่วน เมื่อ พอใจ ส่วน นั้น จะถูกทริกเกอร์
rule < rule_name > < rule_description >
< attribute > < value > {
when
< conditions >
then
< actions >
}
กฎเกณฑ์ทำให้ง่ายต่อการแสดงวิธีแก้ไขปัญหาที่ยากและรับการตรวจสอบเช่นกัน กฎต่างจากโค้ดตรงที่เขียนด้วยภาษาที่ซับซ้อนน้อยกว่า นักวิเคราะห์ธุรกิจสามารถอ่านและตรวจสอบชุดกฎเกณฑ์ได้อย่างง่ายดาย
ข้อมูลอยู่ในออบเจ็กต์โดเมนและตรรกะทางธุรกิจอยู่ในกฎ การแยกประเภทนี้อาจมีข้อได้เปรียบมาก ทั้งนี้ขึ้นอยู่กับประเภทของโครงการ
โดยการใช้กฎ คุณจะสร้างพื้นที่เก็บข้อมูลความรู้ (ฐานความรู้) ซึ่งสามารถดำเนินการได้ มันเป็นความจริงจุดเดียวสำหรับนโยบายทางธุรกิจ ตามหลักการแล้ว กฎสามารถอ่านได้ง่ายจนสามารถใช้เป็นเอกสารประกอบได้
เนื่องจากกฎเกณฑ์ทางธุรกิจถือเป็นข้อมูลจริงๆ การปรับเปลี่ยนกฎตามลักษณะที่พลวัตของธุรกิจกลายเป็นเรื่องเล็กน้อย ไม่จำเป็นต้องสร้างโค้ดใหม่หรือปรับใช้เหมือนการพัฒนาซอฟต์แวร์ตามปกติ คุณเพียงแค่ต้องเผยแพร่ชุดกฎและนำไปใช้กับคลังความรู้
กรณีต่อไปนี้แก้ไขได้ดีกว่าด้วย Rule-Engine:
ระบบผู้เชี่ยวชาญที่ต้องประเมินข้อเท็จจริงเพื่อให้ได้ข้อสรุปในโลกแห่งความเป็นจริง หากไม่ได้ใช้กลไกกฎสไตล์ RETE เราจะเขียนโค้ดชุดคำสั่ง if
/ else
ที่เรียงซ้อน และการเรียงสับเปลี่ยนของวิธีประเมินสิ่งเหล่านั้นรวมกันจะกลายเป็นสิ่งที่ไม่สามารถจัดการได้อย่างรวดเร็ว กลไกกฎแบบตารางอาจเพียงพอแล้ว แต่ก็ยังเปราะบางต่อการเปลี่ยนแปลงมากกว่า และเขียนโค้ดได้ไม่ง่ายนัก ระบบเช่น Grule ช่วยให้คุณสามารถอธิบายกฎและข้อเท็จจริงของระบบของคุณ ทำให้คุณไม่ต้องอธิบายว่ากฎได้รับการประเมินอย่างไรกับข้อเท็จจริงเหล่านั้น และซ่อนความซับซ้อนส่วนใหญ่จากคุณ
มีระบบการให้คะแนน ตัวอย่างเช่น ระบบธนาคารอาจต้องการสร้าง "คะแนน" สำหรับลูกค้าแต่ละรายตามบันทึกธุรกรรมของลูกค้า (ข้อเท็จจริง) เราเห็นการเปลี่ยนแปลงคะแนนโดยขึ้นอยู่กับความถี่ที่พวกเขาโต้ตอบกับธนาคาร จำนวนเงินที่พวกเขาโอนเข้าและออก ชำระค่าใช้จ่ายได้เร็วแค่ไหน ดอกเบี้ยที่พวกเขาได้รับ จำนวนเงินที่พวกเขาหามาเพื่อตนเองหรือธนาคาร และ เร็วๆ นี้. นักพัฒนาสามารถจัดเตรียมกลไกกฎได้ และข้อกำหนดของข้อเท็จจริงและกฎเกณฑ์สามารถจัดทำโดยผู้เชี่ยวชาญเฉพาะด้านภายในแผนกวิเคราะห์ลูกค้าของธนาคาร การแยกทีมต่างๆ ออกจากกันทำให้ความรับผิดชอบอยู่ในจุดที่ควรจะอยู่
เกมคอมพิวเตอร์ สถานะของผู้เล่น รางวัล บทลงโทษ ความเสียหาย คะแนน และระบบความน่าจะเป็นเป็นตัวอย่างที่แตกต่างกันมากมายที่กฎเกณฑ์มีบทบาทสำคัญในเกมคอมพิวเตอร์ส่วนใหญ่ กฎเหล่านี้สามารถโต้ตอบในลักษณะที่ซับซ้อนมาก ซึ่งบ่อยครั้งในลักษณะที่นักพัฒนาไม่คาดคิด การเขียนโค้ดสถานการณ์แบบไดนามิกเหล่านี้ผ่านการใช้ภาษาสคริปต์ (เช่น Lua) อาจค่อนข้างซับซ้อน และกลไกกฎสามารถช่วยให้งานง่ายขึ้นอย่างมาก
ระบบการจำแนกประเภท นี่เป็นลักษณะทั่วไปของระบบการให้คะแนนที่อธิบายไว้ข้างต้น การใช้กฎเกณฑ์ทำให้เราสามารถจำแนกสิ่งต่างๆ เช่น สิทธิ์ด้านเครดิต การระบุทางชีวเคมี การประเมินความเสี่ยงสำหรับผลิตภัณฑ์ประกันภัย ภัยคุกคามด้านความปลอดภัยที่อาจเกิดขึ้น และอื่นๆ อีกมากมาย
ระบบคำแนะนำ/ข้อเสนอแนะ "กฎ" เป็นเพียงข้อมูลอีกประเภทหนึ่ง ซึ่งทำให้เป็นตัวเลือกที่สำคัญสำหรับคำจำกัดความของโปรแกรมอื่น โปรแกรมนี้อาจเป็นระบบผู้เชี่ยวชาญหรือปัญญาประดิษฐ์อื่นก็ได้ ระบบอื่นสามารถจัดการกฎได้เพื่อจัดการกับข้อเท็จจริงประเภทใหม่หรือข้อมูลที่เพิ่งค้นพบเกี่ยวกับโดเมนที่ชุดกฎตั้งใจจะสร้างแบบจำลอง
มีกรณีการใช้งานอื่นๆ อีกมากมายที่จะได้รับประโยชน์จากการใช้ Rule-Engine กรณีข้างต้นเป็นเพียงกรณีที่เป็นไปได้จำนวนเล็กน้อยเท่านั้น
อย่างไรก็ตาม สิ่งสำคัญคือต้องจำไว้ว่า Rule-Engine ไม่ใช่กระสุนเงินแน่นอน มีทางเลือกมากมายในการแก้ปัญหา "ความรู้" ในซอฟต์แวร์ และทางเลือกเหล่านั้นควรใช้ในตำแหน่งที่เหมาะสมที่สุด เราจะไม่ใช้เครื่องมือกฎที่สาขา if
/ else
แบบธรรมดาก็เพียงพอแล้ว
มีอย่างอื่นที่ควรทราบ: การใช้งาน Rule Engine บางอย่างมีราคาแพงมาก แต่ธุรกิจจำนวนมากได้รับคุณค่ามากมายจากการใช้งานเหล่านี้ โดยที่ค่าใช้จ่ายในการดำเนินการจะถูกชดเชยด้วยมูลค่านั้นได้อย่างง่ายดาย สำหรับกรณีการใช้งานที่ซับซ้อนปานกลาง ประโยชน์ของกลไกกฎที่แข็งแกร่งซึ่งสามารถแยกทีมและควบคุมความซับซ้อนทางธุรกิจดูเหมือนจะค่อนข้างชัดเจน
หน้าเอกสารที่นี่
หากต้องการเจาะลึกบทช่วยสอน โปรดดูเอกสาร Wiki ที่นี่บน Github
Loading rules into KnowledgeBase
:
ในการโหลดกฎ 100
ข้อลงใน KnowledgeBase ต้องใช้ 99342047 ns/op
(ใช้ค่าสูงสุด) ซึ่งเท่ากับ ~99.342047ms
และ ( 49295906 B/op
) หน่วยความจำ ~49.295906MB
ต่อการดำเนินการ
ในการโหลดกฎ 1000
กฎลงใน KnowledgeBase ต้องใช้ 933617752 ns/op
(ใช้ค่าสูงสุด) ซึ่งเท่ากับ ~933.617752ms
และ ( 488126636 B/op
) ~488.126636
หน่วยความจำต่อการดำเนินการ
Executing rules against a fact
:
ในการดำเนินการตามข้อเท็จจริงกับกฎ 100 กฎ Grule Engine ใช้เวลาประมาณ ~9697 ns/op
(ใช้ค่าสูงสุดเป็นฐาน) ซึ่งแทบจะไม่อยู่ ~0.009697ms
และ 3957 B/op
ซึ่งค่อนข้างเร็ว
ในการดำเนินการตามข้อเท็จจริงกับกฎ 1,000 กฎ Grule Engine ใช้ ~568959 ns/op
(ใช้ค่าสูงสุดเป็นฐาน) ซึ่งแทบจะไม่อยู่ ~0.568959ms
และ 293710 B/op
ซึ่งค่อนข้างเร็วเช่นกัน
คุณสามารถอ่านรายงานรายละเอียดได้ที่นี่
ใช่. เราต้องการผู้มีส่วนร่วมเพื่อทำให้ Grule ดียิ่งขึ้นและเป็นประโยชน์ต่อชุมชนโอเพ่นซอร์ส
หากคุณต้องการช่วยเราจริงๆ เพียง Fork
โครงการและสมัคร Pull Request โปรดอ่านคู่มือการบริจาคและหลักปฏิบัติของเรา