用Drools构建业务规则引擎-中小企业的力量

本文概述

  • 中小企业与IT相遇, 知识转移开始
  • 如果无法进行完整的知识转移怎么办?
  • 规则引擎何时何地有意义?
  • 什么是业务规则引擎?
  • 中小企业如何编写业务规则?
  • 这些规则是什么样的?
  • 流口水和工作记忆
  • 规则评估
  • 流口水规则的” 如果” 方面
  • 组合查询
  • 使用多种对象类型
  • 规则的” 那么” 一面
  • 我们怎么知道什么时候规则被评估为真?
  • 业务规则引擎如何与应用程序交互?
  • 中小企业如何使用规则?
  • SME Custom GUI的元素
  • 规则应存储在哪里?
  • 在现实生活中使用流口水
  • 提交-> 测试
  • 测试-> 面试
  • 面试-> 项目
  • 项目-> 招聘
在软件开发领域工作最令人惊奇的事情之一就是能够在许多不同的行业工作, 特别是如果你是顾问。你在一个行业中工作时所学的大多数软件开发技能都可以直接转移到任何其他行业, 公司, 项目和壁ni中。
我说的是诸如数据库设计, 设计模式, GUI布局, 事件管理等主题。然后, 当然有特定于某个特定行业, 公司或项目的主题。
中小企业与IT相遇, 知识转移开始 这就是主题专家(SME)的来历。SME通常将非常参与项目的设计阶段。
SME已经在行业内工作了很长时间, 了解术语, 并且了解编码背后的业务逻辑。 SME可能对软件开发有所了解, 但这对于项目成功不是必需的。
对于许多项目, 除非软件开发人员对业务逻辑有深入的了解, 否则成功完成软件应用程序将相对困难。根据项目的复杂程度, 知识转移所需的时间会因情况而异。
假设采用敏捷方法, 并且在项目的整个开发阶段都可以使用一个或多个SME, 则知识转移将在项目的所有阶段继续进行。
如果无法进行完整的知识转移怎么办? 根据行业和项目的不同, 中小企业可能无法提供完整的知识转移。
例如, 假设SME是具有25年经验的医生, 而你有6个月的时间来完成一个项目。或者, 将SME想象成具有40年经验的生物学家–不能在现实的时间内为软件开发项目转移这样的知识水平。
但是, 如果知识领域是动态的, 该怎么办?
通常, 会根据时间或功能按设定的时间表发布软件。但是, 某些行业中的业务规则更频繁地更改。
在许多情况下, 可能无法经常发布软件以跟上行业变化的步伐。在这种情况下, 具有在业务规则引擎内外部化业务规则的能力可能很有意义。软件项目能够承受变化的能力将对确保其最终长期成功大有帮助。
规则引擎何时何地有意义? 对于许多软件项目而言, 进行完整的知识转移以及使用诸如C#或Java的计算机语言对业务逻辑进行编码都是可行的。
但是, 在项目的子集中, 对特定主题的理解量很大, 或者业务规则受到很大的更改, 因此对于非程序员而言, 直接访问业务逻辑更有意义。这是本教程的主题。考虑到这一点, 让我们深入讨论规则引擎。
什么是业务规则引擎? 规则引擎是用于执行业务规则的工具。业务规则由事实和条件陈述组成。任何出现在传统业务逻辑中的” 如果-那么” 陈述都被视为业务规则。
用Drools构建业务规则引擎-中小企业的力量

文章图片
例如:如果一名员工连续5天以上患病并且没有医生的便笺, 则需要对其进行书写。如果超过6个月未与业务伙伴联系, 并且在此期间未进行任何购买, 则可能是时候向他们发送一封亲切的电子邮件。如果患者体温高, 视力有问题, 并且有青光眼的家族史, 那么可能是时候要求进行额外的MRI或其他检查了。
中小企业如何编写业务规则? IT不会期望SME学习Java, C#或其他编程语言, 而是会为其创建一种迷你语言来表达其业务规则。这些规则的组成部分将包含可以查询的事实。行业/实践领域的一些事实示例包括:
  • 人力资源:薪资, 职位, 经理, 在公司工作的年限
  • 医疗:温度, 血压, 当前用药
  • 财务:当前股价, 52周最高/最低价格, 市盈率, 下一次发布收益的日期
本质上, 必须以简化的方式向中小企业提供做出业务决策所需的信息。
这些规则是什么样的? 在本规则引擎教程的其余部分中, 我将使用Drools, 这是一个基于Java的开源规则引擎, 可以在www.drools.org上找到它, 它是一个JBoss项目。在Drools中, 规则被编写为Java代码, 并具有以下结构:
导入语句转到此处:
rule "Name of rule" when "The if" part of the business logic goes here. then The "then" part of the business logic goes here. end

流口水和工作记忆 Drools采用了一种称为” 工作记忆” 的概念。
应用程序代码将负责将适当的事实加载到工作内存中, 以便SME可以编写查询这些事实的规则。仅将与应用程序业务逻辑相关的事实加载到工作内存中, 以使规则引擎保持最高速度运行。
例如, 如果应用程序正在确定是否批准客户贷款, 则相关事实将包括薪水, 信用评分和未偿还贷款。不相关的事实包括星期几或性别。
规则评估 在Drools Working Memory中加载了规则和事实后, 将根据规则的” then” 部分对规则进行评估。如果” then” 部分评估为true, 则将执行规则的” when” 部分。
通常, 可以将所有规则同时评估, 尽管可以将规则分组在一起并在每个组的基础上进行评估。规则的” 然后” 部分可以更改工作记忆的内容。发生这种情况时, Drools将重新评估所有规则, 以查看现在是否有任何规则评估为true。如果是这样, 将执行其” 何时” 部分。
规则评估的这种递归性质可以是一种祝福, 也可以是一种诅咒–因此, 在创建规则时必须牢记这种架构。
流口水规则的” 如果” 方面 在Drools中, 事实由对象表示。可以查询对象类型的存在或不存在。此外, 还可以查询对象的属性。
这里有一些例子:
确定雇员的收入是否超过100, 000。
Employee(salary > 100000)

确定患者的胆固醇水平是否大于200, 并且正在服用立普妥。
Patient(cholesterol > 200, medications.contains("lipitor"))

确定股票价格是否在其年度最高价的1%以内。
Stock(price > = (yearHigh * .99))

组合查询 在编写复杂的业务逻辑时, 业务规则可以使用布尔运算符AND, OR和NOT组合查询, 并使用括号进行嵌套。
例如:
确定是否有一位经理的年薪低于75, 000美元, 或者一位董事的年薪低于100, 000美元。
Employee(position.Equals("Manager"), salary< 75000) OR Employee(position.Equals("Directory"), salary< 100000)

使用多种对象类型 到目前为止, 所有示例都基于单个对象类型, 例如Employee或Patient。但是, Drools允许查询基于多种对象类型。
例如:
确定客户的薪水是否高于$ 50, 000且未申请破产。
Customer(salary> 50000) AND not exists Bankruptcy()

规则的” 那么” 一面 【用Drools构建业务规则引擎-中小企业的力量】规则的” 当时” 部分确定了规则的” 时间” 部分中至少有一个结果时将发生的情况。
在Drools中, 任何可以用Java编写的内容都可以写在规则的” then” 部分中。但是, 为了使规则更可重用, 通常最好不要在规则中放置任何I / O, 流控制代码或常规执行代码。
或者, 规则的” then” 部分可用于修改工作记忆。一种常见的做法是在规则被评估为真时将事实插入工作存储器。
例如:
rule "LoanApproved" when Customer(credit> 700) & & not exist LoanOutstanding() then insert(new LoanApproval()) end

我们怎么知道什么时候规则被评估为真? 触发所有规则后, 应用程序需要知道哪些规则评估为真。如果规则在评估为true时将对象插入工作内存中, 则可以编写代码以查询那些对象的工作内存。
在上面的示例中, 在触发所有规则之后, 可以进行查询以查看LoanApproval()对象是否在工作内存中。
query "GetLoanApproval " $result: LoanApproval() end

业务规则引擎如何与应用程序交互? 典型的应用程序包含业务逻辑, GUI, I / O和控制代码流。
例如, 应用程序可以像这样处理用户请求:
GUI ? Flow Control ? I/O ? Business Logic ? I/O ? Flow Control ? GUI

嵌入规则引擎可为该过程添加一些步骤:
GUI ? Flow Control ? I/O ? Create Rules Engine Session ? Add Facts to Working Memory ? Fire Rules ? Determine which rules have evaluated true ? I/O ? Flow Control ? GUI

中小企业如何使用规则? 创建, 编辑和删除规则
为了使中小型企业遵守规则, 他们将需要一个用户友好的GUI。一些业务规则引擎附带了这样的接口。
例如, Drools附带了两个我认为用户友好的GUI。第一个类似于电子表格, 允许中小企业创建规则而无需编写任何实际代码。第二个GUI允许创建更复杂的业务逻辑。
尽管这两个GUI都有助于输入简单的条件, 但随着业务逻辑变得更加复杂, 它们将无法工作。在这种情况下, 你将必须创建自己的自定义GUI。
SME Custom GUI的元素 为了使SME有效工作, 请考虑创建具有以下功能的自定义GUI:
  • 语法检查器–” 检查语法” 按钮可以调用Drools代码以检查可能的错误及其行号。
  • 拖放-与其让SME记住可供他们使用的对象和属性, 不如考虑为他们提供一个可以从中拖放的选择列表。
  • Web界面–中小企业可以使用瘦客户端界面, 而无需担心发行问题。由于GUI需要其他功能和常规维护, 因此这将很方便。
  • 规则测试器–能够在不与整个应用程序交互的情况下测试单个规则的能力将大大提高SME的生产率。允许SME GUI确定事实, 然后启动个别规则。
规则应存储在哪里? 在Drools中, 通常有两种存储规则的方法。 Drools使用基于文件的规则开箱即用, 该文件通常具有.drl扩展名。
当规则数量较少时, 此方法效果很好。随着规则数量的增加, 你将需要使用数据库。从数据库存储和检索规则需要进行更多工作, 但是应该为你提供更易于管理的体系结构。
该规则引擎教程仅涉及Drools规则语言的一小部分。有关完整说明, 请查阅官方参考文档。
使用规则引擎的决定不应轻易做出。虽然规则引擎将使你的应用程序更易于中小企业扩展, 但开发, 测试和部署也将变得更加复杂。有关此主题的其他注意事项, 你可能需要查看以下准则。
现在, 我们可以继续向你展示一些更有趣的东西–一个实际的Drools实际示例, 在大多数srcmini博客读者都应该熟悉的用例中。
在现实生活中使用流口水 srcmini是高级软件开发人才的领先提供商, 目前使用申请人追踪软件来引导求职者进入招聘过程的各个阶段。这是此过程的简化直观流程图:
用Drools构建业务规则引擎-中小企业的力量

文章图片
当前, 用于确定申请人是否将继续进行招聘过程的业务逻辑已硬编码到软件中。每当人力资源部门需要更改业务逻辑时, 他们都必须涉及IT。他们希望能够直接更改其软件的运行方式。
将修改申请人跟踪软件, 以在招聘过程中的每个决策点运行HR提供的规则。人力资源部将有一个” 应聘者” 对象, 代表应征者, 其身份刚刚通过初次录入, 完成在线考试或许多其他因素而被修改。候选对象将具有表示经验, 测试分数, 面试分数等的字段。
以下示例提供了一组简化的规则供你考虑。它尚未部署, 只是一个由四个相互关联的规则组成的简单示例:
  • 提交-> 测试
  • 测试-> 面试
  • 面试-> 项目
  • 项目-> 招聘
提交-> 测试 基于当前客户的需求, HR希望编写一条规则, 以确定是否应安排候选人进行在线测试。
Rule "Schedule For Testing" when $candidate: Candidate(status=='Submitted', yrsExperience > = 10, skill(name=='Java', yrsExperience> =5) or Skill(name=='C#', yrsExperience> =5)) then $candidate.setStatus('Testing'); end

测试-> 面试 候选人参加在线考试后, 需要评估其分数。人力资源部也希望对此规则有控制权。在线考试测试考生了解软件开发理论, 问题解决和语法的能力。人力资源部想决定哪种分数组合将使候选人被考虑进行技术面试。
Rule "Schedule For Interview" when $candidate: Candidate(status=='Testing', testScore(theory> .8 & & syntax> .6 & & problemSolving> .8); then $candidate.setStatus('Interview'); end

面试-> 项目 技术面试将测试候选人说出自己的经历, 回答问题解决问题的能力, 并将测试他们的总体沟通能力。人力资源部将写出确定技术面试合格分数的规则。
Rule "Schedule For Project" when $candidate: Candidate(status=='Interview', interviewScore(speakExperience> .9 & & problemSolving> .8 & & communication> .9 ); then $candidate.setStatus('Project'); end

项目-> 招聘 如果候选人通过了技术面试, 他们将获得离线编程项目。他们将提交项目, 并对其完整性, 体系结构和GUI进行评审。
Rule "Schedule For Hiring" when $candidate: Candidate(status=='Project', projectScore(completeness> .8 & & architecture> .9 & & gui> .7 ); then $candidate.setStatus('Hiring'); end

如你所见, 即使这个基本示例也为HR提供了许多可能性, 并且可以简化操作。人力资源可以更改规则而不必在流程中涉及IT的事实将不可避免地节省时间并加快筛选过程。
由于可以随时更改规则, 因此人事部门也将具有更大的灵活性。例如, HR可以通过设置不同的参数来扩展或限制选择过程。
如果在所有正确的方框中打勾的候选人太多, 则可能会在几分钟之内提高标准, 从而减少候选人的数量。或者, 如果流程产生的候选人很少或没有满足所有要求的人选, HR可以选择降低或降低某些标准, 将重点转移到更相关的技能上, 直到有足够数量的候选人满足要求。

    推荐阅读