软件系统中“计算公式自定义设置”解决方案设计
2010-05-11吕振洪
黄 俊 吕振洪
(浙江师范大学,浙江 金华 321004)
1 引言
在常见的业绩考核系统、工资管理系统、产品销售管理等系统中都会涉及到计算公式,系统需要通过这些计算公式计算出绩点、工资、产品价格等数值。这些计算公式带有一些参数(分为基本参数和传入参数),基本参数值并不固定,计算公式运算规则也可能会发生改变。若在项目开发时,直接把公式固定在代码内,那么当用户需要对公式进行适应性修改时,就得找开发此软件的公司来修改源代码,若公式变动的频率较高时,每次修改的代价是不小的。笔者通过研究,提出“计算公式自定义设置”解决方案:将表达式和参数写在用户配置文件中,系统运行时读取配置文件,并将公式载入内存。用户若要对计算公式进行修改时,只需打开配置文件,按照一定的规则修改计算公式的参数或运算规则即可。
系统如何智能的识别、解析配置文件中字符串形式计算公式,并将用户设置的基本参数及系统运行时传入的参数映射到公式中,准确的计算出结果是本文研究的重点。笔者将本研究的问题归结于以下模型:
result=calculateWithParameters(expression,params)。其中expression为从用户配置文件中读取的用户设置好的计算表达式。params为从配用户配置文件中读出的基本参数和系统运行时传入的参数集合。通过这两个输入及calculateWithParameters函数,系统能够自动输出计算表达式的运算结果result。
2 设计思路
2.1 获取自定义计算表达式和参数列表(规定参数中负数用F表示负号,例如-1写成F1)。
2.2 分析参数列表,将参数中值为负数的负号“-”用“F”替换,以便于区分表达式中的减号和参数中的负号。
2.3 分析计算表达式,将计算表达式中型为“{X}”的基本参数或传入参数根据其标识符号X从参数列表中找到相应的值进行替换。
2.4 开始计算表达式。这里采用常用算法中的分治策略,将表达式根据“+”“,-”“,*”“,/”“,()”这些运算符及其优先级将表达式划分成更小的子表达式,通过递归的方式逐步划分(入栈),直到最小的表达式能够直接获得其计算值,然后再退栈,逐步将得到的子表达式的计算值相运算“还原”出原计算表达式的结果。
核心伪代码(Java)如下:
此外,本设计还涉及到模型的两个输入的获取。对于expression和params中的基本参数,可以直接从用户配置文件中读取(这里建议配置文件使用XML文件,在系统运行时将公式及基本参数载入内存)例如
系统运行时,当接收到界面层传来的参数a,b,c的值时,将参数的标识符和数值放入HashMap中,params的收集也就完成了。接下来就能通过这个模型计算出结果。
3 实例模拟
某业绩考核系统中的绩点计算表达式如上配置文件所示:{a}*{x1}+{b}*{x2}+{c}*{x3}+0.1*({d}-2),其中三个基本参数x1,x2,x3已在配置文件中设置。a,b,c,d为系统运行时要从界面层获取的传入参数。以下为计算绩点的部分代码:
图1 对该实例模拟的结果进行测试
4 结束语
本文提出了一种比较通用的应对软件系统中涉及到的计算公式经常发生变动的解决方案,用户只需简单的修改配置文件即可应对变化,而不必修改源代码,这样使得软件设计更加灵活,能够有效的降低软件维护所花费的代价。
[1]王晓东编著.算法设计与分析(第二版)[M].北京:清华大学出版社,2009.
[2]张峰,李慧丽.JavaWeb架构开发与项目实战[M].北京:清华大学出版社,2009.