我是如何提高代码的可扩展性的

最近写了一个逻辑表达式引擎(everlogic),对于如何提高代码的可扩展性做了一些思考,在这里做个总结,希望对大家有所启发。
该引擎想要达到的目标是传入一组参数,判断参数是否满足一定的逻辑条件。如传入参数 A 和 B,判断A、B是否都大于100,且 A 大于 B,逻辑表达式如下

A > 100 and B > 100 and A > B

除支持简单的逻辑表达式,还支持多个表达式的聚合,如

(A > 100 and B > 100 and A > B) and (C > 1000 or D > 10000)

除了支持数字类型参数外,还可以支持其它类型数据,例如

  • 字符串
  • 日期
  • 布尔
  • JSON

等等,并且需要支持自定义类型,让用户可以自由扩展该引擎。

抽象

逻辑单元

如数字逻辑、字符串逻辑、日期逻辑等等,是逻辑运算的具体场所。

转换器

用于将输入数据转换为可比较的类型,如数字转换器,将输入转为数字类型(Double)。这样用户就可以自主控制输入的转换,例如有些场景可能需要将 null 转换为 0,而不是报空指针错误。

比较器

用于比较数据,例如比较数字、日期、布尔等数据类型。这样用户可以自由扩展自己的比较逻辑。

逻辑单元依赖具体的转换器和比较器。

工厂

因为需要支持多种类型的逻辑单元,很自然地想到用工厂生产具体的逻辑单元。

工厂根据不同的数据类型返回具体的逻辑单元,如当数据类型为数字时,返回数字逻辑单元。

so far so good

继续思考,如果用户想扩展自己的类型,但不能修改核心代码(将引擎作为一个类库使用),以上的设计能支持吗?

例如用户需要扩展一种代表矩形的数据类型,增加矩形相关的逻辑,如比较大小、判断面积是否相等。用户该怎么做?

好像遇到了一点困难。仔细思考,造成困难的原因是什么?

只有一个工厂,只能生产固定的几种逻辑单元。

既然找到原因了,那就要想办法了。是否可以支持多个工厂,让用户可以生产自定义的逻辑单元?

答案是可以的,需要将原有的简单工厂,修改为包含简单工厂的工厂容器,让用户可以往容器内添加简单工厂。

扩展新逻辑

只需要以下几步,用户即可扩展自己的逻辑单元

  • 定义新的数据类型
  • 定义转换器、比较器
  • 定义逻辑单元
  • 定义新的逻辑单元工厂
  • 将工厂注册进工厂容器

感兴趣的朋友可以看 示例代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值