首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Scala中设计避免if-else梯形图的数据帧规则引擎

在Scala中设计一个避免使用if-else梯形图的数据帧规则引擎,可以采用基于函数式编程和模式匹配的方法。这种方法可以使代码更加简洁、可读性更强,并且易于扩展和维护。以下是一个详细的设计方案:

基础概念

  1. 函数式编程:强调使用纯函数,避免副作用,通过组合函数来构建复杂的逻辑。
  2. 模式匹配:Scala中的强大特性,类似于其他语言中的switch-case,但功能更强大,可以匹配各种数据结构。
  3. 数据帧:通常指的是DataFrame,在Scala中常用Apache Spark的DataFrame来处理结构化数据。

设计思路

  1. 定义规则:将每条规则定义为一个函数或一个case class。
  2. 规则引擎:使用模式匹配来应用这些规则。

示例代码

假设我们有一个简单的数据帧,包含两列:nameage,我们希望根据不同的条件对数据进行过滤和处理。

定义规则

代码语言:txt
复制
sealed trait Rule
case class FilterByName(name: String) extends Rule
case class FilterByAge(minAge: Int, maxAge: Int) extends Rule
case class ModifyAge(by: Int) extends Rule

规则引擎

代码语言:txt
复制
import org.apache.spark.sql.{DataFrame, SparkSession}

object RuleEngine {
  def applyRules(data: DataFrame, rules: List[Rule]): DataFrame = {
    rules.foldLeft(data) {
      case (df, FilterByName(name)) =>
        df.filter(col("name") === name)
      case (df, FilterByAge(minAge, maxAge)) =>
        df.filter(col("age") >= minAge && col("age") <= maxAge)
      case (df, ModifyAge(by)) =>
        df.withColumn("age", col("age") + by)
    }
  }
}

// 初始化SparkSession
val spark = SparkSession.builder.appName("RuleEngineExample").getOrCreate()

import spark.implicits._

// 创建示例数据
val data = Seq(
  ("Alice", 30),
  ("Bob", 25),
  ("Charlie", 35)
).toDF("name", "age")

// 定义规则列表
val rules = List(
  FilterByName("Alice"),
  ModifyAge(5)
)

// 应用规则
val result = RuleEngine.applyRules(data, rules)

result.show()

优势

  1. 可读性:通过模式匹配和函数式编程,代码更加直观和易读。
  2. 可扩展性:新增规则时只需添加新的case class和处理逻辑,无需修改现有代码。
  3. 维护性:每个规则独立,便于单独测试和维护。

应用场景

  • 数据清洗:根据不同条件过滤和转换数据。
  • ETL流程:在数据提取、转换和加载过程中应用复杂的业务规则。
  • 实时数据处理:在流处理系统中动态应用规则。

可能遇到的问题及解决方法

  1. 性能问题:如果规则引擎处理大量数据时性能不佳,可以考虑优化Spark配置或使用更高效的数据结构。
  2. 规则冲突:确保规则之间没有逻辑冲突,可以通过单元测试来验证每条规则的独立性和整体逻辑的正确性。

通过上述设计,可以有效地避免传统的if-else梯形图结构,使代码更加简洁和易于管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

哪种语言最适合 PLC 编程?

3 梯形图逻辑(LD) 梯形图逻辑是最基本的 PLC 编程语言类型。它与电气接线控制图相关联,使得编程更加直观。在传统的电气控制接线中,输入操作会根据电气接线控制图来控制输出。...梯形图逻辑图由触点和线圈组成,在梯形图逻辑编程中以相同的方式实现。每个梯级都有一系列的触点和线圈,当梯级通电时,线圈根据其类型运行。 可以根据需要编写任意数量的梯级,代码将按照设计的顺序执行。...继电器逻辑图中的 M1 输出线圈在梯形图中用输出线圈符号表示。 梯形图中每个触点/线圈符号上方显示的地址号是对逻辑控制器外部输入/输出连接位置的引用。...在上面的示例中,if-else 语句用于计算表达式。如果条件为真,则输出端分配的变量打开,当条件变为假时,变量将关闭。因此,ST 语言最适合数学计算,因为它看起来清醒且易于理解。...当前值:只能在线查看的当前值,表示在执行指令之前存储在特定地址中的值。 指令运算符:表示要执行的操作的类型。 操作数:表示要参与操作的值或地址。 请参考下面的图以获得更详细的理解。

61110

为什么if-else会影响我的代码的复杂度

关于if-else的争议 我之前写了一篇文章《我用规则引擎消除if语句,提高了代码的可扩展性》,这篇文章我想阐述的观点是复杂的if语句可能会影响代码的阅读和代码的扩展性,会将非业务的条件逻辑与业务逻辑混合在一起...时间长了代码会越来越臃肿,因此这种情况下我推荐使用一些设计模式例如策略模式,责任链模式等去优化if语句带来的问题,文中我发现使用规则引擎也能实现类似效果,因此介绍了怎么使用规则引擎Easy Rules去取代...其实规则引擎很强大,可以有更复杂的用途,我这里使用规则引擎其实和策略模式差不多,有人会考虑第三方API有风险,这个就需要团队判断了。...不过规则引擎已经算是比较成熟的框架了,如果对这方面担忧的建议使用策略模式。 用图来表示就是上面这个样子,是不是有点像服务注册。...从软件设计角度讲,代码中存在过多的 if-else 往往意味着这段代码违反了违反单一职责原则和开闭原则。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷。所以,软件系统的扩展性是非常重要的。

1.5K10
  • 如何优化你的引擎服务?来试试“双向SDK集成”

    然而大量堆砌的 if-else 毫无疑问将给代码维护带来巨大的困难。如果想用if-else 来完善你的业务组件,尽量优化你的代码,避免后期业务拓展棘手。 如何优化你的if-else?...来试试“责任链模式+策略模式” 如果在同一JVM中上述的方式没有多大问题,但是分布在不同的JVM中(微服务集群),上述的方案估计要丢弃了。...在阅读下文时,考虑几个问题: 自定义的组件规则/SDK包,什么时候扫描才合理? 组件元数据怎样采集? 案例场景 ---- 目前存在三个服务,引擎层服务A,业务服务B、业务服务C。...A|B|C在同一注册集群中,A需提供组件于B\C服务使用,依赖关系如下图所示。...▐ 方案二 | 引擎服务主动采集 引擎服务在完善业务模块元数据持久化或者缓存的同时,并且提供业务模块采集的元数据SDK或客户端,便于业务模块快速集成,完善整体架构。

    25830

    PLC编程入门基础技术知识

    PLC在输入采样阶段:首先以扫描方式按顺序将所有暂存在输入锁存器中的输入端子的通断状态或输入数据读入,并将其写入各对应的输入状态寄存器中,即刷新输入。随即关闭输入端口,进入程序执行阶段。...触点和线圈等组成的独立电路称为网络,用编程软件生成的梯形图和语句表程序中有网络编号,允许以网络为单位给梯形图加注释。 梯形图的设计应注意到以下三点: ①梯形图按从左到右、自上而下地顺序排列。...O或动合触点指令,用于单个动合触点的并联。 LD、LDN、A、AN、O、ON触点指令中变量的数据类型为布尔(BOOC)型。...采用END指令将程序划分为若干段,在确认处于前面电路块的动作正确无误之后,依次删去END指令。 第三章可编程控制器梯形图编程规则 一、编程的几个步骤 (一)决定系统所需的动作及次序。...梯形图设计规则 (1)触点应画在水平线上,并且根据自左至右、自上而下的原则和对输出线圈的控制路径来画。 (2)不包含触点的分支应放在垂直方向,以便于识别触点的组合和对输出线圈的控制路径。

    1.4K30

    谈一谈规则引擎在活动系统中的落地

    image.png 核心问题域有了:大量无法避免的if-else充斥在我们的系统中,对于系统的维护造成了威胁。...2.3 规则该如何执行 我们知道规则是做什么的了,也知道规则怎么去做判断长什么样子,但是规则该以何种形态在我们代码中执行呢 目前大致有三种模式: 2.3.1 直接解释执行 这个模式相对好理解,在我们的系统中内嵌了一个对于规则语言的解释器...,在规则脚本中描述规则逻辑,然后系统传参给解释器并调用对应的脚本,最常见的就是lua/js 这种。...之前看过一个架构设计的思路,以风险作为驱动主导架构设计,在综合评估要设计系统的各种质量属性之后,选用现有的一个和完备的一组技术方案 根据面临的风险的严重程度依次解决,往往能设计出更适合现状的架构。...image.png 5.2 规则引擎服务架构 规则引擎服务通常是在核心的规则引擎之上,增加了一些执行时门面服务、可视化规则创建、多种规则引擎支持、更加系统的规则管理体、调用上下文、附加数据支持等服务而已

    2.7K22

    plc梯形图讲解_plc编程入门梯形图

    大家好,又见面了,我是你们的朋友全栈君 导读: 初学PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。...下面以三菱FX系列PLC为例,简单介绍一下 PLC梯形图编程时需要遵循的规则,希望对大家有所帮助。有一点需要说明的是,本文虽以三菱PLC为例,但这些规则在其它PLC编程时也可同样遵守。...OFweek工控网讯:初学PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。下面以三菱FX系列PLC为例,简单介绍一下PLC梯形图编程时需要遵循的规则,希望对大家有所帮助。...若在同一梯形图中,同一组件的线圈使用两次或两次以上,则称为双线圈输出或线圈的重复利用。双线圈输出一般梯形图初学者容易犯的毛病之一。在双线圈输出时,只有最后一次的线圈才有效,而前面的线圈是无效的。...可见,在同一时刻,Y003驱动只有一个可以发生。此时,双线圈利用是可以的。 但在梯形图编程时,我们还是要尽量避免使用双线圈,而引入辅助继电器是一个常用的方法。

    1.6K20

    微服务的架构下,如何根据业务抽象出适合自己系统的组件?

    然而大量堆砌的 if-else 毫无疑问将给代码维护带来巨大的困难。如果想用if-else 来完善你的业务组件,尽量优化你的代码,避免后期业务拓展棘手。 如何优化你的if-else?...来试试“责任链模式+策略模式” 如果在同一JVM中上述的方式没有多大问题,但是分布在不同的JVM中(微服务集群),上述的方案估计要丢弃了。...在阅读下文时,考虑几个问题: 自定义的组件规则/SDK包,什么时候扫描才合理? 组件元数据怎样采集? 案例场景 ---- 目前存在三个服务,引擎层服务A,业务服务B、业务服务C。...A|B|C在同一注册集群中,A需提供组件于B\C服务使用,依赖关系如下图所示。...▐ 方案二 | 引擎服务主动采集 引擎服务在完善业务模块元数据持久化或者缓存的同时,并且提供业务模块采集的元数据SDK或客户端,便于业务模块快速集成,完善整体架构。

    49320

    plc梯形图编程入门基础知识_plc简单循环程序梯形图

    大家好,又见面了,我是你们的朋友全栈君。   OFweek工控网讯:初学PLC梯形图编程,应要遵循一定的规则,并养成良好的习惯。...下面以三菱FX系列PLC为例,简单介绍一下PLC梯形图编程时需要遵循的规则,希望对大家有所帮助。有一点需要说明的是,本文虽以三菱PLC为例,但这些规则在其它PLC编程时也可同样遵守。   ...若在同一梯形图中,同一组件的线圈使用两次或两次以上,则称为双线圈输出或线圈的重复利用。双线圈输出一般梯形图初学者容易犯的毛病之一。在双线圈输出时,只有最后一次的线圈才有效,而前面的线圈是无效的。...1,输入采样阶段   PLC顺序读取每个输入端的状态,并将其存入到我们称之为输入映像寄存器的内在单元中。...可见,在同一时刻,Y003驱动只有一个可以发生。此时,双线圈利用是可以的。   但在梯形图编程时,我们还是要尽量避免使用双线圈,而引入辅助继电器是一个常用的方法。

    2.1K10

    基于Modbus协议实现Openplc与Kingview的仿真通讯与模拟测试

    同时基于环境进行模拟测试,对组态王的组态画面、OpenPLC Editor梯形图简单编程进行简单介绍,亲测效果不错。...linux虚拟机(IP:192.168.180.146)安装OpenPLC_Editor,安装过程参考https://github.com/thiagoralves/OpenPLC_Editor,安装后,在应用里面搜索...三、仿真通讯 (1)Kali linux虚拟机(IP:192.168.180.146)中运行OpenPLC,导入OpenPLC_Editor编辑好的程序openplc_test.st。 ? ?...四、模拟测试 (1)winxp sp3虚拟机(IP:192.168.180.157)中利用wireshark抓取03.仿真通讯中Start(14帧、16帧)和Stop(19帧、21帧)的数据包,下载链接...查看数据包,搜索modbus协议”05”功能码Write Coil,捕获到Start(14帧、16帧)和Stop(19帧、21帧)的攻击数据包,modbus协议常用功能码如下: 01 :读取线圈状态 02

    2.1K20

    Java动态脚本运用

    Java动态脚本常见的实现方式 2.1 动态编译执行Java代码 2.2 通过Java脚本引擎执行不同类型的脚本 JavaScript Groovy Python Lua Ruby Scala 以上脚本语言可根据项目实际需求...一般的需求可使用上述动态脚本实现,如果遇到业务规则更为复杂、规模更大、对功能和性能有更高要求的需求时,可考虑更为专业的规则引擎和计算/表达式引擎。...3 进阶:规则引擎&计算/表达式引擎 3.1 规则引擎 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。...接受数据输入,解释业务规则,并根据业务规则做出业务决策。...可设计缓存策略,对编译后的脚本引擎进行缓存,既可避免频繁创建对象引起的内存溢出问题,又可提高性能

    1.3K10

    Scala 的模式匹配

    在以往传统的静态语言中,要在程序中植入 “变化点”,要么就是 if-else 语句(本质上 switch-case 和使用 Map 去寻找匹配的 value 也属于 if-else),要么就是多态,要么就是方法重载...虽然说,这个例子可以说和使用 if-else 相比,似乎没有太大的区别,但是在存在不同的参数组合情况的时候,这个写法的优势就体现出来了: translate :: String -> String translate...那么在实现中序遍历的 inOrder 方法的时候,如果是分支节点,那么就递归执行中序遍历的方法(左子树-> 节点自己-> 右子树),然后把着三个结果 List 拼接起来;否则对于叶子节点,就创建一个空的...在 Java 8 中,为了 Lambda 表达式这个特性,给一些以往所谓的纯粹的、不含逻辑的接口,引入了 “函数接口” 的概念——被允许存在 “一个非 java.lang.Object 中定义过的抽象的方法...因此,二者各有利弊,要看设计和使用场景。

    98230

    实时高密度AI辅助视频编码的ASIC解决方案

    在流媒体开始大规模流行前,视频ABR梯形图需要预先编码,从经济性上讲仅适用于预编码和视频点播之类的应用场景。现在,通过ASIC解决方案所独具的实时编码能力,就可实现在直播过程中应用此类技术。...另一方面,如果采用传统的方法,就需要设计自己专用的主机设备接口,必须自主定制的内核驱动程序,这经常导致在不同操作系统中引发各种不兼容的问题,并且很难支持Windows系统。...在NETINT的下一代芯片中,我们的视频编/解码器 AI都将集成于同一芯片上,这可以让用户在同一个芯片上实现一些复杂的AI 辅助编码,例如,实时流解码——当源流中的视频流进来时,YUV数据保存在芯片中,...子帧编码则指编码器在接收数据时开始编码,并在切片生成时就开始输出切片,子帧编码允许数据传输在很大程度上与编码并行运行,从而实现子帧延迟。 5 要点总结 ?...;第三,使用ASIC解决方案可以实现低延迟和延迟一致性,通过将DNN引擎与编码器集成、用协调编码时序避免冲突、用预留空间编码来减少冲突、用SRIOV等技术减少虚拟化中的延迟、并用子帧编码来实现高分辨率的子帧延迟

    96120

    别让 If-Else ,变成 “懒婆娘的裹脚布”

    if-else 语句堪称程序设计领域中最为常见的控制结构之一 。在软件开发的历程中,每一位开发者都曾运用if-else语句来实现条件判断。...1.2 扩展性差在系统不断发展和功能持续拓展的过程中,if-else语句的数量常常会不可避免地逐渐增多。这一现象会使得代码的规模日益庞大,逻辑结构也愈发复杂。...1.4 隐藏业务逻辑if-else语句在实际应用中,常常将控制流逻辑与业务逻辑混杂在一起。这种情况会导致业务逻辑的抽象层次较低,使得代码中的控制流和业务规则未能得到有效的分离。...这样的设计方式,不仅会让业务逻辑变得晦涩难懂,增加开发者理解和维护代码的难度,而且在需要对业务规则进行单独修改或重构时,也会面临诸多困难,难以实现高效的代码优化和功能扩展。...第二章:如何避免过度使用 if-else 语句2.1 使用策略模式策略模式(Strategy Pattern)作为一种经典的设计模式,能够有效地将不同的行为封装到各自独立的策略类中,进而规避使用复杂的if-else

    31320

    开源规则引擎——ice:致力于解决灵活繁复的硬编码问题

    大厂技术 坚持周更 精选好文 背景介绍 业务中是否写了大量的 if-else?是否受够了这些 if-else 还要经常变动? 业务中是否做了大量抽象,发现新的业务场景还是用不上?...接下来给大家介绍一款全新的开源规则引擎——ice,以一个简单的例子,从最底层的编排思想,阐述 ice 与其他规则引擎的不同;讲述 ice 是如何使用全新的设计思想,契合解耦和复用的属性,还你最大的编排自由度...规则引擎的应用场景 规则引擎在很多业务场景中都有应用,例如: 会员营销:由多种条件、流程、奖励组合而成,时间线复杂,代码复用率不高,调整频繁。...修复数据苦不堪言:当线上问题产生时,受影响的客户如何快速高效的补偿? 开源规则引擎 ice 的设计思路 为了方便理解,设计思路将伴随着一个简单的充值例子展开。...模块怎么设计无可厚非,重点要讲的是后面的怎么编排实现配置自由,接下来将通过已有的上述节点,讲解不同的规则引擎在核心的编排上的优缺点,并比较ice是怎么做的。

    2K30

    大数据技术之_16_Scala学习_03_运算符+程序流程控制

    说明: 位运算符的规则和Java一样 3.5.6 运算符的特别说明 Scala 不支持三目运算符,在 Scala 中使用 if – else 的方式实现。 val num = 5 > 4 ? ...  在 scala 中没有 switch,而是使用模式匹配来处理。   ...4、因为 while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量,而变量需要声明在 while 循环的外部,那么就等同于循环的内部对外部的变量造成了影响,所以不推荐使用 while...纯函数:Scala 设计者非常提倡使用函数的递归来解决问题,函数自己调用自己,函数的变量在函数的内部变化,而不会对外部的变量造成了影响。即纯函数概念。...3、和 while 一样,因为 do…while 中没有返回值,所以当要用该语句来计算并返回结果时,就不可避免的使用变量,而变量需要声明在 do…while 循环的外部,那么就等同于循环的内部对外部的变量造成了影响

    1.3K10

    你的游戏开发第0课

    在我们 pygame 的教程中,你可以很明显地看到这个: while True: ... 在主循环里进行的各种读写、计算、处理、渲染……构成了游戏的每一帧。...因为游戏大多是对现实场景的模拟和抽象,含有众多角色和道具,所以它比其他程序更适合使用面向对象的设计。不少企业在面试时也会用游戏角色的设计来考察面向对象的概念。...在游戏开发中,通过 MVC 模式,将游戏玩家、场景及角色的数据(Model)、游戏画面和菜单的显示(View)、游戏的输入控制和逻辑处理(Controller)分离开,会让程序的架构更合理,容易维护和扩展...游戏开发之路 在实际的开发中,几乎没有团队是从零开始写一个游戏,或多或少都会使用或自研游戏引擎。...如果你有志于从事游戏行业,或者想开发出属于自己的游戏,我给出一点建议: 了解游戏开发的基础,一般游戏引擎都有官方教程,跟着做 打牢编程基础,包括数据结构、算法、设计模式等 多了解各方面的知识,多点兴趣爱好

    72830

    AWS培训:Web server log analysis与服务体验

    AWS Glue 由一个称为 AWS Glue Data Catalog的中央元数据存储库、一个自动生成 Python 或 Scala 代码的 ETL 引擎以及一个处理依赖项解析、作业监控和重试的灵活计划程序组成...AWS Glue 设计用于处理半结构化数据。它引入了一个称为动态帧 的组件,您可以在 ETL 脚本中使用该组件。...动态框架与 Apache Spark DataFrame 类似,后者是用于将数据组织到行和列中的数据抽象,不同之处在于每条记录都是自描述的,因此刚开始并不需要任何架构。...借助动态帧,您可以获得架构灵活性和一组专为动态帧设计的高级转换。您可以在动态帧与 Spark DataFrame 之间进行转换,以便利用 AWS Glue 和 Spark 转换来执行所需的分析。...只需在 AWS 管理控制台中单击几下,客户即可将 Athena 指向自己在 S3 中存储的数据,然后开始使用标准 SQL 执行临时查询并在数秒内获取结果。

    1.2K10

    SparkSql的优化器-Catalyst

    一,概述 为了实现Spark SQL,基于Scala中的函数编程结构设计了一个新的可扩展优化器Catalyst。Catalyst可扩展的设计有两个目的。...模式匹配是许多函数编程语言的特征,允许从代数数据类型的潜在嵌套结构中提取值。在Catalyst中,语法树提供了一种转换方法,可以在树的所有节点上递归地应用模式匹配函数,将匹配到的节点转换为特定结果。...这使得Catalyst比优化器的域特定语言更强大,同时保持简洁的简单规则。 在经验中,对不变树的功能转换使得整个优化器非常容易推理和调试。它们还可以在优化器中实现并行化,尽管目前还没有开发它。...因为Spark SQL通常操作的是内存数据集,意味着处理是CPU-bound型的,因此我们希望支持代码生成以加快执行速度。尽管如此,代码生成引擎通常很难构建,实际上与编译器相当。...四,总结 Catalyst新颖的,简单的设计使Spark社区能够快速实现和扩展引擎。

    2.7K90

    Weiflow:微博也有机器学习框架?

    在框架的执行效率方面,在第二层DAG中(后面将详细介绍Weiflow的双层DAG结构),充分利用各种计算引擎(Spark、Tensorflow、Hive、Storm、Flink等)的优化机制,同时结合巧妙的数据结构设计与开发语言...外层DAG设计的初衷是让最合适的锤子去敲击最适合的钉子,大多数计算引擎因其设计阶段的历史局限性,都很难做到兼顾所有的工作负载类型,而是在不同程度上更好地支持某些负载(如批处理、流式实时处理、即时查询、分析型数据仓库...为了满足微博机器学习规模化的需求,Weiflow在设计之初就充分考虑到实现中的执行效率问题。 ?...然而通过Scala语言中的Currying特性,可以很容地解决上述问题。在Scala中,函数为一等公民,且所有函数均为对象。...表1 采用Weiflow前后开发效率、可扩展性和执行效率的量化对比 前文提到过,在Weiflow的双层DAG设计中,内存的DAG实现会充分地利用执行引擎已有的特性来提升执行性能。

    1.6K80

    别再说你不懂规则引擎了!

    从开发人员视角来看 在没有规则引擎的时代,有些逻辑比较复杂的业务,只有不断的增添if-else去满足我们这个复杂的业务场景,对于开发者来说还好,对于后面接手的同学一看到处都是if-else,体验过的同学就会知道...一般来说分为下面三类: 低配版:没有配置界面,靠业务人员编写引擎规则DSL,一般存储在数据库或者文件中,这种没有彻底解放业务人员和开发人员的耦合,但是加快了业务代码的上线速度,以及很容易就能进行规则变更...完全版:在进阶版中规则引擎只是其中的一个部件,一般这种都很难复用于其他场景。但是一个完全版的规则引擎,追求的超高的通用性,下面是从一个商业的规则引擎中截图: ?...有哪些规则引擎 在社区中开源的规则引擎是比较多的,说明不同的业务团队,公司都对这个是比较看中的,但是整体上大的分类分为下面几类: 通过界面配置的成熟规则引擎:这种规则引擎相对来说就比较重,但是因为功能全...最主要它是google开源出来的一个项目,对于他的品质还是非常有保证的。在美团内部基本大部分使用规则引擎的场景比如风控,数据规则等等都选择了aviator这个轻量级的语言作为规则引擎。

    7.2K21
    领券