我来自数据库编程背景(例如Oracle PL/SQL),由于招聘Web开发人员的困难,我不得不为最近的一个项目学习一些打字脚本.我做得很好--我写的是非常笨拙的后脑勺类型代码.它只是必须奏效,而且确实奏效了.

我觉得有一种数据库世界熟悉的编程方式,我看不到如何在打印脚本中实现.考虑以下判断业务规则的工作代码片段:

public br_12(contractBid: WFO.ContractBid) {
  const condition1 =  (contractBid.n_tax_per <= 0.003);
  const condition2 =  (this.br_12(contractBid) === 0 && this.br_18(contractBid)) === 0 && contractBid.n_tax_per <= 0.005;
  if (condition1 || condition2)
      {
        return Math.ceil ( ( this.br_2(contractBid) * contractBid.n_tax_per) * 100 / 100 ) ;
    } else {
      return 0;
    }
  }

我希望能够在外部的JSON文件或其他外部数据源中存储业务规则,特别是条件,并有时以编程的方式任意引用它们.并且能够在不"更改任何代码"的情况下更新它们--当然,我知道当它们更改时,应用程序将不得不重新构建和重新部署.因此,要编写非常粗略的示例代码:

{
    "business rules conditions": {
        "condition1": "(contractBid.n_tax_per <= 0.003)",
        "condition2": "(this.br_12(contractBid) === 0 && this.br_18(contractBid)) === 0 && contractBid.n_tax_per <= 0.005"
    }
}

public br_12(contractBid: WFO.ContractBid) {
  if (this.external.condition1 || this.external.condition2)
      {
        return Math.ceil ( ( this.br_2(contractBid) * contractBid.n_tax_per) * 100 / 100 ) ;
    } else {
      return 0;
    }
  }

别管我想要做这样的事情是不是疯了--有办法做到吗?

推荐答案

不幸的是,脚本/类型脚本将数据视为不可执行的.

因此,您需要将规则存储为字符串,并将其转换为代码,例如使用:

  • eval,这被认为是糟糕的做法(因为它是一个容易攻击的载体目标)
  • 文本分析,即构建一种迷你语法/领域特定语言

但如果我理解正确的话,首先您希望将业务规则的定义与它们的使用位置分开.也许这样它们都集中在一个地方,更容易审查和维护等.

在这种情况下,还有许多其他可能的解决方案:

  • 使每个业务规则成为一个简单的函数,所有这些都在单个模块中导出
  • 单例类的方法(本质上类似于前面的点,但对OOP开发人员来说可能更熟悉)

您甚至可以考虑从源代码管理中忽略该文件(如果您想要根据环境交换它,"without changing any code"),尽管对于这样的用例,因为它涉及代码,我们宁愿提交所有不同的代码版本,并仅根据环境变量导入适当的模块(例如,使用tsconfig导入路径别名).

Json相关问答推荐

jq不会为空输入返回非零

如何编写MongoDB查询以返回数组数组

修改Deneb图表中工具提示的字体大小

用 Jolt 替换 JSON 中的值

当并非所有子对象都有 Select 器字段时 Select

展平多个数组以保持顺序

迭代powershell双维json对象

JOLT分裂和数组数据

通过 xslt 将内部 json 转换为 xml 时遇到问题

使用 KQL 和外部 data() 运算符从 json 文件中提取信息

如何为包含一些固定值并可能具有其他附加值的数组字符串创建数组 json 架构

如何将西里尔字母转换为 utf16

Spring MVC 4:application/json内容类型设置不正确

如何使用 Jackson 重命名 JSON 序列化中的根键

将 PHP 结果数组转换为 JSON

如何在 swift 2 中获取 Alamofire.request().responseJSON 的结果值?

JSON 使用 simplejson 序列化 Django 模型

在 JSON.NET 中序列化派生类时的字段顺序

如何在spark 上将json字符串转换为数据帧

IE10/11 Ajax XHR 错误 - SCRIPT7002:XMLHttpRequest:网络错误 0x2ef3