亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

一個表達式計算案例的設計和實現

2019-11-18 11:57:28
字體:
來源:轉載
供稿:網友

問題由來


    在我做過的一個針對網絡設備和主機的數據采集系統中,某些采集到的數據需要經過一定的計算后才保存入庫,而不是僅僅保存其原始值。為了提供給用戶最大的靈活性,我設想提供一個用戶界面,答應用戶輸入計算表達式(或者稱為計算公式)。這樣,除了需要遵從少量的規則,用戶可以得到最大的靈活性。

    這樣的表達式具有什么特點呢?它一般不是純的可立即計算的表達式(簡單的如:1+2*3-4)。它含有我稱為變量的元素。變量一般具有非凡的內定的語法,例如可能用"@totalmemory"表示設備或主機(下面簡稱為設備)的物理內存總數,那么表達式"(@totalmemory-@freememory)/@totalmemory*100"就表示設備當前內存使用率百分比。假如與告警系統聯系起來,監測此值超過80系統就發出Warning,那么這就成為一件有意義的事情。不同種類的采集數據入庫前可能需要經過復雜度不同的計算。但顯然,最后求值的時候,必須將那些特定的變量用具體數值(即采集到的具體數值)替換,否則表達式是不可計算的。這個過程是在運行時發生的。

問題的一般性


    我認為表達式計算是個一般性的話題,并且也不是一個新的話題。我們可能在多處碰到它。我在讀書的時候編寫過一個表達式的轉換和計算程序,當時作為課余作業。我看到過一些報表系統,不管它是單獨的,還是包含在MIS系統、財務軟件中,很多都支持計算公式。我認為這些系統中的計算公式和我所碰到的問題是大致相同的。對我來說,我在數據采集項目中碰到這個問題,下次可能還會在其他項目中碰到它。既然已經不止一次了,我希望找到一個一般性的解決方案。

一些已有的設計和實現不能滿足要求


     在設計和實現出第一個版本之后,我自己感覺不很滿足。隨后我花點時間上網搜索了一下(要害字:表達式 中綴 后綴 or EXPRession Infix Postfix)。令人稍感失望的是,所找到的一些關于表達式的轉換、計算的程序不能滿足我的要求。不少這樣的程序僅僅支持純的可立即計算的表達式,不支持變量。而且,表達式解析和計算是耦合在一起的,很難擴展。增加新的運算符(或新的變量語法)幾乎必定要修改源代碼。在我看來,這是最大的缺陷了(實際上,當年我編寫的表達式轉換和計算的程序,雖然當時引以自豪,但是現在看來也具有同樣的缺陷)。但是,表達式的轉換和計算本身有成熟的、基于棧的的經典算法,許多計算機書籍或教材上都有論述。人們以自然方式書寫的表達式是中綴形式的,先要把中綴表達式轉換為后綴表達式,然后計算后綴表達式的值。我打算仍然采用這個經典的過程和算法。

我的設計想法和目標


    既然表達式的轉換和計算的核心算法是成熟的,我渴望把它們提取出來,去除(與解析相關的)耦合性!試想,假如事物具有相對完整的內涵和獨立性,會產生這個需要,并且也能夠通過形式上的分離和提取來把內涵給表現出來,這個過程離不開抽象。我不久意識到自己實際上在設計一個小規模的關于表達式計算的框架。

    表達式要支持加減乘除運算符,這是基本的、立即想到的?;蛟S還應該支持平方,開方(sqrt),三角運算符如sin,cos等。那么假如還有其它怎么辦,包括自定義的運算符?你能確定考慮完備了嗎?像自定義的運算符,是完全存在的、合理的需求。在數據采集系統中,我一度考慮引入一個diff運算符,表明同一個累加型的采集量,在相距最近的兩次(即采集周期)采集的差值。以上的思考促使我決定,運算符的設計必須是開放的。用戶(這里指的是用戶程序員,下同)可以擴展,增加新的運算符。

    表達式中答應含有變量。對于變量的支持貫穿到表達式解析,轉換,計算的全過程。在解析階段,應該答應用戶使用適合他/她自己的變量語法,我不應該事先實現基于某種特定語法的變量識別。

    由于支持可擴展的運算符,未知的變量語法,甚至連基本的數值(象123,12.3456,1.21E17)理論上也有多種類型和精度(Integer/Long/Float/Double/BigInteger/BigDecimal),這決定了無法提供一個固化的表達式解析方法。表達式解析也是需要可擴展的。最好的結果是提供一個輕易使用和擴展的解析框架。對于新的運算符,新的變量語法,用戶在這個框架上擴展,以提供增強的解析能力。從抽象的角度來看,我打算支持的表達式僅由四種元素組成:括號(包括左右括號),運算符,數值和變量。一個最終用戶給出的表達式字符串,解析通過后,可能生成了一個內部表示的、便于后續處理的表達式,組成這個表達式的每個元素只能是以上四種之一。

數值


    一開始我寫了一個表達數值的類,叫做Numeral。我為Numeral具體代表的是整數、浮點數還是雙精度數而操心。從比較模糊的意義上,我希望它能表達以上任何一種類型和精度的數值。但是我也希望,它能夠明確表達出代表的具體是哪種類型和精度的數值,假如需要的話。甚至我想到Numeral最好也能表達BigInteger和BigDecimal(設想恰巧在某種場合下,我們需要解析和計算一個這樣的表達式,它答應的數值的精度和范圍很大,以至于Long或Double容納不下),否則在非凡的場合下我們將碰到麻煩。在可擴展性上,數值類不大像運算符類,它應該是成熟的,因而幾乎是不需要擴展的。

    經過反復嘗試的混亂(Numeral后來又經過修改甚至重寫),我找到了一個明智的辦法。直接用java.lang.Number作為數值類(實際上這是一個接口)。我慶幸地看到,在Java中,Integer,Long,Float,Double甚至BigInteger,BigDecimal等數值類都實現了java.lang.Number(下面簡稱Number)接口,使用者把Number作為何種類型和精度來看待和使用,權利把握在他/她的手中,我不應該提前確定數值的類型和精度。選擇由Number類來表達數值,這看來是最好的、代價最小的選擇了,并且保持了相當的靈活性。作為一個順帶的結果,Numeral類被廢棄了。

括號




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品香蕉国产| 国产日韩在线视频| 美女视频黄免费的亚洲男人天堂| 国产精品亚洲欧美导航| 日韩欧美中文字幕在线观看| 性亚洲最疯狂xxxx高清| 久久精品91久久久久久再现| 久久好看免费视频| 欧美精品videosex极品1| 在线看日韩av| 97在线看免费观看视频在线观看| 91精品中国老女人| 欧美日韩国内自拍| 68精品久久久久久欧美| 国产成人精品久久| 91精品国产综合久久香蕉922| 国产精品偷伦一区二区| 欧美人与性动交a欧美精品| 在线亚洲国产精品网| 亚洲bt欧美bt日本bt| 欧美日韩国产色视频| 欧美日韩在线影院| 在线视频亚洲欧美| 午夜精品蜜臀一区二区三区免费| 久久久99久久精品女同性| 国产视频在线一区二区| 91黑丝高跟在线| 日本精品在线视频| 亚洲精品白浆高清久久久久久| 亚洲剧情一区二区| 国产精品女主播| 亚洲成人国产精品| 国产91热爆ts人妖在线| 国产成人综合精品在线| 国产精品美女www| 国产精品成人av性教育| 久久精品久久久久| 日韩中文字幕精品| 91热精品视频| 中日韩美女免费视频网址在线观看| 欧美日韩精品国产| 欧美在线视频一二三| 欧美一级黑人aaaaaaa做受| 久久精品中文字幕一区| 久热精品视频在线观看| 久久精品男人天堂| 久久久久久国产| 成人有码在线视频| 精品国产乱码久久久久久虫虫漫画| 国产精品色婷婷视频| 日韩欧美在线视频观看| 亚洲视频一区二区三区| 久久中文字幕国产| 91精品国产91久久久久久最新| 国产精品91在线观看| 中文字幕在线亚洲| 欧美日韩精品在线观看| 亚洲国产一区二区三区在线观看| 欧美日韩在线视频首页| 91成人在线视频| 一本大道久久加勒比香蕉| 日韩一级裸体免费视频| 日韩av在线网页| 亚洲视频日韩精品| www国产精品com| 欧美成人剧情片在线观看| 狠狠久久五月精品中文字幕| 久久久久久久久国产| 中文字幕av日韩| 国产日韩欧美影视| 国产精品日韩在线观看| 亚洲欧美精品中文字幕在线| 51精品在线观看| 欧美—级a级欧美特级ar全黄| 久久99热精品这里久久精品| 精品福利视频导航| 欧美激情综合色综合啪啪五月| 精品国产一区久久久| 国产成人综合久久| 成人黄色激情网| 国产精品精品国产| 中文字幕日韩欧美在线| 亚洲午夜激情免费视频| 欧美亚州一区二区三区| 97国产suv精品一区二区62| 91免费视频网站| 91精品国产高清自在线看超| 日韩激情视频在线| 国产极品jizzhd欧美| www.亚洲成人| 亚洲韩国青草视频| 欧美电影在线观看高清| 91九色国产社区在线观看| 美女精品视频一区| 欧美极品在线播放| 在线成人免费网站| www.日韩.com| 欧美成人在线网站| 日韩av在线一区| 欧美性猛交xxxx黑人猛交| 97精品国产97久久久久久免费| 欧美午夜电影在线| 亚洲人成网站999久久久综合| 欧洲亚洲免费在线| 日韩欧美黄色动漫| 亚洲人成在线一二| 久久久久久久久久国产| 日韩三级成人av网| 亚洲国产小视频在线观看| 最好看的2019年中文视频| 日韩精品免费综合视频在线播放| 久久久久一本一区二区青青蜜月| 久久精品这里热有精品| 国模精品视频一区二区三区| 成人淫片在线看| 欧美中文字幕视频在线观看| 欧美性极品xxxx娇小| 欧美影院在线播放| 久久久久久久久久亚洲| 亚洲人成在线一二| 久久精品国产欧美亚洲人人爽| 51精品在线观看| 日韩欧美中文字幕在线播放| 久久久国产视频91| 精品视频在线播放免| 国产免费一区二区三区在线能观看| 国产精品入口日韩视频大尺度| 国产999精品久久久| 久久久人成影片一区二区三区观看| 亚洲精品资源在线| 国产精品劲爆视频| 国产做受69高潮| 亚洲高清福利视频| 精品自在线视频| 亚洲午夜久久久影院| 欧美激情a∨在线视频播放| 欧美尤物巨大精品爽| 亚洲va电影大全| 中文字幕亚洲欧美在线| 91亚洲精华国产精华| 日韩国产精品一区| 国产精品美女在线| 国产欧美最新羞羞视频在线观看| 日韩中文字幕国产精品| 91国内免费在线视频| 国产不卡av在线免费观看| 欧美在线精品免播放器视频| 欧美日韩一区免费| 国产精品精品久久久久久| 久99九色视频在线观看| 伊人久久综合97精品| 亚洲黄页网在线观看| 日韩成人av在线播放| 国产视频欧美视频| x99av成人免费| 亚洲精品国产精品久久清纯直播| 国产一区二区动漫| 国产精品视频999| 色偷偷91综合久久噜噜| 欧美人与性动交a欧美精品| 日韩av成人在线| 亚洲成人精品久久久| www欧美xxxx| 国产91色在线||