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这么踏实。

DSL 和 reactive 噩梦的更多相关文章

  1. 从语言到库到框架,再到API,再到标记最后到DSL语言

    计算机技术发展很快,而且越来越快,结果也是越来越复杂,那么我们到底怎么搞定复杂性并重用代码? 很明显,这是个大难题.一开始我们要解决计算问题,发展了基本的编程语言. 很快,编程语言不能满足需求,我们需 ...

  2. Ubuntu手动设置DSL连接

    在安装完Ubuntu之后,发现图形界面的DSL连接不管用了,郁闷了好几天,想想移动每个月120个小时的流量岂不是白白浪费了.正当我想重返Windows系统的时候,却发现了手动设置连接DSL的好方法,感 ...

  3. web前端的春天 or 噩梦

    「 微信应用号可以做什么」 简单说,微信"小程序"可以为开发者提供基于微信的表单.导航.地图.媒体和位置等开发组件,让他们在微信的网页里构建一个 HTML 5 应用.同时微信还开放 ...

  4. 升级Ubuntu 16.04 LTS后 DSL拨号上网(ppp)连接自动断开解决办法

    原本在Ubuntu 15.10用拨号上网没有问题,但升级了16.04 LTS后发现原来的DSL连接不上了.主要表现为: 1.在NetworkManager里面选择DSL Connection能够尝试拨 ...

  5. Reactive Extensions(Rx) 学习

    Bruce Eckel(著有多部编程书籍)和Jonas Boner(Akka的缔造者和Typesafe的CTO)发表了“反应性宣言”,在其中尝试着定义什么是反应性应用. 这样的应用应该能够: 对事件做 ...

  6. Reactive Extensions介绍

    Reactive Extensions(Rx)是对LINQ的一种扩展,他的目标是对异步的集合进行操作,也就是说,集合中的元素是异步填充的,比如说从Web或者云端获取数据然后对集合进行填充.Rx起源于M ...

  7. .Net中的反应式编程(Reactive Programming)

    系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LI ...

  8. 完全使用一组 DSL 来操作 Grid 控件

    最近尝试了一下将 XtraGrid 的初始化工作封装成内部 DSL,例如一个普通的基础数据的增删改查操作的代码会像下面这样: public partial class UserForm : XtraF ...

  9. 如何设计一门语言(十)——正则表达式与领域特定语言(DSL)

    几个月前就一直有博友关心DSL的问题,于是我想一想,我在gac.codeplex.com里面也创建了一些DSL,于是今天就来说一说这个事情. 创建DSL恐怕是很多人第一次设计一门语言的经历,很少有人一 ...

  10. jQuery的Internal DSL

    JQuery的核心理念是write less,do more(写的更少,做的更多),那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指 ...

随机推荐

  1. USB2.0设备的休眠挂起及远程唤醒

    USB可见设备状态,分为连接(Attached),上电(Powered),默认(Default),地址(Address),配置(Configured)和挂起(Suspended)6个状态.所谓可见,即 ...

  2. Ewald求和在分子静电势能计算中的应用

    技术背景 分子动力学模拟中,计算周期性边界条件的静电势常被视作计算的瓶颈之一.形式上是比较容易的,例如不考虑周期性边界条件的话,静电势能就是: \[E=\frac{1}{4\pi\epsilon_0} ...

  3. 复用对评论和对文章回复的弹层 popup- vant2

    基本样式: ps:当message 即输入的内容的长度为 0 的时候,按钮禁止使用 : <template> <div class="comment-post"& ...

  4. 基于pandas的数据清洗

    数据清洗是数据科学和数据分析中非常重要的一个步骤.它指的是在数据分析之前,对数据进行预处理,以确保数据的质量和一致性.使用Python的pandas库进行数据清洗是一种常见的做法,因为pandas提供 ...

  5. redis哨兵模式下主从切换后,php实现自动切换

    redis的哨兵模式,在主服务器挂掉后,会通过选举将对应的从服务器切换为主服务器,以此来达到服务的高可用性. 在业务层面如果主从做了切换可能相对应的服务器IP地址会发生改变,这样会带来程序的的正常运行 ...

  6. Codeforces 1847 A-F

    题面 A B C D E F 难度:红 橙 黄 蓝 紫 紫 题解 B 题目大意:找到一组分割方法,使得 \(\sum _{i=1} ^ k (\text{&} _{j=l_i} ^ {r_i} ...

  7. 开源 - Ideal库 - 常用枚举扩展方法(一)

    今天和大家享一些关于枚举操作相关的常用扩展方法. 我们平时用的比较多的是正常枚举,同时还有加[Flags]特性的位标志枚举,因此以下所有扩展方法同时适用正常枚举以及位标志枚举. 我们首先定义两种枚举用 ...

  8. pyenv: no such command `virtualenv'

    当执行 pyenv virtualenv 3.6.10 env_3.6.10 命令创建新的python环境时提示 pyenv: no such command `virtualenv' larryma ...

  9. Air780E之TCP应用,你了解吗?

    ​ 一.TCP简介 TCP(TransmissionControlProtocol,传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.它主要用于在不可靠的网络环境中提供稳定的数据传输 ...

  10. 一些前端javaScript时间处理函数

    史上最全时间处理函数(逐行注释) 获取任意周的周一.周末 获取任意月的前后n月的最后一天和第一天 详细函数如下 获取当前周的周一和周末 || 获取当前周的前后n周的周一和周末 函数注释: 入参: da ...