随着 pattern matching 接连增强了好几个版本,现在连 Java 官方都在推 Data Oriented Programming 和 ADT 建模了。。函数式编程真是领先业界 50 年

2022-07-14 22:19:19 +08:00
 TWorldIsNButThis
Algebraic data types were introduced in Hope, a small functional programming language developed in the 1970s at the University of Edinburgh

另外提一嘴,现在 java 的官方示例里都是能 var 都 var 的
<amp-youtube data-videoid="5qYJYGvVLg8" layout="responsive" width="480" height="270"></amp-youtube>
最后的示例直接不装了,大大方方得承认 pattern matching is clearly more concise than vistors, but it's also more flexible and powerful.

不知多少年后国内的八股文会开始问 DOP ?

还有一篇 Java 语言的 project lead Brian Goetz 的文章
https://www.infoq.com/articles/data-oriented-programming-java/
3053 次点击
所在节点    Java
22 条回复
hingbong
2022-07-14 22:45:11 +08:00
学 rust 的时候,最想要的就是这个,kotlin 想了很多办法也没能实现类似的东西,这个真好啊
TWorldIsNButThis
2022-07-14 22:50:05 +08:00
@hingbong kotlin 主要是 when 比较残废,没有解构声明的功能,sealed class 倒是很早就有了
Cbdy
2022-07-14 23:00:14 +08:00
很合理
luob
2022-07-15 04:23:24 +08:00
不是所有程序员都跟前端一样天天盯着标准看今年更新了什么语法,尤其是 javaer

不过 javaer 也不用灰心,今年或明年可能会有某个重量级选手把 ADT 炒到 能让你不懂技术的老板都来过问一下你们的业务语言支不支持完整的 ADT 和 pattern match 的地步,开个玩笑(
chendy
2022-07-15 07:52:19 +08:00
说到 var ,多年前曾经在项目里大规模使用过 lombok 的 val
结果就是吧,看自己的代码还好,看别人写的就经常要点一下方法声明看看返回类型是啥,就有一种“使用方不需要关心类型但是又得知道啥类型”的感觉。优不优雅不好说,确实多了点麻烦
kilasuelika
2022-07-15 08:24:33 +08:00
DOP 跟函数式编程没有必然的联系。

我以前在 Mathematica 上用过函数式编程。感觉就是写起来爽,但性能不太行,占用的内存也高,这个也很容易理解,函数式编程推崇不可变数据,必然要用额外的空间存储。debug 也有点难,有时候 map 一下,出错了也不知道是在哪个输入上出错。

被折磨了一段时间后就不用了。
me221
2022-07-15 08:58:22 +08:00
@chendy 说实话 非常讨厌 var.
Mithril
2022-07-15 09:06:54 +08:00
建议看看这个帖子 https://v2ex.com/t/865425 里面的 Javaer 都是怎么说的。。。
随便你怎么吹出花来,坚持 Version 8 一百年不动摇。
TWorldIsNButThis
2022-07-15 09:42:03 +08:00
@kilasuelika Mathematica 不是静态类型的语言
@chendy ide 的 inlay hint 不开吗
@Mithril 这个升不升,其实国内这些程序员的话语分量是最少的,springboot3 出来以后 2 不会维护很长时间
chendy
2022-07-15 10:44:09 +08:00
@TWorldIsNButThis 开 hint 还不如直接吧类型写上……
clcy1243
2022-07-15 11:35:23 +08:00
这就是我为什么不愿意做 java ,从 19 年应公司要求转组之后开始接触 java ,发现越是老 java ,越不愿意走出自己的舒适圈,语言、框架、组件的新版本新特性都不去看不去学,也不去看新出的组件和框架,一直抱着自己老旧的工具类自以为高效通用还洋洋得意,却不知道自己即将被时代抛弃。

我从最开始接触 java ,就找怎么减少繁杂且无用的工作,开始用 lombok 的注解和 var val ,开始用 localdatetime ,开始用 stream ,为了迁就公司的 mybatis 技术栈开始是自己写 generator 配置,然后自己做插件,再之后学习 mybatis-dynamic-sql 组件,反观老 java ,19 年和现在毫无变化,每次提新的东西就是学习成本以及老项目,从来不说能提升多少效率。

我唯一能想到的他们不愿意学的原因就是学习耽误摸鱼,而且用新东西不能复制老代码,出了错自己没见过不知道怎么查,对这种人就很厌烦,不愿意学习做什么技术,所有的技术工种都是要持续学习持续进步的,因为技术在不断发展,你不进步就只能停留在这个时代,运气好转了管理可能还能继续工作,运气不好被裁了就再也进不去技术岗位。
aguesuka
2022-07-15 11:36:41 +08:00
undecidable 的 adt 没有灵魂.

@kilasuelika 下一个 10 年, 函数式编程中的性能问题"有望"通过 Cost-Aware Type Theory 这样的东西(但不是 CATT 本身)解决.
@TWorldIsNButThis kotlin 的 sealed class 之前也是个残废, 因为 jdk 的原因只支持抽象类不支持接口, 而且好像 jetbrains 不把它挡回事.
TWorldIsNButThis
2022-07-15 14:53:37 +08:00
@aguesuka 当时 java 引入了 sealed 以后 kotlin 好像跟着就出 sealed interface 了
kotlin 的饼画的太大,感觉人手不是很够用的样子
cs419
2022-07-15 15:40:29 +08:00
类型匹配 解构 scala 中就有
先是 scala 语法比较激进 上手难度大
后来出了 kotlin 语法糖相较 java 与 scala 算是个折中
partystart
2022-07-15 17:43:34 +08:00
我是真的不理解使用 var 的意义是什么?

从看代码的角度 ,基本上都是从左到右扫描

用 var 的话 我还需要看到右边的代码.

尤其是看到

for (var item: list) {
out.prinltn("name:" + item)
}

看到这种就操蛋了, 我还需要去查看 lis 里面 item 是什么类型


脱裤子放屁?
jameslan
2022-07-16 05:28:20 +08:00
@partystart 您这 list 的命名也是没谁了
huihuimoe
2022-07-18 04:54:00 +08:00
@partystart 我也真的不理解为什么不使用 var 。

首先正常人不会写出这样的代码,写出这样代码的 CR 直接就被批了好吗?
正常的代码应该变量名是能体现其作用的。

再者

// for (Person person: personList) {
for (var person: personList) {
log.info("person: {}", person);
}

您看这样的代码,按您的说法,写 Person person ,从左到右扫描,读了两次 person ,表明 person 是个 person ,那不就是脱裤子放屁吗?
partystart
2022-07-18 10:01:20 +08:00
@huihuimoe

1. for (Person person: personList) 循环 list ,看左边的类型不就可以知道 list 里面的类型了 。从左到右为啥要读两次?
2. for (var person: personList) 如果你需要了解 list 里面的元素是什么类型 你怎么办 ?操纵光标放 list 上? command + click 点击?
3. 字段名只代表它叫什么,不代表它的类型是什么 ?看到 personList 这个名字就代表 Person ?
aguesuka
2022-07-20 15:33:07 +08:00
@partystart eclipse 没有 type hints 吗? 为什么用 var 的原因很简单, 因为显式的类型声明在语法树上是有副作用的:
```
Object wrap = new Object(){

}
```
aguesuka
2022-07-20 15:37:09 +08:00
上段没打完发了,
```
Object wrap = new Object(){
int value = 0
}
```
如果是 var 的话那么可以 wrap.value. 当然很多时候我们不需要这个特性, 这里只是展示一下这个副作用, 这种副作用应该是要尽量避免的.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866252

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX