10分钟阅读

建立商业规则发动机与口流说 - 给人们的权力

作为工程师,PM和杰夫导演30多年'S致力于金融,娱乐,制造和医疗技术等。

最令人惊叹的事情之一 在软件开发中工作 是在许多不同行业工作的能力 - 特别是如果你是顾问。您在一个行业内工作的大多数软件开发技能直接可转让给任何其他行业,公司,项目和利基。

我正在谈论数据库设计等主题, 设计模式, 吉伊布局,事件管理等等,当然,有特定于一个特定行业,公司或项目的主题。

中小企业符合它,知识转移开始

这是主题专家(中小企业)进入的地方。中小企业通常会参与项目的设计阶段。

中小企业在行业内工作了很长一段时间,了解了Lingo,并了解编码背后的业务逻辑。中小企业可能对软件开发有所了解,但这对该项目取得成功不是必需的。

对于许多项目,除非软件开发人员对业务逻辑有很大的了解,否则完成成功的软件应用程序将相对困难。需要花费所需的知识转移的时间将根据项目的复杂性而差异。

假设拍摄了敏捷方法并在项目的开发阶段提供了一个或多个中小企业,在项目的所有阶段都将继续进行知识转移。

如果完整的知识转移是什么不可行的?

根据行业和项目,中小企业可能无法提供完整的知识转移。

例如,想象一下,如果中小企业是一个拥有25年经验的医生,你有6个月的时间来完成一个项目。或者,想象中小企业作为一个拥有40年的经验的生物学家 - 这种知识水平无法在软件开发项目的现实时间范围内转移。

但如果知识区域是动态的?

通常,软件基于时间或特征在设定的计划上释放。但是,某些行业内的业务规则更频繁地变化。

在许多情况下,根据需要释放软件可能是不可行的,以便跟上行业变化。具有在业务规则引擎中外化业务规则的能力可能在这种情况下有意义。能够抵御更改的软件项目的能力将有很长的路要防,以确保其最终的长期成功。

规则发动机的时间和地点有意义?

对于许多软件项目来说,可以进行全面的知识转移,以及以C#或Java等计算机语言编码的业务逻辑是可行的。

但是,有一个项目的子集,其中特定主题的理解量如此大,或者业务规则受到如此多的改变,使得非程序员能够直接访问业务逻辑。这是本教程的主题;考虑到这一点,让我们深入地讨论规则引擎。

什么是企业规则引擎?

规则引擎是一种执行业务规则的工具。业务规则由事实和有条件陈述组成。传统业务逻辑中出现的任何“if-then”语句都作为业务规则获得。

业务规则发动机

例如: 如果 一名员工在一排超过5天内生病,没有医生的票据, 然后 他们需要写成。 如果 在6个月内没有联系商业助理,并在此期间没有购买, 然后 它可能是时候向他们发送了一个亲切的电子邮件。 如果 患者具有高体温,视觉问题,并且有葡萄糖的家族史, 然后 可能是时候要求额外的MRI或其他测试了。

中小企业如何写业务规则?

而不是期待中小企业 学习java.,C#或另一种编程语言,它将为他或她创建一个迷你语言来表达他们的业务规则。这些规则的构建块将由可以查询的事实组成。行业/练习领域的事实的一些例子是:

  • 人力资源:薪酬,职位,经理,与公司年份
  • 医疗:温度,血压,目前用药
  • 金融:当前股票价格,52周最高/最低价格,P / E比率,下一次收益发布日期

基本上,制定业务决策所需的信息必须以简化的方式向中小企业提供。

这些规则是什么样的?

对于此规则的其余部分引擎教程,我将使用Drools,这是一个基于开源Java的规则引擎,可以在www.drools.org上找到,并且是一个jboss项目。在口水中,规则被写为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工作内存之后,根据其规则的“然后”部分评估规则。如果“那么”部分评估为true,则“当”部分“规则之后会被执行。

通常,所有规则一次都会一次性评估,尽管可以将规则分组在一起并按每个组进行评估。 “然后”规则的一部分可以更改工作内存的内容。发生这种情况时,口交将重新评估所有规则,以查看是否有任何规则,请达到真实。如果是这样,他们的“当”部分“部分将被执行。

规则评估的递归性质可以是祝福或诅咒 - 因此需要考虑到这种架构的规则。

流口水规则的“如果”一侧

在口水中,事实由对象表示。可以查询对象类型的存在或不存在。此外,还可以查询对象的属性。

这里有一些例子:

确定员工是否超过100,000。

Employee(salary > 100000)

确定患者是否具有大于200的胆固醇水平,并服用Lipitor。

Patient(cholesterol > 200, medications.contains(“lipitor”))

确定股票价格是否在其年度高的1%内。

Stock(price >= (yearHigh * .99))

结合查询

在编写复杂的业务逻辑时,业务规则可以通过使用布尔运算符和使用括号来组合查询。

例如:

确定是否有超过75,000美元的经理或董事不到10万美元。

Employee(position.Equals(“Manager”),salary<75000) OR Employee(position.Equals(“Directory”),salary<100000)

使用多个对象类型

到目前为止,所有的例子都基于单一对象类型,例如员工或患者。但是,口流量允许查询基于多种对象类型。

例如:

确定客户是否有高于50,000美元的薪水,并没有提出破产。

Customer(salary>50000) AND not exists Bankruptcy()

“那么”一方的规则

规则的“然后”一侧确定当“当”某一规则“中的一个结果中的结果时会发生什么。

在口水中,可以用java写入的任何东西都可以用“那么”的一部分编写。但是,为了使规则更加可重复使用,通常是一个好主意,不会在规则中放置任何I / O,流量控制代码或一般执行代码。

作为替代方案,规则的“然后”部分可用于修改工作存储器。常见做法是当规则被评估为true时将事实插入工作存储器中。

例如:

rule “LoanApproved”
when
        	Customer(credit>700) && not exist LoanOutstanding()
then
        	insert(new LoanApproval())
end

我们如何知道规则何时评估为真实?

在所有规则解雇后,应用程序需要知道哪些规则评估为真实。如果规则将对象插入工作内存时评估为true时,可以写入代码以查询这些对象的工作内存。

在上面的示例中,在触发所有规则之后,可以进行查询以查看loanapproval()对象是否处于工作存储器中。

query "GetLoanApproval "
        	$result: LoanApproval()
end

业务规则引擎如何与应用程序进行互动?

典型应用程序包含业务逻辑, 吉伊,I / O和控制代码流。

例如,应用程序可以处理如下所示的用户请求:

吉伊 ? Flow Control ? I/O ? Business Logic ? I/O ? Flow Control ? 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。一些业务规则用这种界面发动机。

例如,流口水用两个GUI船只,我发现用户友好。第一个类似于电子表格,并允许中小企业创建规则而不进行任何实际代码。第二个GUI允许创建更复杂的业务逻辑。

虽然这两个GUI都能有助于进入简单的条件,但是由于业务逻辑变得更加复杂,因此它们无法正常工作。在这种情况下,您必须创建自己的自定义GUI。

中小企业定制GUI的元素

为了使中小企业有效地工作,考虑使用以下功能创建自定义GUI:

  • 语法检查器 - “检查语法”按钮可以调用Drools代码来检查可能的错误及其行号。
  • 拖放 - 而不是要求中小企业记住它们可用的对象和属性,请考虑为它们提供一个选择列表,他们可以从中拖放和删除。
  • Web界面 - 将在没有分发问题的情况下使用瘦客户端界面。随着GUI需要额外的功能和一般维护,这将派上用场。
  • 规则测试仪 - 具有在不与整个应用程序中连接的情况下测试单个规则的能力将大大提高中小企业的生产力。允许中小企业GUI确定事实,然后消除单个规则。

在哪里存储规则?

在口水中,通常有两种方法来存储规则。 Drools在具有基于文件的规则中的框中工作,通常会有.drl扩展。

当规则数量小时,这会很好。随着规则的数量增长,您将想要使用数据库。从数据库中存储和检索规则需要更多的工作,但应该为您提供更管理的架构。

本规则引擎教程仅触及了流口语规则语言的一小部分。有关完整说明,请咨询 官方参考文件.

使用规则引擎的决定不应轻易发生。虽然规则引擎将由中小企业更广泛地使您的应用程序更加扩展,但也将变得更加复杂于开发,测试和部署。有关此主题的其他注意事项,您可能需要 查看以下指南 .

现在,我们可以继续向您展示一些更有趣的事情 - 在大多数顶尖博客读者应该找到熟悉的用例中,这是一个简单的真实实例。

在现实生活场景中使用口水

Toptal是一家高级软件开发人才的领先提供商,目前使用申请人跟踪软件通过招聘过程中的各个阶段采取求职者。以下是此过程的简化视觉流程图:

流口水

目前,要决定申请人是否将继续在招聘过程中持续的业务逻辑已被硬编码到软件中。每次人力资源都需要改变业务逻辑,他们必须涉及它。他们希望能够直接改变他们的软件运行方式。

申请人跟踪软件将被修改为在招聘过程中的每个决策点处运行HR提供的规则。人力资源将有一个“候选人”对象,该对象将代表求职者,其状态刚刚通过初始入境,在线考试完成或许多不同因素进行修改。候选对象将具有表示经验,测试分数,面试分数等的字段。

以下示例介绍了用于您的考虑的简化规则。它尚未部署,这只是一个由四个互连规则组成的简单示例:

  • 提交 - > Testing
  • 测试 - > Interview
  • 面试 -> Project
  • 项目 -> Hiring

提交 - > Testing

基于当前客户端的需求,人力资源撰写规则,该规则将确定是否应安排候选人进行在线测试。

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

测试 - > Interview

候选人采取了在线考试后,需要评估他们的分数。 HR也希望控制此规则。在线考试测试,了解候选人理解软件开发理论,问题解决和语法的能力。人力资源愿意决定分数的组合将使候选人能够考虑进行技术面试。

Rule “Schedule For Interview”
when
	$candidate: Candidate(status=='Testing', testScore(theory>.8 && syntax>.6 && problemSolving>.8);
then
	$candidate.setStatus('Interview');
end

面试 -> Project

技术面试将测试候选人谈论其经验的能力,回答问题解决问题,它将测试他们一般沟通的能力。人力资源将写下确定技术面试的传递得分的规则。

Rule “Schedule For Project”
when
	$candidate: Candidate(status=='Interview', 	interviewScore(speakExperience>.9 && problemSolving>.8 && communication>.9 );
then
	$candidate.setStatus('Project');
end

项目 -> Hiring

如果候选人通过了技术面试,他们将获得一个离线编程项目。他们将提交项目,并将判断完整性,架构和GUI。

Rule “Schedule For Hiring”
when
	$candidate: Candidate(status=='Project', projectScore(completeness>.8 && architecture>.9 && gui>.7 );
then
	$candidate.setStatus('Hiring');
end

正如您所看到的,即使是这个基本示例也为HR提供了许多可能性,它可以简化操作。 HR可以改变规则的事实而不涉及该过程,这将不可避免地节省时间并加快筛选过程。

由于规则可以在飞行中改变,人力资源部门也有更多的灵活性。例如,HR可以通过设置不同的参数来扩展或限制选择过程。

如果有太多候选人勾选所有正确的盒子,则可以在几分钟内提高栏,从而减少候选人的数量。或者,如果该过程产生符合所有要求的候选人,人力资源可以选择减少或降低一些标准,将他们的重点转移到更相关的技能,直到足够数量的候选人符合要求。