5

表达式的动态解析和计算,Flee用起来真香

 1 year ago
source link: https://www.cnblogs.com/zoe-zyq/p/16388814.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

表达式的动态解析和计算,Flee用起来真香

在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出;由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的时候能根据维护的表达式计算出对应的值;刚好这块和同事聊天的时候说到Flee,感觉挺好用,赶紧来和小伙伴们来分享一波。

1. Flee简介

Flee是一个用于. net框架的表达式解析器和求值器,可以在运行时计算字符串表达式的值(如:sqrt(a^2 + b^2),其中a、b是变量)。它的解析和计算速度是比较快和高效的。

Flee 支持Net6.0、Net5.0、Netstandard2.1、Netstandard2.0。

其他就不多唠了,咱们直接上几个实例感受一波,更多详情小伙伴们可以去github上查阅:

github地址:https://github.com/mparlak/Flee

2. 案例演示

案例就通过控制台演示了,安装上Flee包即可。

1736140-20220618171522785-444498270.png
2.1 超级简单案例

代码中有具体的注释,这里就不再详细说步骤了,截图如下:

1736140-20220618171523180-649492358.png

这种简单表达式内容都已经确定,全是可以计算的,没有变量。

应用场景1:表达式固定,直接通过对应的值拼接计算的场景。

应用场景2:表达式不固定,但是公式维护时针对一些变量值用特殊字符标记,然后通过正则表达式的形式找到标记的变量,并替换为对应的业务字段值。

如:[a]+[b]+3.14,这种情况是可以通过正则表达式将中括号标记的变量找出来的,然后根据对应的中间变量的名字替换对应的值就可以计算了。

2.2 带变量的表达式

代码中有具体的注释,这里就不再详细说步骤了,截图如下:

1736140-20220618171522897-87697238.png

这种带变量的形式就相对比较灵活,可以任意配置,只需在计算的时候将对应的变量附上值即可。有小伙伴可能会有疑问,变量不确定咋整啊,其实在实际应用场景中,很多时候需要传入的那些变量应该都知道,只是照着公式的规则动态传值即可。

应用场景:和简单案例中的不太一样,不需要特殊标记变量,这里直接正常维护公式正常传值即可。这种情况相对灵活,可以针对相关业务配置对应的公式,最后传对应的变量进行计算,最后根据算出的值进行相关业务处理即可。

2.3 表达式组合

CalculationEngine 可以将表达式进行组合计算,计算引擎会使用引擎内部其他表达式的结果、依赖关系,然后按顺序进行计算出组合之后的结果

1736140-20220618171523304-1589801371.png

应用场景:这种情况一般用于有多个表达式的场景,就类似于Excel中多个单元格中的表达式一样,每个单元格中都有表达式,然后有一个单元格就会引用其他单元格中的表达式计算出来的值,最后得出结果。

2.4 扩展函数

有时候在项目中会将计算逻辑进行封装,只需要传入需要值即可,不需要每个调用者还得重新进行编写相关的计算逻辑,Flee也支持在表达式中组合使用自定义的函数,演示如下:

先在一个类中写好相关的方法,这里的方法一定要是静态的、公共的,如下:

1736140-20220618171523343-11166683.png

然后就可以在表达式中用了,如下:

1736140-20220618171522985-1154596185.png
2.5 支持可变参数的函数

和上面使用方式一样,自定义一个方法,只是这个方法的参数是不确定,可变的,如下:

1736140-20220618171523338-2063273515.png

在表达式中使用:

1736140-20220618171523384-753215232.png
2.6 返回值是Boolean类型的表达式

在实际应用场景中,有些时候只需要得到一个是否的结果,可能不需要计算一个具体的值;

1736140-20220618171523526-1875689792.png

应用场景:这种情况一般用于一些自动判定规则的需求,比如有一些报表的结果在不同的业务类型时会有一个值的范围,如果超出范围就代表不合规,靠人为判断的话可能就没那么高效;类似这种对比数据的情况,如果只是简单的比对还容易实现,如果是复杂一点的关系比对,这种方式就相对灵活了。

好了,使用方式就暂时说到这,文中图片已经包含所有的代码。稍后我也会把代码提交github上和码云上。

上文只是列举了一些简单的使用实例,具体小伙伴们可以根据业务场景进行使用。小伙伴们如果有更好的工具库,欢迎大家留言,一起学习。

关注“Code综艺圈”,和我一起学习吧。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK