表示式的動態解析和計算,Flee用起來真香

Code綜藝圈發表於2022-06-18

前言

在很多專案中經常會出現需要動態解析表示式和計算的場景,比如一些自動稽核規則,或者是一些變數的值通過維護的公式在執行過程中動態算出;由於場景需求,都需要比較靈活的配置對應的表示式,然後希望在需要的時候能根據維護的表示式計算出對應的值;剛好這塊和同事聊天的時候說到Flee,感覺挺好用,趕緊來和小夥伴們來分享一波。

正文

1. Flee簡介

Flee是一個用於. net框架的表示式解析器和求值器,可以在執行時計算字串表示式的值(如:sqrt(a^2 + b^2),其中a、b是變數)。它的解析和計算速度是比較快和高效的。

Flee 支援Net6.0、Net5.0、Netstandard2.1、Netstandard2.0。

其他就不多嘮了,我們們直接上幾個例項感受一波,更多詳情小夥伴們可以去github上查閱:

github地址:https://github.com/mparlak/Flee

2. 案例演示

案例就通過控制檯演示了,安裝上Flee包即可。

2.1 超級簡單案例

程式碼中有具體的註釋,這裡就不再詳細說步驟了,截圖如下:

這種簡單表示式內容都已經確定,全是可以計算的,沒有變數。

應用場景1:表示式固定,直接通過對應的值拼接計算的場景。

應用場景2:表示式不固定,但是公式維護時針對一些變數值用特殊字元標記,然後通過正規表示式的形式找到標記的變數,並替換為對應的業務欄位值。

如:[a]+[b]+3.14,這種情況是可以通過正規表示式將中括號標記的變數找出來的,然後根據對應的中間變數的名字替換對應的值就可以計算了。

2.2 帶變數的表示式

程式碼中有具體的註釋,這裡就不再詳細說步驟了,截圖如下:

這種帶變數的形式就相對比較靈活,可以任意配置,只需在計算的時候將對應的變數附上值即可。有小夥伴可能會有疑問,變數不確定咋整啊,其實在實際應用場景中,很多時候需要傳入的那些變數應該都知道,只是照著公式的規則動態傳值即可。

應用場景:和簡單案例中的不太一樣,不需要特殊標記變數,這裡直接正常維護公式正常傳值即可。這種情況相對靈活,可以針對相關業務配置對應的公式,最後傳對應的變數進行計算,最後根據算出的值進行相關業務處理即可。

2.3 表示式組合

CalculationEngine 可以將表示式進行組合計算,計算引擎會使用引擎內部其他表示式的結果、依賴關係,然後按順序進行計算出組合之後的結果

應用場景:這種情況一般用於有多個表示式的場景,就類似於Excel中多個單元格中的表示式一樣,每個單元格中都有表示式,然後有一個單元格就會引用其他單元格中的表示式計算出來的值,最後得出結果。

2.4 擴充套件函式

有時候在專案中會將計算邏輯進行封裝,只需要傳入需要值即可,不需要每個呼叫者還得重新進行編寫相關的計算邏輯,Flee也支援在表示式中組合使用自定義的函式,演示如下:

先在一個類中寫好相關的方法,這裡的方法一定要是靜態的、公共的,如下:

然後就可以在表示式中用了,如下:

2.5 支援可變引數的函式

和上面使用方式一樣,自定義一個方法,只是這個方法的引數是不確定,可變的,如下:

在表示式中使用:

2.6 返回值是Boolean型別的表示式

在實際應用場景中,有些時候只需要得到一個是否的結果,可能不需要計算一個具體的值;

應用場景:這種情況一般用於一些自動判定規則的需求,比如有一些報表的結果在不同的業務型別時會有一個值的範圍,如果超出範圍就代表不合規,靠人為判斷的話可能就沒那麼高效;類似這種對比資料的情況,如果只是簡單的比對還容易實現,如果是複雜一點的關係比對,這種方式就相對靈活了。

好了,使用方式就暫時說到這,文中圖片已經包含所有的程式碼。稍後我也會把程式碼提交github上和碼雲上。

總結

上文只是列舉了一些簡單的使用例項,具體小夥伴們可以根據業務場景進行使用。小夥伴們如果有更好的工具庫,歡迎大家留言,一起學習。

關注“Code綜藝圈”,和我一起學習吧。

相關文章