黃 俊 呂振洪
(浙江師范大學,浙江 金華 321004)
在常見的業績考核系統、工資管理系統、產品銷售管理等系統中都會涉及到計算公式,系統需要通過這些計算公式計算出績點、工資、產品價格等數值。這些計算公式帶有一些參數(分為基本參數和傳入參數),基本參數值并不固定,計算公式運算規則也可能會發生改變。若在項目開發時,直接把公式固定在代碼內,那么當用戶需要對公式進行適應性修改時,就得找開發此軟件的公司來修改源代碼,若公式變動的頻率較高時,每次修改的代價是不小的。筆者通過研究,提出“計算公式自定義設置”解決方案:將表達式和參數寫在用戶配置文件中,系統運行時讀取配置文件,并將公式載入內存。用戶若要對計算公式進行修改時,只需打開配置文件,按照一定的規則修改計算公式的參數或運算規則即可。
系統如何智能的識別、解析配置文件中字符串形式計算公式,并將用戶設置的基本參數及系統運行時傳入的參數映射到公式中,準確的計算出結果是本文研究的重點。筆者將本研究的問題歸結于以下模型:
result=calculateWithParameters(expression,params)。其中expression為從用戶配置文件中讀取的用戶設置好的計算表達式。params為從配用戶配置文件中讀出的基本參數和系統運行時傳入的參數集合。通過這兩個輸入及calculateWithParameters函數,系統能夠自動輸出計算表達式的運算結果result。
2.1 獲取自定義計算表達式和參數列表(規定參數中負數用F表示負號,例如-1寫成F1)。
2.2 分析參數列表,將參數中值為負數的負號“-”用“F”替換,以便于區分表達式中的減號和參數中的負號。
2.3 分析計算表達式,將計算表達式中型為“{X}”的基本參數或傳入參數根據其標識符號X從參數列表中找到相應的值進行替換。
2.4 開始計算表達式。這里采用常用算法中的分治策略,將表達式根據“+”“,-”“,*”“,/”“,()”這些運算符及其優先級將表達式劃分成更小的子表達式,通過遞歸的方式逐步劃分(入棧),直到最小的表達式能夠直接獲得其計算值,然后再退棧,逐步將得到的子表達式的計算值相運算“還原”出原計算表達式的結果。
核心偽代碼(Java)如下:




此外,本設計還涉及到模型的兩個輸入的獲取。對于expression和params中的基本參數,可以直接從用戶配置文件中讀取(這里建議配置文件使用XML文件,在系統運行時將公式及基本參數載入內存)例如

系統運行時,當接收到界面層傳來的參數a,b,c的值時,將參數的標識符和數值放入HashMap中,params的收集也就完成了。接下來就能通過這個模型計算出結果。
某業績考核系統中的績點計算表達式如上配置文件所示:{a}*{x1}+{b}*{x2}+{c}*{x3}+0.1*(g0gggggg-2),其中三個基本參數x1,x2,x3已在配置文件中設置。a,b,c,d為系統運行時要從界面層獲取的傳入參數。以下為計算績點的部分代碼:


圖1 對該實例模擬的結果進行測試
本文提出了一種比較通用的應對軟件系統中涉及到的計算公式經常發生變動的解決方案,用戶只需簡單的修改配置文件即可應對變化,而不必修改源代碼,這樣使得軟件設計更加靈活,能夠有效的降低軟件維護所花費的代價。
[1]王曉東編著.算法設計與分析(第二版)[M].北京:清華大學出版社,2009.
[2]張峰,李慧麗.JavaWeb架構開發與項目實戰[M].北京:清華大學出版社,2009.