formula

基于 groovy 实现的公式库

项目地址

Github

语法

公式名(参数)

比如:

ECHO(大侠王波波)

支持公式嵌套:

公式名1(公式名2(参数), 参数)

比如:

ECHO(UUID())

快速开始

  1. 创建 Formula 对象 formula
  2. 运行 formula.run("script")

下面是例子:

package tk.fishfish.formula;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test; /**
* 公式测试
*
* @author 奔波儿灞
* @since 1.0
*/
public class FormulaTest { private Formula formula; @Before
public void setup() {
formula = new Formula();
} @Test
public void lower() {
Object result = formula.run("LOWER(ABC)");
Assert.assertEquals("abc", result);
} }

默认公式

这里只是抛砖引玉,实现了如下文本公式:

  • UUID() 返回uuid
  • LOWER(xxx) 转小写
  • UPPER(xxx) 转大写

这里未实现丰富文本、时间、数学、逻辑等公式,只是提供一个扩展机制,方便大家定制自己的公式库。

开发自己的公式

  • 继承 Plugin 接口

    package tk.fishfish.formula.plugin;
    
    import tk.fishfish.formula.annotation.FormulaMapping;
    
    /**
    * 自定义公式
    *
    * @author 奔波儿灞
    * @since 1.0
    */
    public class CustomPlugin implements Plugin { /**
    * 实现自己的公式
    *
    * @param name 参数
    * @return 结果
    */
    @FormulaMapping("ECHO")
    public String echo(String name) {
    return "echo: " + name;
    } }
  • 自定义方法,增加 @FormulaMapping 注解 映射公式名称

  • 安装插件类,FormulaScript.installPlugin(CustomPlugin.class)

    package tk.fishfish.formula;
    
    import org.junit.Assert;
    import org.junit.Before;
    import org.junit.Test;
    import tk.fishfish.formula.plugin.CustomPlugin;
    import tk.fishfish.formula.script.FormulaScript; import java.math.BigDecimal; /**
    * 公式测试
    *
    * @author 奔波儿灞
    * @since 1.0
    */
    public class FormulaTest { private Formula formula; @BeforeClass
    public static void init() {
    // 安装自己的公式插件
    FormulaScript.installPlugin(CustomPlugin.class);
    } @Before
    public void setup() {
    formula = new Formula();
    } @Test
    public void plugin() {
    Object result = formula.run("ECHO(xxx)");
    System.out.println(result);
    } }

注意:

  • 先安装自己的公式,再创建 Formula 对象
  • 公式名全局不可重复

SPI扩展

除了可以手动 FormulaScript.installPlugin(CustomPlugin.class) 安装自定义公式以外,还能通过 SPI 注册。

在 src/main/resources/META-INF/services 目录下创建名称为 tk.fishfish.formula.plugin.Plugin 的文件,里面是实现类的全类名:

# custom plugin
tk.fishfish.formula.plugin.CustomPlugin

此时,会自动通过 SPI 机制发现实现类,自动安装,实现解偶。

关于

变量

大部分情况下,业务定制的公式都会含有变量,比如:

公式名(变量)

一般地,都会在运行时,替换变量。

package tk.fishfish.formula;

import groovy.lang.Binding;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import tk.fishfish.formula.plugin.CustomPlugin;
import tk.fishfish.formula.script.FormulaScript; /**
* 公式测试
*
* @author 奔波儿灞
* @since 1.0
*/
public class FormulaTest { private Formula formula; @Before
public void setup() {
formula = new Formula();
} @Test
public void variable() {
Binding binding = new Binding();
binding.setVariable("xxx", "ABC");
// 传入 Binding 上下文
Object result = formula.run("LOWER(xxx)", binding);
Assert.assertEquals("abc", result);
} }

依赖

更有甚者,存在依赖关系,比如:

  • 值 A 的公式为:公式1(xxx)
  • 值 B 的公式为:公式2(A),注意 B 依赖 A 的结果

此时,就存在依赖关系了,即 B 依赖 A

这里未提供代码解决该场景,这里可以给予提示,依赖关系可转化为 DAG(有向无环图)计算。

该部分代码暂不开源。

数据库公式

这个也是业务必备,这里仍不开源。

大家可采用 groovy-sql 或者 JdbcTemplate 实现即可。

基于 groovy 实现公式库的更多相关文章

  1. muParser公式库使用简介( 转)

    muParser是一个跨平台的公式解析库,它可以自定义多参数函数,自定义常量.变量及一元前缀.后缀操作符,二元操作符等,它将公式编译成字节码,所以计算起来非常快. 当前版本V1.28,官方网址http ...

  2. 基于 Groovy 的自动化构建工具 Gradle 入门(转)

    本人工作之初没有使用自动化构建,后来敏捷了,开始使用 Ant - 完全面向过程的定义步骤,不进行依赖管理.再发展到 Maven,面向对象的方式管理工程,有了依赖的管理,JAR 包统一从中央仓库获得,保 ...

  3. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  4. 利用cocoapods创建基于git的私有库

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  5. 基于Groovy应用程序的spring boot

    spring boot CLI 它是使用Spring Boot的最简单的和快速的的方法.他是一个基于Groovy脚本的命令工具.可以按照以下步骤安装次工具: 1.去spring官网下载 http:// ...

  6. 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现

    目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...

  7. Axios 是一个基于 promise 的 HTTP 库

    Axios 是一个基于 promise 的 HTTP 库 vue项目中关于axios的简单使用 axios介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.j ...

  8. 利用cocoapods创建基于git的私有库Spec Repo

    上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...

  9. github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调

    github上的golang双向rpc,基于原生“net/rpc”库实现,可以注册回调.仅支持一个server和一个client交互. 地址:https://github.com/rocket049/ ...

随机推荐

  1. Nightmare BFS

    Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The la ...

  2. 详解 字符串—— String、StringBuffer 与 StringBuilder

    本来这篇博文的内容,本人打算在之后的代码中一点一点通过实例讲解的,但是,本人发现,其实这里的知识点还是蛮重要的. 并且,字符串类型,在任何的程序语言中都是被认真对待的,所以,今天专门写一篇博文来介绍一 ...

  3. java 方法的重载、重写与重构

    首先我们要知道重载.重写.重构的区别 重载:指的是在同一个类中,方法名相同,但是参数数量.参数类型或者返回类型不同的方法就叫做重载. 重写: 重写分两种.第一种的是在子类继承父类的情况下,通过@Ove ...

  4. this 关键字的用法

    用法一  this代表当前类的实例对象 class Program    {        static void Main(string[] args)        {            tr ...

  5. 立体匹配-----NCC视差匹配

    目录 一.立体匹配算法 1.立体匹配算法分类 二.NCC 视差匹配方法 1.原理 2.NCC计算公式 3.算法流程 4.代码实现     5.不同场景运行 三.结论 四.遇到的问题及解决方法 一.立体 ...

  6. wget下载整个网站---比较实用--比如抓取Smarty的document

    wget下载整个网站可以使用下面的命令 wget -r -p -k -np http://hi.baidu.com/phps, -r 表示递归下载,会下载所有的链接,不过要注意的是,不要单独使用这个参 ...

  7. Google Play商店为预注册的游戏和应用提供自动安装功能

    谷歌 Play 商店一直在准备一项功能,它可以自动安装用户预先注册的应用程序和游戏.似乎该功能现已开始向第一批用户推出.有些人在预注册时会看到一个新选项,使他们能够利用发布时自动安装的功能. 用户在 ...

  8. 学会HTML就可以找工作了

    对编程小白来讲,想要学习门槛低,学习周期短,难度指数可忽略.短时间内可能找一份薪资不错编程相关工作,那就把HTML作为入门级语言吧. 网页设计师 (//upload-images.jianshu.io ...

  9. 怎么在Chrome和Firefox浏览器中清除HSTS设置?

    HSTS代表的是HTTPS严格传输安全协议,它是一个网络安全政策机制,能够强迫浏览器只通过安全的HTTPS连接(永远不能通过HTTP)与网站交互.这能够帮助防止协议降级攻击和cookie劫持. HST ...

  10. centos6安装创建kvm虚拟机

    的虚拟机名 virsh domid name                            # 显示虚拟机id号 virsh domuuid name                      ...