【问题标题】:Application design - modifiable business rules应用程序设计 - 可修改的业务规则
【发布时间】:2011-09-19 09:10:01
【问题描述】:

我正在寻找有关应用程序设计的一些建议。由于我签署了 NDA,因此我无法透露太多有关实际业务的信息,但会尝试解释该要求。

本质上,我们希望开发一个应用程序,该应用程序将根据客户的信用状况做出决定。我们将从合适的提供商(例如 Experian)获取数据,并将其与业务规则相匹配。如果客户符合这些规则,他们将获得一个绿旗,以传递给下一个流程(可能还有另一个系统,但目前并不担心);如果没有,他们将获得红旗并且不会被传递。

客户表示他们希望业务规则是可修改的,即他们可以修改的东西,而不是硬编码或卡在某处的代码中。他们将一组规则定义为“模板”。系统一次只能有一个活动模板,但在其生命周期内可能有许多模板。

这些规则将由检查不同数据类型的多个运算符组成。规则的每个阶段/步骤将被分配一定的权重。 “模板”的一个例子是

  • 客户是男的吗=10分
  • 客户是女性=20分

  • 客户年龄在 25 到 35 岁之间吗? = 20 分

  • 客户是否小于 25 岁? = 10 分

  • 客户的年收入是否在 30000 美元到 50000 美元之间 = 20 分

如您所见,有各种类型的比较/运算符(布尔值、整数等)。

我正在寻找可以构建这些“模板”的框架/建议。这是一个网络作业,所以我们知道我们肯定会使用某种数据库。该技术尚未确定,但可能介于 PHP 和 .NET 之间。我们认为现阶段大部分工作将在 SQL 中完成(并想看看这是否是一个好主意)

有没有我可以通过的示例应用程序?以前有人做过这种性质的工作吗?

谢谢!

【问题讨论】:

  • 谨防尝试使用 SQL 对复杂的业务规则进行建模。边缘案例可以迅速将事情变成数以万计的表格和行。请参阅此(有些争议)video on ACL 示例。

标签: design-patterns business-logic business-rules


【解决方案1】:

如果你所有的规则都这么简单,你可以使用类似的东西:

Rule {
    ruleId,
    templateId,
    comparisonType,
    fieldName,
    minValue,
    maxValue,
    scoreIfPassed
}

Template {
    templateId,
    rules
}

...所以RuleTemplate 相关联,并指定要应用于给定的比较类型(如'greaterThanMin'、'lessThanMax'、'exactValue'、'insideRange'等)场地。然后你可以这样做:

user.score = 0;
rules = currentTemplate.rules;
for each rule in rules do
    if rule.comparisonType == 'exactValue' && user[field] == minValue
        user.score += rule.scoreIfPassed;
    else if rule.comparisonType == 'insideRange' && user[field] > minValue && user[field] < maxValue
        user.score += rule.scoreIfPassed;

    ...
end  

【讨论】:

  • 嗨 - 谢谢。我要消化很多代码(几年前停止编码),所以必须弄清楚什么放在哪里!
【解决方案2】:

我不认为让您的客户用 SQL 编写自己的规则然后执行这些规则是一个聪明的主意。首先,您可能会遇到安全问题(例如,如果他们访问了不应访问的数据库部分),并且您透露了太多的实现细节(如果他们开始使用特定于 DBMS 的操作,然后您决定替换数据库管理系统)。

根据您想在这里投入的工作量,这对于Domain Specific Language 来说听起来不错。 @Ozair 建议使用 BPEL,但它可能有点矫枉过正。

【讨论】:

  • 嗨 - 谢谢。领域特定语言可能是前进的方向,但我很想在深入研究之前看到一个例子。
  • 糟糕——点击提交错误!我同意客户用 SQL 编写规则是有风险的。我们的想法是,在实施这些更改时总会有一名技术分析师 - 不过我们想要避免的是,只要规则发生变化,就会更改核心应用程序。
【解决方案3】:

我想你正在寻找Business Process Execution Language

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2011-12-17
    • 2011-12-15
    • 2010-09-07
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多