本文主要是介绍我是如何提高代码的可扩展性的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近写了一个逻辑表达式引擎(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
继续思考,如果用户想扩展自己的类型,但不能修改核心代码(将引擎作为一个类库使用),以上的设计能支持吗?
例如用户需要扩展一种代表矩形的数据类型,增加矩形相关的逻辑,如比较大小、判断面积是否相等。用户该怎么做?
好像遇到了一点困难。仔细思考,造成困难的原因是什么?
只有一个工厂,只能生产固定的几种逻辑单元。
既然找到原因了,那就要想办法了。是否可以支持多个工厂,让用户可以生产自定义的逻辑单元?
答案是可以的,需要将原有的简单工厂,修改为包含简单工厂的工厂容器,让用户可以往容器内添加简单工厂。
扩展新逻辑
只需要以下几步,用户即可扩展自己的逻辑单元
- 定义新的数据类型
- 定义转换器、比较器
- 定义逻辑单元
- 定义新的逻辑单元工厂
- 将工厂注册进工厂容器
感兴趣的朋友可以看 示例代码
这篇关于我是如何提高代码的可扩展性的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!