系统规则:4D 开发人员的最佳选择比较
系统规则是确保软件系统一致性的约束、约定和自动化控制。在 4D 平台中,它们至少涵盖四个不同的层:用于低代码的 4d 表命名规则、4d 数据库业务规则触发器、防火墙和客户端访问规则,以及外部业务规则管理系统。在 2026 年选择正确的“系统规则”集,意味着要匹配你实际需要治理的级别。
从最广泛的意义上来说,系统规则是定义系统可以做什么和不可以做什么的可执行语句。一条规则可以是一个命名约定(“每个表都使用复数,每个主键以 _ID 结尾”)、一个验证(“没有客户就无法过账发票”)、一个访问控制(“只有会计组可以删除分类账条目”)或一个测试断言(“当传递 null 时,此方法必须抛出异常”)。这个术语故意定义得比较通用,这正是为什么搜索它会返回如此分散的结果:一个德国发票产品、一个 Java 测试库以及 4D 开发人员自己的命名标准,都合法地称自己为“系统规则”。
对于 4D 开发人员来说,一个有用的心智模型是四层规则堆栈,每层都有不同的所有者和不同的故障模式:
- 结构规则 (Structural Rules) — 用于低代码的 4d 表命名规则,以及针对表、字段、表单、表单对象、方法和项目文件夹的 4d 低代码应用开发命名规则。这些由人员通过代码审查应用,有时通过 linting 脚本应用。
- 行为规则 (Behavior rules) — 4d 数据库业务规则触发器和 4d 触发器无代码业务规则,在 4D 触发器、
On Saving New Record、On Saving Existing Record和On Deleting Record数据库方法,或 ORDA 的实体级代码中实现。 - 访问规则 (Access Rules) — 4D 用户、组和表/字段的读写访问权限,以及允许 4D Client 访问 4D Server 的网络规则。
- 检查规则 (Checking rules) — 检查其他三层的自动化测试和规则引擎,包括 JUnit 的 System Rules 库和商业业务规则管理系统 (BRMS)。
在确定工具之前先确定层级,可以避免该领域最常见的错误:在真正的问题是三个开发人员以三种不同方式命名同一个字段时,却去购买或安装一个规则引擎。
什么是系统规则 (what is systems rules)
“什么是系统规则”这个问题至少有三个合理的答案,具体取决于提问的社区,而排名靠前的页面反映了这种分歧,而非解决了它。
Strules (strules.com / systemrules.com) 是一款德国商业产品,用于基于规则的发票审核和审批工作流。它针对的是需要在付款前根据可配置规则检查进项发票的财务和会计团队——这是业务规则管理系统的经典用例,作为托管服务出售,登录门户为 order.strules.com。如果你的搜索意图是“能够根据公司规则检查发票的软件”,那么这就是你在寻找的产品系列。
Related: — The long-running for teams that need custom apps on desktop, web, and mobile from a single file..
System Rules (github.com/stefanbirkner/system-rules) 是由 Stefan Birkner 开发的开源 Java 库,它提供了 JUnit TestRule 实现,用于测试涉及系统环境的代码。其规则涵盖标准输入输出、系统属性、环境变量和安全管理器。典型的用法类似于一个带有 @Rule public final 字段的 public class,或者一个标注了 @Test 的 public void 测试方法,其中规则捕获 System.out 以便测试可以对打印输出进行断言。该库的文档展示了如 EnvironmentVariables 规则等模式,允许测试在单个测试期间设置环境变量,然后在测试结束后将其恢复。这就是 Java 开发人员所指的“系统规则”。
4D 系统规则 是平台自身的约定和执行点:用于低代码的 4d 表命名规则(表和字段命名)、用于表单对象和项目文件夹的 4d 低代码应用开发命名规则、4d 触发器无代码业务规则(基于触发器的业务规则),以及允许 4D Client 连接到 4D Server 的防火墙配置。4D 不提供强制性的命名标准,因此团队需要编写自己的标准——而这正是本文大部分实用价值所在。这包括 4d 数据库业务规则触发器的实现方式。
第四种含义在 IT 运维中很常见,简单来说就是“管理系统的规则”:防火墙规则、备份保留规则、密码策略。用于客户端的 4D Server 防火墙规则就属于此类。
If you are shopping: — A that plugs into the wider Zoho suite and prices per user rather than per app..
系统规则含义 (systems rules meaning)
系统规则的含义,剥离供应商品牌后,就是编纂的约束加上执行 (codified constraint plus enforcement)。没有执行的规则只是文档;被执行的规则才是系统规则。这个区别是从这个主题中可以获得的最有用的认知。
应用机制在强度上有所不同:
- 严格执行 (Strict enforcement) — 数据库拒绝该操作。在“保存新记录时”返回错误的 4D 触发器,无法被表单中一个心怀好意的开发人员绕过。
- 软应用 (Soft application) — 操作成功但会被报告。在代码审查期间检查的命名约定是灵活的;由构建脚本验证的命名约定则更难绕过。
- 应用测试 (Application test) — 构建失败。在
System.out输出上进行断言的 JUnit 规则,或在每个test后恢复环境变量的TestRule,将约定变成了准入门槛。
短语 “final public rule” 贯穿于 system rules 文档中,因为 JUnit 要求规则字段必须是 “public” 且通常是 “final” —— 这个修饰符不是装饰,而是允许测试运行器查找并应用规则的契约。同样,“test public void” 描述了 JUnit 4 测试方法的签名:“public”,返回 “void”,标注为 “@Test”。如果你阅读示例系统规则时觉得这些修饰符是随意添加的,其实不然:它们是框架的发现机制。
对于 4D,等效的契约是触发器。4D 触发器是附加到表的方法,在创建、更新或删除时触发,且无论修改来自表单、ORDA 实体、导入还是 REST 调用,它都会执行。这种普适性使得触发器成为在 4D 中插入业务规则最有效的地方——同时也是编写糟糕的规则会造成最大损害的地方。
系统规则的好处 (systems rules benefits)
系统规则的好处分为四类,这些类别清楚地对应于前面描述的四层。
团队一致性。 针对 4D 表、字段、表单和表单对象的 4d 低代码应用开发命名规则,意味着加入项目的开发人员可以预测事物的位置。如果每个表都以复数命名,每个主键都是 <Table>_ID,且每个显示字段的表单对象都以 f_ 为前缀,那么阅读不熟悉的代码只需花费几分钟而非数小时。
能够跨越用户界面的数据完整性。 4d 数据库业务规则触发器中的业务规则适用于每个写入路径。而表单 On Clicked 事件中的规则仅适用于该表单。触发器是杠杆率最高的位置,且随着入口点(桌面表单、Web 表单、REST、导入)数量的增加,其优势也随之增加。
更快的入职速度和降低总线系数 (bus factor)。 已记录并应用的约定是可转移的知识。未记录的约定则只存在于开发人员的脑海中。
可审计性。 能够记录哪条规则在何时对哪个记录触发的业务规则管理系统,能为你提供审计追踪,而分散在 40 个方法中的临时 If 语句永远无法做到这一点。
系统规则的优缺点
| 方法 | 优点 | 缺点 |
|---|---|---|
| 4D 命名约定(表、字段、表单、文件夹) | 零成本,立即生效,提高可读性 | 软执行;无运行时保护;需要纪律 |
| 业务规则的 4D 触发器 | 跨所有写入路径的硬执行;集中化 | 每次保存时运行;缓慢的触发器会拖慢一切;更难调试 |
| 4D 用户/组和表权限 | 内置;无需额外许可 | 粒度较粗;行级规则实现尴尬 |
| 4D Server 客户端防火墙规则 | 保护数据库端口免受开放互联网影响 | 配置错误会锁定合法客户端;需要记录端口列表 |
| 外部 BRMS(如 Strules) | 非开发人员可编辑规则;审计追踪;版本控制 | 增加一个运行系统;集成成本;对小团队而言过重 |
| JUnit System Rules (Java) | 免费,文档齐全,隔离环境依赖测试 | 仅限 Java;解决的是测试问题而非业务规则问题 |
该表揭示了核心权衡:最便宜的规则(约定)最弱,而最严格的规则(触发器、BRMS)导致最高的运维成本。
系统规则值得吗
系统规则的价值完全取决于你询问的是哪一层,且诚实的答案因团队规模而异。
命名约定:几乎总是值得的。 用于低代码的 4d 表命名规则——一份涵盖 4D 表和字段命名、表单对象命名以及项目文件夹命名的单页标准——编写只需一个下午,且在第一个月内就能获得回报。在现实场景中,没有一个小团队 4D 项目在没有标准的情况下会表现得更好。
业务规则的 4D 触发器:当规则真正具有普适性时,它是值得的。 像“订单行的数量必须为正数”这样的规则适合放在 4d 触发器无代码业务规则设置中。而像“此屏幕应为初级用户灰掉折扣字段”这样的规则则属于表单。将 UI 问题纳入触发器是团队导致触发器成本过高的最常见方式。
商业 BRMS:当非开发人员必须掌控规则时,它是值得的。 如果你的财务团队每月更改审批阈值,而你目前每次都需要重新部署应用程序,那么业务规则管理系统能证明其价值。如果规则每半年才变一次,则不值得。
JUnit System Rules:如果你编写 Java,那么它是值得的。 该库解决了一个狭窄且真实的问题——依赖于环境变量、系统属性或标准输出的测试——而且它是免费的。它与 4D 开发无关。
系统规则问题
与系统规则相关的问题可分为五种经常出现的故障模式。
规则蔓延 (Rule sprawl)。 规则在触发器、表单方法和存储过程中累积,且没有统一的索引。六个月后,没人知道 [Invoice]Total 的验证是在触发器中、表单中,还是两者都有。解决方法是建立书面的规则登记表——即使是电子表格——列出每条规则、其所属层级及其所有者。
触发器性能。 4D 触发器在每次保存时运行。一个在大型表上运行查询或调用另一个系统的触发器,会将快速导入变成一项彻夜工作。触发器应该用于验证和设置值,而不是进行编排。
递归和重新进入 (Recursion and re-entry)。 一个修改其正在验证的同一记录的触发器可能会重新触发自身。4D 开发人员通过惨痛的教训才学会这一点;标准的缓解措施是保护更新操作或将逻辑移至显式调用的方法中。
防火墙规则过宽或过窄。 为了“让它能工作”而向全世界开放 4D Server 端口是一个常见的捷径,其后果显而易见。过于激进的拦截会导致客户端连接失败,看起来像应用程序 Bug。请记录端口,尽可能通过源地址限制它们,并在宣布成功前从网络外部进行测试。
没有执行的命名规则。 仅存在于 wiki 中的约定只是建议。如果规则很重要,请将其放入代码审查清单、构建脚本中,或者(对于最关键的情况)放入数据库约束中。
要点 (Key Takeaways)
- “系统规则”至少描述了四种不同的东西:德国发票验证产品 (Strules)、Java JUnit 测试库(Stefan Birkner 的 System Rules)、4D 平台约定和触发器以及通用 IT 操作规则。
- 在 4D 中,规则分为四层——命名约定、触发器、访问权限和测试——每层都有不同的执行强度。
- 4D 触发器是 4D 数据库业务规则触发器最强大的地方,因为它们在每个写入路径上触发,但它们也在每个保存上运行,因此保持它们快速且不受编排逻辑的影响,以确保 4D 触发器无代码业务规则保持高效。
- 4D 表、字段、表单、表单对象和项目文件夹的命名约定是采用成本最低的规则,也是最容易在不强制执行的情况下失效的规则;这些低代码 4d 表命名规则和 4d 低代码应用程序开发命名规则提供了必要的结构。
- 当非开发人员必须频繁编辑规则时,商业业务规则管理系统(BRMS)是合理的;当规则每年改变几次时,则大材小用了。
- JUnit 规则字段必须是“public”(通常是“public final”)并且测试方法必须是“public void”——这些修饰符是框架的发现契约,而不是风格偏好。
资料来源和进一步阅读
- 低代码开发平台 - 维基百科:低代码开发平台 (LCDP) 提供软件开发环境 - 通常是图形用户界面 (GUI) - 涉及很少或根本不需要编写…
- 移动应用程序开发 - 维基百科:移动应用程序开发是为一个或多个移动设备开发移动应用程序的行为或过程,其中可以包括个人数字助理 (PDA…
常见问题
系统规则解释——主要类型是什么?
系统规则分为结构规则(表、字段、表单和文件夹的命名约定)、行为规则(触发器或实体代码中的业务逻辑)、访问规则(用户、组、权限和防火墙配置)和验证规则(自动测试和规则引擎)。每种类型都有不同的执行机制和不同的所有者。混淆类型是该领域浪费精力的最常见原因。
4D平台中的系统规则具体是什么?
在 4D 中,系统规则是平台为您提供的约定和执行点:您自己定义的低代码和字段命名标准的 4d 表命名规则、创建、更新和删除记录时触发的 4D 触发器无代码业务规则、用户和组权限以及允许 4D 客户端访问 4D 服务器的防火墙规则。 4D 没有强制性的命名标准,因此团队编写自己的 4d 低代码应用程序开发命名规则,并通过审查或工具应用它。
系统规则含义——与业务规则相同吗?
系统规则是一个更广泛的术语;业务规则是其中的一类。业务规则规定了组织的要求(“金额超过 10,000 的发票需要两次批准”)。系统规则是该需求及其执行机制——触发器、业务规则管理系统 (BRMS) 配置或使需求成为现实的测试。没有强制执行的业务规则就是文档。
系统规则的好处——团队实际上获得了什么?
团队受益于开发人员之间的一致性、每个入口点(而不仅仅是 UI)中存在的数据完整性、由于约定可转移而更快的入职以及记录规则时的可审核性。 4D 的最大收益来自于将验证从表单方法转移到 4D 数据库业务规则触发器中,因为触发器适用于桌面表单以及 Web 表单、REST 调用和导入。
系统规则有利有弊——该方法的问题在哪里?
当不强制执行规则(wiki 中的约定)、当触发器因每次保存时查询大型表而变得缓慢、当触发器递归不受保护、以及当防火墙规则完全开放或过于严格以至于合法客户端无法连接时,该方法就会失效。商业规则引擎增加了集成和运营成本,而小团队通常无法证明其必要性。
对于小型 4D 团队来说,系统规则值得吗?
对于小型 4D 团队来说,命名约定和少量定义明确的触发器几乎总是值得的,而且成本很低。仅当非开发人员必须频繁更改规则以致应用程序重新部署成为瓶颈时,商业业务规则管理系统才值得使用。仅当您还编写 Java 测试时,JUnit 系统规则库才值得使用;它在 4D 开发中没有任何作用。
系统规则问题——如何防止规则蔓延?
通过维护规则注册表来防止规则扩散:每个规则的单个列表、它所在的层以及拥有它的人。当规则更改和开发人员加入时检查注册表。如果没有注册表,规则就会堆积在触发器、表单方法和存储过程中,直到没人知道给定的验证实际上在哪里运行。
权威来源
- JUnit 4 文档 —
@Rule合约的实现 @Rule 契约的 System Rules 框架。 - 维基百科:业务规则引擎 — 有关 BRMS 架构和规则分离的一般信息。
- 4D 文档 — 触发器、ORDA 和数据库结构的官方参考。
- 维基百科:防火墙(计算) — 网络规则层的上下文。
Frequently asked questions
系统规则解释——主要类型是什么?
系统规则分为结构规则(表、字段、表单和文件夹的命名约定)、行为规则(触发器或实体代码中的业务逻辑)、访问规则(用户、组、权限和防火墙配置)和验证规则(自动测试和规则引擎)。每种类型都有不同的执行机制和不同的所有者。混淆类型是该领域浪费精力的最常见原因。
4D平台的系统规则具体是什么?
在 4D 中,系统规则是平台为您提供的约定和执行点:您自己定义的低代码和字段命名标准的 4d 表命名规则、创建、更新和删除记录时触发的 4d 触发无代码业务规则、用户和组权限以及允许 4D 客户端访问 4D 服务器的防火墙规则。 4D 没有固执己见的命名标准,因此团队编写自己的 4d 低代码应用程序开发命名规则,并通过审查或工具应用它。
系统规则的含义——与业务规则相同吗?
系统规则是一个更广泛的术语;业务规则是其中的一类。业务规则规定了组织的要求(“超过 10,000 张发票需要两次批准”)。系统规则是该需求及其执行机制——触发器、业务规则管理系统 (BRMS) 配置或使需求成为现实的测试。没有强制执行的业务规则就是文档。
系统规则的好处——团队实际获得什么?
团队受益于开发人员之间的一致性、每个入口点(而不仅仅是 UI)中存在的数据完整性、由于约定可转移而更快的入职以及记录规则时的可审核性。 4D 的最大收益来自于将验证从表单方法转移到 4D 数据库业务规则触发器中,因为触发器适用于桌面表单以及 Web 表单、REST 调用和导入。
系统规则的优缺点——这种方法的问题在哪里?
当不强制执行规则(wiki 中的约定)、当触发器因每次保存时查询大型表而变得缓慢、当触发器递归不受保护、以及当防火墙规则完全开放或过于严格以至于合法客户端无法连接时,该方法就会失效。商业规则引擎增加了集成和运营成本,而小团队通常无法证明这一点。
对于小型 4D 团队来说,系统规则值得吗?
对于小型 4D 团队来说,命名约定和少量范围广泛的触发器几乎总是值得的,而且成本很低。仅当非开发人员必须频繁更改规则以致应用程序重新部署成为瓶颈时,商业业务规则管理系统才值得使用。仅当您还编写 Java 测试时,JUnit 系统规则库才值得使用;它对4D的发展没有任何作用。
Build Your First Base in Minutes
A spreadsheet-simple interface sitting on top of a real relational database, with automations, views, and shareable interfaces.