找回密码
 FreeOZ用户注册
查看: 3193|回复: 3
打印 上一主题 下一主题

[新技术交流] R++: Rule based programming in C++

[复制链接]
跳转到指定楼层
1#
发表于 8-5-2009 13:46:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x

                               
登录/注册后可看大图

R++ , 来自Bell实验室的C++扩展, 如上图所示R++在C++ OOP的基础上增加了一个Rules维度,使得可以在C++的class中定义规则和基于规则的动作。如果你对Java很熟悉的话,应该听说过一个Drool的软件包,其用XML的方式时间了Java的商业规则引擎,而R++就是采用了C++的方式实现了Drool所做的事情。

附件为R++用户手册和R++的一个简单例子, 同样的例子如果用Drool来表达的话应该像下面这个样子:
  1.   <rule name="update area">  
  2.      <parameter identifier="rectangle">  
  3.        <class>Rectangle>  
  4.      parameter>  
  5.       
  6.      <java:condition>  
  7.        rectangle.height > 0 && rectangle.width > 0
  8.      java:condition>  

  9.      <java:consequence>  
  10.        stockOffer.area = rectangle.height * rectangle.width;
  11.      java:consequence>  
  12.    rule>  
复制代码


R++写出来的是这样:
Rectangle.rh
  1. class Rectangle {
  2. private:
  3.     monitored int height, width;
  4.     int area;
  5. public:
  6.     Rectangle(int h, int w) : height(h), width(w) {}
  7.     add_to_height(int delta) { set_height(height + delta); }
  8.     rule update_area;
  9.     friend ostream& operator<<(ostream&, Rectangle * const);
  10. };
复制代码


Rectangle.rC

  1. #include <iostream.h>
  2. $include "Rectangle.rh"

  3. rule Rectangle::update_area {
  4.     height > 0 &&
  5.     width > 0
  6.        =>
  7.     area = height * width;
  8. }

  9. ostream& operator<< (ostream& s, Rectangle * const p) {
  10.     return s << "Rectangle " << p->height << " * "
  11.                  << p->width << " = "
  12.                   << p->area;
  13. }
复制代码

UserManual.pdf

3.7 MB, 下载次数: 15

评分

参与人数 1威望 +30 收起 理由
ubuntuhk + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

2#
 楼主| 发表于 8-5-2009 13:57:57 | 只看该作者
基于规则的编程(RBP) 可以应用在以下场景中:


  • 使用独立于模型的规则来维护模型的完整性,规则可以独立于模型变化
  • 使用规则监测物理系统(如电话交换机), 用规则检测状态变化,并对变化做出响应或者进行状态转移 (这就有点像状态机或者状态模式了)
  • 使用规则定义配置变更或者商业逻辑
  • 用于软件的异常和错误处理 (exception的替代品)


基于规则的编程的优点:
  • 程序变得更清晰或稳固, 由于所有辅助性任务都被规则剥离与主逻辑之外, 避免了代码污染,规则的增删改也可以独立进行,不会混杂在主 要代码中间
  • 比OOP更适合编写复杂软件
  • 弥补需求和设计之间的鸿沟, 对于需求中的约束,策略,行为更可以很自然地映射为一个个的规则。
回复  

使用道具 举报

3#
 楼主| 发表于 8-5-2009 14:12:40 | 只看该作者
PS:比较成熟的商业版的C++规则引擎我知道的事ILOG Rules for C++ : http://www.ilog.cn/products/rules/index.php, 这个规则引擎同时也可以用于Java。
回复  

使用道具 举报

4#
发表于 8-5-2009 14:19:25 | 只看该作者
挺有用的,用R++做状态机确实是个不错的选择
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 3-8-2026 13:24 , Processed in 0.015185 second(s), 23 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表