`
hxpwork
  • 浏览: 109810 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论
阅读更多
 

编写更好的规则 <o:p></o:p>

作者: Edson Tirelli <o:p></o:p>

我们所常见的一个问题是“我怎样编写更好的规则?”,或者类似的问题<o:p></o:p>

  • 我做错了什么?我有如此多过程代码在规则中…<o:p></o:p>
  • 我怎样调用一个特定的规则?(它来自于两类用户:使用反向推导的规则引擎或者习惯于使用过程代码<o:p></o:p>
  • 我如何在一个集合中遍历?<o:p></o:p>
  • 我如果在LHS中执行一个操作?<o:p></o:p>

所有上面的问题暴露出对声明式编程的误解或缺少正向推论引擎知识。
免责声明:这里没有负面的评判。这只是一个知识体系,对于那些使用规则的人们,需要对此有更深入的研究。我们需要使它易于被人们所理解并了解声明式编程的原理。<o:p></o:p>

就像所说的那样,我们都知道编写规则是一个创造性的工作,不是说只有一条路来完成它。这里没有所谓对和错,只有说更好或更糟的方法。

<o:p></o:p>

因此我尝试给出一些提示关于如何通过一些症状判读你的规则中有一些不好的因素,以及怎样改进规则以去除这些症状。

<o:p></o:p>

症状

1.
太多的过程代码:
如果你的规则需要建立几个函数,或者推论部分过于复杂,它可能就是规则出现问题的信号。规则被认为是一种声明式描述模式,将在fact中查询并且当模式匹配后推论被认为是一系列顺序执行的动作。<o:p></o:p>


2.
在推论中有流控制结构:
如果你的规则在推论中包含流控制结构,比如ifswitch,那很有可能你的规则有严重问题。循环结构如forwhile可能在极少数情况下需要用到,但是他们通常也代表规则存在一定问题。<o:p></o:p>


3.
多余的eval():
用我的话来说:“Eval是魔鬼”。Eval是非常灵活的条件元素,但是它也是一个大问题。从开始用它,如果广泛的使用,你的规则将变得不可读。同样,因为你可以在Eval中做几乎任何事情,引擎无法对它做任何假设,因此也很难提供任何优化。在Drools3.0.X中,在某些情况下需要使用eval,但是从<st1:chmetcnv w:st="on" tcsc="0" unitname="m" sourcevalue="3.1" numbertype="1" negative="False" hasspace="False">3.1M</st1:chmetcnv>1以后,我们提供了很多语言表达式的很多改进,减少了很多需要使用eval的情况。因此如果你使用了许多eval表达式,那可能可以对此进行改进。<o:p></o:p>


如何改进规则

1.
业务领域建模:
可能你需要担心的最重要一点是怎样表现你的业务领域模型。一个简单的类推是将它与数据模型和RDMS系统相比较:我们都知道性能、简易性和SQL查询的效率是直接依赖于数据模型的质量。同样的原因,规则的性能、简易性和规则的效率直接依赖于业务模型的质量。不同的规则引擎对业务模型有不同的表现方式,但是根本上来说,你的业务模型将是你的业务本体的实现。从另一方面来说,你知道你的业务是什么,它运行的需求是什么并且需要从你的信息系统中了解什么。因此,使用你的规则引擎语言对本体进行正式的描述。DroolsJava面向对象模型紧密合作,但是它也允许你使用决策表、DSL或你为之提供驱动的其它语言定义更高层次的模型(如Mark关于CLIPS的描述)。<o:p></o:p>

因此,下面是你如何在规则中应用好的模式的一些提示;<o:p></o:p>

  • 使用平面模型要比深层嵌套模型更好。通常对于平面模型来说编写规则更容易。<o:p></o:p>

<o:p> </o:p>

  • 对规则中将提出的问题先问问自己,是否你可以通过使用业务模型进行回答。如果答案是混乱的,那重构你的模型,再次尝试回答。简单的例子:你的规则将应用在订单,产品以及订单中的产品(让我们称之为项目)上。那么,你的模型是否允许你了解订单?是否容易知道订单中的项目?是否容易了解订单中每个项目的产品明细?如你看到的,这与我们设计数据模型是相似的练习。<o:p></o:p>

<o:p> </o:p>

  • 使用自然语言编写你的规则。在你的规则中定义所有对象的引用。对每一个对象定义所有的引用属性。对每一个属性,定义所有该属性可以应用的约束条件。现在检查一下是否你的业务领域模型包含这些对象(fact)以及这些属性,以及是否它可以在这些属性类型上应用这些约束。它看起来好像我们在这里进行面向对象的分析,但它并不是完全一样;我们在更高的概念层次上进行讨论,因为无论你使用什么工具,它需要同样的信息,不管它是基于OO,模板甚至更高级的DSL<o:p></o:p>

2. 了解你的工具:
显然,了解你所使用的工具以及怎样用工具提供的功能(文本语言,数据表,Web接口或其它什么)来表达知识是有益的。学习工具将花费时间与精力,但它是值得的。你将使用高级特性来编写更好更简单的规则。举一个简单的例子:我经常看到人们使用Eval或函数来编写约束,在Drools中如果能够使用一种更简单的模式约束,那会更加有效率并提高性能。(记住:Eval是魔鬼!)<o:p></o:p>


3.
将所有对象作为fact设置:

<o:p></o:p>

规则引擎通常知道怎样处理fact的相当繁重的装载任务,因此让引擎去发挥它的魔法。如果你想在一个嵌套的对象集合上进行推论,那么将所有的对象都设置到working memory中,不只是顶级的对象,并且确认你的业务模型在它们之间建立了关联。在那之后,编写规则将更加容易,并且引擎能够优化执行效率(对比使用Eval或其它深层次嵌套结构访问)。例如:如果你有一个Order对象包含OrderItem列表,将OrderOrderItem都设置到引擎中(如果你需要在OrderItem上进行推论)。<o:p></o:p>


所有以上的建议都会有例外情况,但是对于常见请况,遵守上面的简易可以帮助你编写更好的规则。<o:p></o:p>



<o:p></o:p>

<o:p> </o:p>

分享到:
评论
1 楼 free007 2007-12-21  
很好!!!

相关推荐

    安全代码规则编写指南[整理].pdf

    "安全代码规则编写指南" 根据给定的文件信息,...《安全代码规则编写指南》提供了一个详细的指导,帮助开发者编写更加安全和可靠的代码,并提供了一些相关的概念和知识点,以便开发者更好地理解和应用安全代码规则。

    linux 下Makefile 编写规则

    Linux 下 Makefile 编写规则 Makefile 是一个帮助程序员构建项目的工具,它按照项目的需求个性化的定义自己的构建过程。...本文详细介绍了 Makefile 的编写规则和实践,希望能够帮助开发者更好地使用 Makefile 工具。

    F5-iRule规则编写详解.ppt

    本文还提供了多个iRule的实践案例,例如基于HTTP请求的iRule、基于手机号码的iRule、基于URI的iRule等,这些案例都可以帮助用户更好地理解iRule的应用场景和编写方法。 F5-iRule规则编写详解是关于iRule的详细介绍...

    flash语法编写规则的技巧经验详解.doc

    -flash 语法编写规则的技巧经验详解 Flash 动画中的 ActionScript 语言是 Flash 的脚本语言,...掌握 flash 语法编写规则的技巧经验是非常重要的,它可以帮助你更好地编写动作脚本语言,创作出具有强交互性的动画。

    论文研究-电子目录的SWRL规则研究.pdf

    现有电子目录及标准只是产品分级概念和属性的结合,不能进行基于规则推理的智能化服务,使用SWRL编写电子目录本体的产品关联规则,可以更好地提供基于规则推理的电子目录服务。主要在电子目录标准、本体论和语义Web...

    eslint-plugin-clean-regex:ESLint插件,用于编写更好的正则表达式

    eslint-plugin-clean-regex 一个ESLint插件,用于编写更好的正则表达式。关于这是一个插件,用于对JavaScript正则表达式进行。 它的目的是通过指出错误并提出改进建议,帮助初学者和专家编写更好的正则表达式。 该...

    《有趣的测量(不规则物体体积的测量方法)》编写说明及教学建议(1).doc

    这些教学策略可以帮助老师更好地理解丈量不规则物体体积的方法,并掌握实践中的问题解决能力。 "有趣的测量(不规则物体体积的测量方法)" 本节课的主要内容是丈量不规则物体体积的测量方法。教师可以使用多种方法...

    嵌入式C语言编程规则

    嵌入式C语言编程规则,如何更好的编写一个嵌入式程序。

    SOP编写方式和技巧_生产工位SOP标准作业指导书操作模板样本培训课件PPT文件流程步骤.ppt

    "SOP编写方式和技巧_生产工位SOP标准作业指导书操作模板样本培训课件PPT文件流程步骤.ppt" ...本资源还提供了SOP编写工作的实践经验和技巧,旨在帮助生产企业更好地实施SOP编写和实施,提高生产的质量和效率。

    EPA中文编程PHP工具(中文编写php工具)绿色免费版

    EPA中文开发php工具一款中文编写php的工具,免去英文代码给大家带来的烦恼,操作简洁明了,可视化编程,可以为大家免费的提供定义支持库,开发SDK等功能,方便大家可以更好的编写php的程序。 注意事项 规则 1:绝...

    makefile编写

    让人觉得庆幸的是,你可以有更好Method,当你学会了写Makefile后,你就再也不用天天手动 输入编译指令来编译你的program了.Makefile是一个遵循特殊规则的文本文件,跟make工具一起可以帮助你自 动创建和管理你的工程.

    LabVIEW编程样式规则[借鉴].pdf

    编写良好的需求说明有助于实现更好的 LabVIEW 样式。没有预见到的应用程序范围变化会损害良好的设计样式。维护一个 LabVIEW 项目日志,撰写一个需求说明文档,在全部概念验证中保持良好的 LabVIEW 样式。存档 ...

    INCOSE需求编写的指南.doc

    基本原理是,如果在需求中描述如何实现至少有以下不良影响:错过考虑其他更好的实现方式的机会;不能解决真正的问题。 策略是,捕获那些在任何方案中都必须正确满足的功能、特征与约束。一个很有用的提问——“需求...

    FORM个性化学习笔记.doc

    学习者需要掌握规则头的编写和应用技术,以便更好地设计和开发FORM。 2. 上下文 上下文是FORM个性化中的一个重要概念,用于存储和管理FORM的数据。学习者需要了解上下文的作用和应用,以便更好地设计和开发FORM。 ...

    SQL编写规范(数据库操作规范)

     EXPLAIN PLAN是一个很好的分析SQL语句的工具,它可以在不执行SQL的情况下分析语句    通过分析,我们就可以知道ORACLE是怎样连接表,使用什么方式扫描表(索引扫描或全表扫描),以及使用到的索引名称    按照...

    模糊控制算法程序(MATLAB编写)

    用MATLAB编写的离散模糊控制程序,结合本程序,我相信能能更快更好的理解模糊控制算法。算法在MATLAB Version: 7.14.0.739 (R2012a)运行无误。 function [FCU_T1,FCU_T2,FCU_T3,FCU_T4]=fuzzy_table(Me,Mec,Mu,UC) ...

    万字+28张图带你探秘小而美的规则引擎框架LiteFlow.doc

    LiteFlow 是一个轻量、快速、稳定的组件式规则引擎框架,旨在解耦复杂业务逻辑,帮助开发者更好地管理和维护业务流程。下面是 LiteFlow 的一些重要知识点: 1. LiteFlow 的设计原则:LiteFlow 是基于工作台模式设计...

    如何编出健壮的代码,java编程30条规则

    规则 12: 避免使用“魔术数字”,这些数字很难与代码很好地配合。这条规则对常数的使用进行了规定,帮助开发者写出更加易读易维护的代码。 规则 13: 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何...

    脚本批量生成工具,从Excel生成脚本

    项目开发过程中,会做一些重复度较高的开发工作(表结构设计、生成...如何与公司开发框架summer2.0更好的结合起来? 制定一个规则去编写excel文件。再编写一个工具去分析有规则的excel文件,一次生成需要的多种脚本。

    C语言函数的编写技巧(1)[归纳].pdf

    在软件开发中,函数的编写技巧是非常重要的,好的函数编写技巧可以提高代码的可读性、可维护性和可扩展性。本文将总结C语言函数的编写技巧,帮助开发者提高编程效率和代码质量。 函数的编写技巧可以归纳为以下几个...

Global site tag (gtag.js) - Google Analytics