計算を行うサンプルプログラム
次に、JBoss Rules を用いた簡単な計算を行うサンプルプログラムを作成します。
このような単純な計算のみをルールベースで行うことは実用上あまりありませんが、ルールベースのプログラミングの特徴をあらわすサンプルとしていくつかをあげてみましょう。
(1) 1から100までを足すプログラム
まず、数を表すクラスNumberFactを作りましょう。これは、Javaのクラスであると同時に、ワーキングメモリ上のファクトにも対応します。
NumberFact.java
package com.sample;
public class NumberFact { private String name; private int number;
public NumberFact(String name, int number) { super(); this.name = name; this.number = number; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getNumber() { return number; }
public void setNumber(int number) { this.number = number; }
//数を加える public void add(NumberFact numFact) { this.number = this.number + numFact.getNumber(); }
//1を足す public void add1() { this.number = this.number + 1; }
}
|
次に、メインプログラムは、以下のとおりです。
DroolsTest.java
package com.sample;
import java.io.InputStreamReader; import java.io.Reader;
import org.drools.RuleBase; import org.drools.RuleBaseFactory; import org.drools.WorkingMemory; import org.drools.compiler.PackageBuilder; import org.drools.rule.Package;
/** * This is a sample file to launch a rule package from a rule source file. */ public class DroolsTest {
public static final void main(String[] args) { try { //load up the rulebase RuleBase ruleBase = readRule(); WorkingMemory workingMemory = ruleBase.newWorkingMemory(); //カウンタの初期設定 NumberFact numFact1 = new NumberFact(“counter”,1); workingMemory.assertObject( numFact1 ); //和 NumberFact numFact2 = new NumberFact(“sum”,0); workingMemory.assertObject( numFact2 ); // ~まで NumberFact numFact3 = new NumberFact(“limit”,100); workingMemory.assertObject( numFact3 ); workingMemory.fireAllRules();
} catch (Throwable t) { t.printStackTrace(); } }
/** * Please note that this is the “low level” rule assembly API. */
private static RuleBase readRule() throws Exception { Reader source = new InputStreamReader( DroolsTest.class.getResourceAsStream( “/Sample.drl” ) ); PackageBuilder builder = new PackageBuilder(); builder.addPackageFromDrl( source ); Package pkg = builder.getPackage(); RuleBase ruleBase = RuleBaseFactory.newRuleBase(); ruleBase.addPackage( pkg ); return ruleBase; }
}
|
1から100までを数えるカウンター(counter)というファクトと、足し算の結果を保持するファクト、足し算の最後の数を表すリミット(Limit)を最初に登録(assert)して、その後ルールを走らせます。
ルールファイルであるsample.drlは以下のとおりです。
sample.drl
package com.sample
import com.sample.NumberFact;
rule “count1” when counter: NumberFact( name == “counter”,num : number) sumFact: NumberFact( name == “sum”, sum : number) then sumFact.add(counter); modify( sumFact ); counter.add1(); modify(counter); end
rule “watch” when NumberFact( name == “limit”, lim : number ) counter: NumberFact( name == “counter”,num : number > lim ) NumberFact( name == “sum”, sum : number) then System.out.println(“sum of 1..”+lim+” = “+sum); retract(counter); end
|
これを実行すると
sum of 1..100 = 5050
という結果が表示されます。