黃 俊 呂振洪
(浙江師范大學,浙江 金華 321004)
在常見的業(yè)績考核系統(tǒng)、工資管理系統(tǒng)、產(chǎn)品銷售管理等系統(tǒng)中都會涉及到計算公式,系統(tǒng)需要通過這些計算公式計算出績點、工資、產(chǎn)品價格等數(shù)值。這些計算公式帶有一些參數(shù)(分為基本參數(shù)和傳入?yún)?shù)),基本參數(shù)值并不固定,計算公式運算規(guī)則也可能會發(fā)生改變。若在項目開發(fā)時,直接把公式固定在代碼內(nèi),那么當用戶需要對公式進行適應性修改時,就得找開發(fā)此軟件的公司來修改源代碼,若公式變動的頻率較高時,每次修改的代價是不小的。筆者通過研究,提出“計算公式自定義設置”解決方案:將表達式和參數(shù)寫在用戶配置文件中,系統(tǒng)運行時讀取配置文件,并將公式載入內(nèi)存。用戶若要對計算公式進行修改時,只需打開配置文件,按照一定的規(guī)則修改計算公式的參數(shù)或運算規(guī)則即可。
系統(tǒng)如何智能的識別、解析配置文件中字符串形式計算公式,并將用戶設置的基本參數(shù)及系統(tǒng)運行時傳入的參數(shù)映射到公式中,準確的計算出結(jié)果是本文研究的重點。筆者將本研究的問題歸結(jié)于以下模型:
result=calculateWithParameters(expression,params)。其中expression為從用戶配置文件中讀取的用戶設置好的計算表達式。params為從配用戶配置文件中讀出的基本參數(shù)和系統(tǒng)運行時傳入的參數(shù)集合。通過這兩個輸入及calculateWithParameters函數(shù),系統(tǒng)能夠自動輸出計算表達式的運算結(jié)果result。
2.1 獲取自定義計算表達式和參數(shù)列表(規(guī)定參數(shù)中負數(shù)用F表示負號,例如-1寫成F1)。
2.2 分析參數(shù)列表,將參數(shù)中值為負數(shù)的負號“-”用“F”替換,以便于區(qū)分表達式中的減號和參數(shù)中的負號。
2.3 分析計算表達式,將計算表達式中型為“{X}”的基本參數(shù)或傳入?yún)?shù)根據(jù)其標識符號X從參數(shù)列表中找到相應的值進行替換。
2.4 開始計算表達式。這里采用常用算法中的分治策略,將表達式根據(jù)“+”“,-”“,*”“,/”“,()”這些運算符及其優(yōu)先級將表達式劃分成更小的子表達式,通過遞歸的方式逐步劃分(入棧),直到最小的表達式能夠直接獲得其計算值,然后再退棧,逐步將得到的子表達式的計算值相運算“還原”出原計算表達式的結(jié)果。
核心偽代碼(Java)如下:
此外,本設計還涉及到模型的兩個輸入的獲取。對于expression和params中的基本參數(shù),可以直接從用戶配置文件中讀?。ㄟ@里建議配置文件使用XML文件,在系統(tǒng)運行時將公式及基本參數(shù)載入內(nèi)存)例如
系統(tǒng)運行時,當接收到界面層傳來的參數(shù)a,b,c的值時,將參數(shù)的標識符和數(shù)值放入HashMap中,params的收集也就完成了。接下來就能通過這個模型計算出結(jié)果。
某業(yè)績考核系統(tǒng)中的績點計算表達式如上配置文件所示:{a}*{x1}+*{x2}+{c}*{x3}+0.1*(j5i0abt0b-2),其中三個基本參數(shù)x1,x2,x3已在配置文件中設置。a,b,c,d為系統(tǒng)運行時要從界面層獲取的傳入?yún)?shù)。以下為計算績點的部分代碼:
圖1 對該實例模擬的結(jié)果進行測試
本文提出了一種比較通用的應對軟件系統(tǒng)中涉及到的計算公式經(jīng)常發(fā)生變動的解決方案,用戶只需簡單的修改配置文件即可應對變化,而不必修改源代碼,這樣使得軟件設計更加靈活,能夠有效的降低軟件維護所花費的代價。
[1]王曉東編著.算法設計與分析(第二版)[M].北京:清華大學出版社,2009.
[2]張峰,李慧麗.JavaWeb架構(gòu)開發(fā)與項目實戰(zhàn)[M].北京:清華大學出版社,2009.