我想允許用戶定義簡單業務邏輯,如:如何將業務邏輯存儲到數據庫中?
if (x and y) then ...
if (z or w) then ...
讓我把它具體:
我開發,如果申請人滿足一定的要求,回答一個HR模塊,由用戶定義。
這些要求可以圍繞邏輯運算符來定義:
(必須是18歲)或(18歲和必須有家長許可)
是把這個數據庫裏面的邏輯好嗎?我認爲是這樣,但我害怕花時間在這件事上,並發現它是一種糟糕的做法。
我想允許用戶定義簡單業務邏輯,如:如何將業務邏輯存儲到數據庫中?
if (x and y) then ...
if (z or w) then ...
讓我把它具體:
我開發,如果申請人滿足一定的要求,回答一個HR模塊,由用戶定義。
這些要求可以圍繞邏輯運算符來定義:
(必須是18歲)或(18歲和必須有家長許可)
是把這個數據庫裏面的邏輯好嗎?我認爲是這樣,但我害怕花時間在這件事上,並發現它是一種糟糕的做法。
經常這樣,答案是「它依賴於」;)由於在這種情況下,邏輯似乎是用戶定義的數據,因此將其放入數據庫是絕對合理的。
但是,如果你正在尋找此輸入的結構/ AST與他們and
和or
控制流模型爲單獨的業務對象反映數據庫中的記錄,我不得不說,這很可能矯枉過正和意志 - 除了最初的實現開銷 - 使未來的重構非常困難。
將在運行時評估的簡單文本字段是最簡單的方法,因爲其內容可以很容易地提取和推理。
不知道你的權威要求,我建議你看看Drools,一個Java的規則引擎,它的生態系統中還有一個規則存儲後端和指導編輯器。順便提一下,你的問題中的例子看起來很像它可能受益於規則引擎,但不幸的是,我沒有任何相關Ruby庫的實際經驗。
否則這篇關於thougtbot博客的文章 - Writing a Domain Specific Language in Ruby - 也可能對此有幫助。
我絕對認爲沒關係。由於用戶正在定義業務邏輯或規則,因此我建議將業務邏輯表單字段拆分爲多個部分(規則:if/unless,操作數1:user.age,操作數2:權限。父級操作員1:和操作員2:更高級_ .. ),然後將每個業務邏輯對象作爲行存儲在序列化的JSON列中。與用戶輸入任何他們喜歡的單個文本字段相比,這應該使他們更容易驗證並且更不容易出錯。
我會建議創建一個簡單的表來存儲邏輯,如果它是可預測的。
例如:
Table: business_logics
Attributes:
opt_1: decimal
opt_2: decimal
logic_opt: integer (enum: and|or)
then_statement: string
所以這是可擴展的,當你有一天在更logic_opt
,順便說一句,你可以得到的好處的驗證&重構以後!允許用戶輸入自由文本在您的案例中風險很大!
沒關係。這是一種靈活的方法,雖然在開發過程中很耗時。此外,您不必創建自己的DSL,它已經完成,例如, json-logic-ruby允許在json中保留複雜的規則。