首页 > 技术文章 > DSL 和 reactive 噩梦

inshua 2022-03-30 18:53 原文

Kotlin 之美—DSL篇 - 掘金

像 Compose 那样写代码 :Kotlin DSL 原理与实战_fundroid_方卓的博客-CSDN博客

先找好一个靶子:

val yesterday = 1.days.ago

请问,谁记得这个写法?除了这个发明人谁会记得应该这么敲?为什么不是 1.days.before,为什么不是 now.24.hour.ago?它能处理 1/4 的前一天是 31/3 吗,你不知道!

所谓的 reactive 已经把用户折腾疯了,一套 reactive 的框架通常除了作者没有人知道怎么构造一个对象,每次使用只能复制粘贴。现在这种 DSL 更是大大加剧了问题。你根本不知道如何“正确的”按他们的行话来写代码。

现在 IDE 的提示云山雾绕,一层层的 Function,你不翻 sample 根本看不懂这些 Function 是干嘛的。从前我们笑话 Java 起名难,到处是 Builder Factory Creator,但这和 reactive DSL 相比简直太友好了。

在传统的模式里只要笨笨的按一个统一的模式追索,你就能解决,查找 Reference 也花不了几次,而现在这些“高阶”函数,你每个参数都是函数啊,你得查多久才能找到你想要的?

程序世界里总是一波一波的SB风潮,XML、微服务、中台等等等等,这波SB风潮不知何时才能退去。

kotlin 和 groovy 靠这个做到了像下面这样的表达:

html {
  head { 
    title "test"
  }
}

然而它不是在构造 DOM 对象, head 是什么, head 并不是 function head(){return new DOMElement("head")},也不是 class Head extends DOMElment{}, head 是 head(Function xxx), head 尾随的 {title "test} 是一个闭包。

这种所谓 DSL 只能算是字面实现,就像 LISP 把 () 玩出花,代码难以阅读,问题难以追溯,有损工程性。

这波逆流后相信大家能回归到醇正的 OO 风格了,到时会恍然大悟,原来平白朴实的OO这么踏实。

推荐阅读