停止那个DSL!

是的,把它放在那里

但是,这是来自Ruby爱好者的奇怪说法。 那怎么会

DSL大流行

在某个时候,Ruby社区的一部分决定我们需要DSL来完成所有工作。 我可能会专注于提高Ruby的速度或垃圾收集,而不是DSL,但毕竟我只是该语言的狂热用户,而不是整个社区的狂热用户。

公平地说,在Ruby中(尤其是在Rails中)构建或使用DSL真的很容易。 逻辑上,许多开发人员在他们的项目中使用其中的一些。 我一直对同一件事感到内,,所以不用担心。

但是在学习了4241种新的半语言的最初冲击之后(“ 如何在这里再次转换为机器可读的数字? ”和“ 哇,我不能在这里访问哈希的内部值 ”),我开始怀疑是否所有这些DSL实际上有用。

因此,我拥有这种图灵完整的编程语言,因此可以切换到这种受限语言。 我必须学习。 虽然我有一种已经可以做到的语言。 我所有的开发人员都知道。

JSON的故事

在inventid,我们首先针对测试套件开发API。 结果,我们为用户(以及PDF和电子邮件)生成了大量的JSON数据,例如非常自己的前端。 既然有一个库,我们曾经使用jbuilder为我们生成这个json。

不要被愚弄了,您需要手动编写jbuilder文件,这些文件将挂接到您的控制器中,以根据在方法中定义的实例变量生成输出。 因此,可以说不是真正的免费午餐。

过了一会儿不处理json响应(我为我们的付款网关进行了开发),我突然不得不解决一些小问题。 具有讽刺意味的是,我发现(突然之间)jbuilder语法非常烦人。

  1. 我不得不谷歌很多
  2. 实例变量的分配决定了jbuilder的输入(不是方法的返回值!)
  3. 某种序列化异常慢(考虑了Ruby的性能)

我没有一个真正有趣的一天。

除此之外,我意识到了解DSL的作用很小。 您作为开发人员的工作是(按此顺序):

  1. 解决问题
  2. 使用编程语言
  3. 您可能在哪里使用公共库
  4. 其中可能包含某些领域特定语言。

因此,总而言之,知道DSL不是一项技能,而是您可能偶尔需要的一些东西。

那还有其他选择吗?

让我向您介绍Ruby开发人员,这是Ruby开发人员。 这是一种图灵完整的,对开发人员友好的,非常快速的(#justKidding)编程语言。 它非常有能力处理数据转换。 因此,您应该真正检查Ruby!

听起来有些la ,但最好的工具可能只是您手中的工具 。 如果该工具足够,那么您此时可能不需要更专业的工具(谁没有使用电压测试仪作为螺丝刀?!)。 例如,jbuilder是您不需要的工具!

案例研究,inventid的变压器

inventid经常使用jbuilder。 我们(我)觉得很烦。

  1. 单独的文件。
  2. 无法在请求中向上游发送JSON,因为它仅生成响应。
  3. 奇怪的嵌套DSL(无用的抽象)

因此,我们(I)决定使用简单的Ruby代码运行测试。 我们真的需要它们吗? 还是我们可以简单地使用实际的Ruby和Rails代码创建JSON响应?

实际测试很简单。 以我尝试的慢速端点为例,将其实现从jbuilder切换到Ruby。 怎么样? 使用基本的变压器!

让我向您展示必须修改的代码。 首先,我对控制器做了一些小的更改:

更换控制器

其次,我添加了几行Ruby:

最后,我放弃了一些jbuilder代码。

因此,要进行评估,不需要进行太多的代码更改(请注意,由于这是一个后代模型,因此我不得不添加很多转换器)。 奇怪的是,这几分钟的测试产生了一些惊人的结果:

  1. 与jbuilder相比,在代码质量方面还不错。
  2. 这在我的机器上快得多了。

作为测试的一部分,此代码已交付生产,以检查性能改进是否也在其中体现出来。

我不想告诉你结论。 让我为您显示图形,该图形显示指定端点的视图性能! 我很确定您可以确定何时进行生产部署。

Y轴以秒为单位显示视图性能

这就提出了一个问题:我们是否应该继续使用这种依赖关系? 在办公室内进行的快速检查显示,没有人特别喜欢jbuilder语法。 没有人对它的速度印象深刻。 没有人承认他们认为这使他们能够更快地发展。

因此,在几天之内,我们开始将许多jbuilder代码迁移到纯Ruby。 此外,我们还迁移了可以修改为同一文件的属性。

总而言之,这种迁移成功了! 它使我们的API响应时间减少了70%以上。 绝对值得在一个星期上花费🙂其他人也报告了类似的改进。

虽然提出了一个问题

为什么我们在简单的变压器上选择这些DSL? 这实际上值得慢一点的代码,并学习另一种语言来简单地操纵吗?

老实说,我觉得社区可能会经常选择使用普通语言的DSL。 通常,没有充分的理由。

随着时间的流逝,inventid也遭受了多个图书馆的废弃。 我们使用squeel使我们的AR语法更好。 然后,我们遇到了一个错误(未修复)。 最后图书馆被废弃了。

总而言之,选择任何库(或DSL)都会带来未来的可维护性风险。 这些库可能会出问题,而您将被这些库困住或承担巨大的重构成本。 每个人也必须学习每一个DSL。 甚至可能知道并认识到陷阱。

DSL库对您的项目有用吗?

可能是,但一定要先检查通俗易懂的语言! 没有DSL是可以拯救您的万灵药。 如有疑问,请不要去那里。 坦白,无聊并最终保持稳定。