SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

PHP Rulesでスパゲッティコードをすっきりと

ルールとデータをプログラムコードから分離

ダウンロード サンプルソース (2.9 KB)

RuleContextテキストファイルを作成する

 Boolean型の命題結果を生成するには、Ruleファイル(この場合は、前出のSuitableForScholarShip.rulファイル)と、具体的なケースを記述したRuleContextファイルの両方が必要です。この1つめの例では、RuleContextファイルは、以下のSuitableForScholarShip.txt.conとなります。

# SuitableForScholarShip.txt.con:
studentAnnualAverage EQUALS 8.0
studentIsParticipatingToContest IS true
studentIsGettingFirstPrize IS true
studentIsInHighschool IS true
studentParentsAreAgree IS true

 このファイルからわかるように、RuleContextには、具体的なデータが含まれます。この学生の年間平均成績は8.0で、全国コンテストに出場して優勝した経験があり、高校生であり、学生の両親は奨学金の申請に同意しています。この事実をRuleファイルのロジックに照らし合わせると、この学生には奨学金受給資格があることになります。つまり、命題結果はTRUEとなります。

 2つの例(RuleおよびRuleContextテキストファイルのルールをロードして実行するものと、データベースからのルールをロードして実行するもの)におけるRuleContextデータは、まったく異なることに注意してください。もう1つ異なるのは、.phpスクリプトです。このPHP Rulesの例では、スクリプトcustodian.php(/htdocs/rules/system/application/controllers/rules)に、関数loadTxtloadSqlが含まれています。どちらが呼び出されるかは、モードによって異なります。テキストファイルの例では、ファイル「http://localhost/rules/index.php/rules/custodian/loadtxt/4」を使用し、データベースの例では、「http://localhost/rules/index.php/rules/custodian/loadsql/4」を使用します。以下に示すスクリプトstudent.phpでは、関数loadTxtを呼び出しています。

<?php
class Student extends Controller {
   private $appPhysicalPath = null;
   
   function __construct() {
      parent::Controller();
      $this->load->model('rule/RuleLoader', 'loader');
      // FCPATH is defined in the /index.php file.
      $this->appPhysicalPath = str_replace(
         'index.php', '', str_replace( '\\', 
         '/', FCPATH ) );
      // See whether we can do the same thing with this helper:
      // $this->load->helper('file');
   }
   public function loadTxt($id) {
      $this->load->model(
         'rule/strategy/TxtFileLoaderStrategy', 
         'strategy' );
      $this->loader->setStrategy($this->strategy);
      $data['rule']= $this->loader->loadRule(
         $this->appPhysicalPath . 'data/SuitableForScholarship.rul');
      $data['ruleContext'] = $this->loader->loadRuleContext(
         $this-> appPhysicalPath . 
         'data/SuitableForScholarship.txt.con', $id );
      $data['result'] = $data['rule']-> evaluate($data['ruleContext']);
      $data['ruleText'] = read_file(
          'data/SuitableForScholarship.rul');
      $data['ruleContextText'] = read_file(
          'data/SuitableForScholarship.txt.con');
      $this->load->view('studentview', $data);
   }
}
?>

 暗黙のルール記述を変更するには、スクリプトstudent.phpを、custodian.phpと同じディレクトリ(/htdocs/rules/system/application/controllers/rules)に保存します。

 奨学金受給資格を判定するには、学生の具体的なデータの1つ1つをルール集合と比較する必要があります。ruleview.phpページ(htdocs/rules/system/application/views)を自分のビューページ(この例ではstudentview.php)に置き換え、同じディレクトリに保存します。

 結果を参照するには、ローカルのURLであるhttp://localhost/rules/index.php/rules/student/loadtxt/4を表示します。結果は図4のようになるはずです。

図4 ルールの評価: テキストファイルに格納されたルールデータを評価した場合の出力例
図4 ルールの評価: テキストファイルに格納されたルールデータを評価した場合の出力例

次のページ
データベースからルールを作成し、評価する

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4382 2009/09/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー