0源码地址
https://github.com/ImViper/design_pattern
0 讲讲运算的核心——模型公式及其如何实现
0.1 业务需求:输入一个模型公式(加、减运算),然后输入模型中的参数,运算出结果
设计要求
● 公式可以运行时编辑,并且符合正常算术书写方式,例如a+b-c
● 高扩展性,未来增加指数、开方、极限、求导等运算符号时较少改动
● 效率可以不用考虑,晚间批量运算
需求不复杂,若仅仅对数字采用四则运算,每个程序员都可以写出来
但是增加了增加模型公式就复杂了
先解释一下为什么需要公式,而不采用直接计算的方法,例如有如下3个公式
● 业务种类1的公式:a+b+c-d
● 业务种类2的公式:a+b+e-d
● 业务种类3的公式:a-f
其中,a、b、c、d、e、f参数的值都可以取得,如果使用直接计算数值的方法需要为每个品种写一个算法,目前仅仅是3个业务种类,那上百个品种呢?凉透了吧!建立公式,然后通过公式运算才是王道
以实现加减法公式为例,说明如何解析一个固定语法逻辑
采用逐步分析方法,带领大家了解实现过程
想想公式中有什么?运算元素和运算符号
- 运算元素
指a、b、c等符号,需要具体赋值的对象,也叫做终结符号
,为什么叫终结符号呢?
因为这些元素除了需要赋值外,不需要做任何处理,所有运算元素都对应一个具体的业务参数,这是语法中最小的单元逻辑,不可再分 - 运算符号
就是加减符号,需要我们编写算法进行处理,每个运算符号都要对应处理单元,否则公式无法运行,运算符号也叫做非终结符号
共同点是都要被解析,不同点是所有运算元素具有相同的功能,可以用一个类表示
而运算符号则是需要分别进行解释,加法需要加法解析器,减法需要减法解析器
这是一个很简单的类图
VarExpression
用来解析运算元素,各个公式能运算元素的数量是不同的,但每个运算元素都对应一个VarExpression
对象
SybmolExpression
负责解析符号,由两个子类
AddExpression
(负责加法运算)SubExpression
(负责减法运算)
解析器的开发工作已经完成了,但是需求还没有完全实现。我们还需要对解析器进行封装,
来实现
解析的工作完成了,我们还需要把安排运行的先后顺序(