人心中的成见是一座大山,数据转换思想

211 天前
 muchan92

https://github.com/rainforesters/imsure 一直在用,确实好用,已经离不开了

https://github.com/rainforesters/imsure-demo

上周发了一个主题后评论区颇为热闹,就用此文统一回复下吧。我不想争论是非,只是我觉得这个理论就像日心说一样值得被更多人知道,应该被更多人知道,哪怕它和日心说一样被证明是错的,也算挣脱了思维桎梏,启迪了方向。若值得在茶饭之余引发讨论就更好了。


程序的本质是数据转换,那么逻辑过程的意义可以一概视为根据 input 转换为 output ,所以我们可以试着改变一下程序的编写方式,

从:

f(input) ⇒ output

进化为:

output ⇐ Watch_transform(input)
Rule = Watch_transform
output ⇐ Rule(input)

为了让观察转换变得可行,我们把 input output 作为字段都定义在抽象的 Struct 类型上,

那么就得到了:

self.output ⇐ Rule(Struct.input)
self 是 Struct 的实例
Rule 就可以在 self 未实例化之前,提前定义在抽象的 Struct 类型上;同时也允许 input output 在 Struct 的不同层级

这就变为了纯粹的数据转换链。只要依赖的 input 更新 output 也会随之更新,整条链也随之更新到最终稳定状态,既简单又保证了确定性。在转换链中,每个节点只干一件事,只需观察依赖的前置数据而不必考虑后续自己会驱动谁或被谁所依赖,彻底摆脱逻辑控制流。

这种写法就像从算术方法到方程解法一样具有普适性。
从传统编程需要根据不同业务需求设计不同的实现过程,到全然不用设计,只套用一条普适的方法就行:

  1. 定义数据结构。(设未知数)
  2. 定义转换规则。(列方程式)
  3. 为字段赋值。(代入已知数)

至此,就再也不需要推导业务逻辑了。


若你看懂了以上内容,那这段自不必说,若没看懂请继续。

传统逻辑过程可以细分为两部分:

  1. 先把将要进行转换的 input output 建立关联。
  2. 然后进行转换,纯粹的转换算法。

传统写法下 80% - 90% 的代码都在建立关联、维护关联,其实转换算法的代码很少很少。
新写法中建立关联就像呼吸一样简单。

8432 次点击
所在节点    程序员
56 条回复
lesismal
210 天前
似乎只是 dto 这一层罢了,业务的复杂性是躲不掉的。

要想看着整洁,只能多用几个垃圾袋包起来,然后这几个垃圾袋摆放整齐。但是,垃圾袋内仍然是垃圾。

等到 AI 足够强,都 AI 生成机器码,就无所谓人类可读性了,审美和整洁和艺术等等也都不再重要了
lesismal
210 天前
代码没看,看到其他人提到 setTimeout ,即使用 promise 也比 setTimeout 好吧?但是不管哪个,比直接调用都是同步逻辑变异步了。
ZiChun
210 天前
@muchan92 “不必强用这种写法来实现”,“更适合解决实际中的业务内容”,这已经说明了这种思路的局限性。你要知道,程序员写代码不是为了自己的精神愉悦(更何况这个设计也没办法让大家精神愉悦,当然或许有人觉得这么设计很“高级”吧),要兼顾开发速度、代码质量、维护难度。按照这个仓库里的这种写法,新招进来的员工都骂,出个问题排查半天,性能远不如普通的设计,我没有清楚你推崇这种设计思路的点在哪儿,本身“实际中的业务内容”就不是一个需要解决的痛点,有数不清的方式做。
ZiChun
210 天前
@muchan92 一个没啥用的华而不实的框架就算了,不少程序员都有这个阶段,本身也算是提升自己编程技术的一个路径,但是一个没啥用的华而不实的框架先吹成“挣脱了思维桎梏,启迪了方向”,再来个订阅制收费,也别说什么人心中的成见是一座大山,单纯是确实配不上。
ZiChun
210 天前
@muchan92 最后我也不知道你到底是想要卖课还是真的觉得这个框架好,如果是前者那我觉得你来错地方了,显然大家看了之后都觉得问题很多,如果是后者,我建议你可以先问是不是,再问为什么。就这个你发的这个仓库而言,问问 AI 也许都能告诉你为什么这个设计思路没有你说的那么高大上。
ninjashixuan
210 天前
自比哥白尼发在 v 站有点屈才了,应该发在更权威的地方,挑战一下你认为的当代的托密勒体系。
hailaz
210 天前
那么自信,写的东西却前后矛盾,把你的数据转换链换成函数,只管输入输出,还不是一样说得通。
我也可以说程序的本质是 CRUD ,对吧
另外难道转换规则不算逻辑吗?
wudiiiii
210 天前
你说的是不是数据流编程 / 响应式编程?这些维基百科都有词典的
EscYezi
210 天前
简单看了一下,感觉基本上就是 vue 的 computed 和 watch ,但是挂在类型上面而不是变量上。
FarAhead
210 天前
我看不懂,但我大受震撼
JoeDH
210 天前
我是真看不懂你说的东西跟写的代码,太魔了
Chemist
210 天前
哥们儿,你哪个学校毕业的?
GoNewEra
210 天前
什么东西 看不懂啊 老哥 出书
zisen
210 天前
如果你这个语言在某种领域有特殊用途那么还是有存在价值的,例如 julia 对于物理学家。但你这只是讲述概念,没有实操例如性能或者理解方式上与传统语言的对比
w568w
210 天前
打了一大段字又被 V2EX 吞了。很烦,只说重点。

你这就是响应式函数式编程,Makefile 都能干类似的活。规则挂在类型上毫无意义,大部分逻辑不可复用,纯粹增加心智负担。

为什么觉得大家都没想过?有没有可能实际的复杂业务代码在响应式系统编程时就是这么做的,甚至比你想得更深?

附反应式宣言,这是 10 年前的文章 https://www.reactivemanifesto.org/zh-CN
lunafreya
210 天前
笑了,老哥可能没了解过 fp

算了,老哥写个排序算法如何
XCFOX
210 天前
楼主已经领悟到了响应式的真谛。
但倘若我拿出纯 TypeScript 响应式代码而且可以在 Vue3 、React + Valtio 、NestJS 、MikroORM 等几乎所有框架中无缝运行,阁下又该如何应对呢?

https://www.typescriptlang.org/play/?#code/MYGwhgzhAEAiD2BbAlgO3tA3gKGtY8qEALgE4Cuwx8pAFAA7kBGIyw0T8YpAJgIwAuaCVJoA5gEosAX2y5oYgKbEOXXgCZaUnHjyll5UqmgADACSZiAC2QQAdJ279p0dSfmz5SlY94BmLSx5PQMjUwtrWwc1HnUXP3c8WU8CIhUeJDQMAF5oVEUAdzhM9FoAckYIKzKJOVSIeBBFOxB4MXLffiEygBpoDJR0aKc+WvrG5tb2ss71br6BrOGNMcIGppa2jpi-ef6S+GWePwkgA
SNOOPY963
210 天前
本质是数据转换也行,问题是,你倒是说说你怎么样个数据模型把多大的世界包含进去啊?
你说不出个所以然,那我也可以说,有些人发帖的本质是 shit
ldlywt
210 天前
感觉可以去搞邪教了,云里雾里的
scyuns
210 天前
@XCFOX 这个没有看懂啥意思 这不是就是一个普通的类吗

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

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

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

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

© 2021 V2EX