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. `std::packaged_task`、`std::thread` 和 `std::async` 的区别与联系

    std::packaged_task.std::thread 和 std::async 的区别与联系 std::packaged_task.std::thread 和 std::async 都是 C+ ...

  2. 批量解压zip文件到指定位置

    话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...

  3. Windows刷机-记录UltraSO工具安装错误

    安装镜像刻录U盘工具UltralSO:UltraISO - ISO CD/DVD image creator, editor, burner, converter and virtual CD/DVD ...

  4. 使用 GitLab 账号登陆 KubeSphere

    作者:李帅 介绍 KubeSphere 多租户是实际生产使用中非常需要的一个功能,该功能满足不同用户登陆 KubeSphere 平台的需求.比如开发,运维,测试都需要登陆 KubeSphere 平台, ...

  5. Readme 《Machine Learning by Andrew NG》

    本文系列内容是吴恩达老师的机器学习公开课的文本对应.需要具备英文,微积分,线性代数,程序设计的基础.从第二周开始有编程作业,到第九周.总共8个作业.感谢吴恩达老师⸜₍๑•⌔•๑ ₎⸝ 2021年9月1 ...

  6. 【题解笔记】PTA基础6-7:统计某类完全平方

    题目地址:https://pintia.cn/problem-sets/14/problems/739 前言 咱目前还只能说是个小白,写题解是为了后面自己能够回顾.如果有哪些写错的/能优化的地方,也请 ...

  7. 体验国产系统Deepin:很爽

    最近开始把之前一直吃亏的旧电脑拿出来再利用了,先还是选择了熟悉的ubuntu系列.安装了Ubuntu 22.04之后,风风火火地把需要的开发环境搭建起来,虽然桌面有些卡顿,但瑕不掩瑜玉.趁着热情又想着 ...

  8. 程序员如何借势AI提高自己:从高效工作到技能升级的全面指南

    又是一年1024,时光荏苒,转眼又到了这个特别的日子.坦白说,这篇文章我其实并不太想写,因为我并没有通过AI找到普适于程序员群体的高效赚钱秘籍.然而,反思过去的工作,我发现利用AI的确让我在工作中变得 ...

  9. Ubuntu 无法播放MP4

    今天用ubuntu打开mp4发现无法播放,然后我以为文件损坏了,就传到手机上面,发现还是可以播放的,然后就查了一下相关资料,发现有人让我安装这个 sudo snap install ffmpeg 安装 ...

  10. 设计一个基于 LSTM 神经网络的文本分类器

    前一篇:<用于自然语言处理的循环神经网络RNN> 序言:本节主要讲解如何使用循环神经网络(RNN)创建一个文本分类器.RNN 是一类适合处理序列数据的神经网络的统称,而我们将在本节中使用 ...