写点什么

配置中的动态代码

用户头像
顿晓
关注
发布于: 2021 年 04 月 04 日
配置中的动态代码

遇到的问题

配置化完成后使用时很爽,但开发时却时常遇到为支持可配置的痛苦。

为了支持可配置,无疑增加了设计难度,虽然增加了难度,如果仍能保持设计的简单,则是最推荐的;但有时会增加不必要的复杂性,反而觉得如果在配置中支持一定的逻辑表达,则会让整体设计更简单。

分析

这其实就是要求能够解析并执行部分代码。JavaScript 中的 eval 就是做这个事的,但大家都不推荐使用,因为输入的代码无法保证安全,推荐使用另一个 Function,在输入的参数上做限制,而在配置中的代码部分,则约定只使用传入的参数。


比如,像下面这样注入支持的功能,当做参数传给 Function:

const extend = {  fn1: (...) => {...}  fn2: (...) => {...}}
const useConfig = (config) => { const fn = new Function('extend', config.cmd1) fn(extend)}
复制代码


在配置中就可以像下面这样使用:

{  ...,  cmd1: 'return extend.fn1(...)'}
复制代码


为了进一步的安全性,可以在动态创建函数前,对函数体的部分增加校验。因为大部分配置中的代码都是一行代码,可以通过正则表达式来限定输入的内容。


如此,不用自己实现一个 DSL,借助动态创建函数,以及往函数中注入需要动态调用的功能,让可配置的功能能力大为增强。最关键的是在灵活配置和功能扩展上可以取的一个平衡,让整体设计保持简单。

发布于: 2021 年 04 月 04 日阅读数: 42
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 知识星球「俺的死党顶」

评论

发布
暂无评论
配置中的动态代码