你看你这里很矛盾呀,一方面说“数据的单向流动简化了逻辑,减少了业务逻辑的复杂度。算法和数据结构等等的核心思想,都是把复杂的问题简单化,而在这点上 fp 是做到了极致的。”,另一方面紧接着又说fp在后端不够流行的原因是人“智商不够”。。。。那,到底fp是把事情搞简单了还是搞复杂啦?难道真的是大部分人智商理解不了简单的东西,只能理解复杂的东西?
而且你反复提到的fp的特征也让我很迷惑。我不是cs科班出身的,可能知识不准确,我所知道的fp,特征包括纯函数、函数组合、模式匹配、递归、尾递归优化代替循环,核心基础是数据的不可变性,或者说把可变性局限到最小的程度。但是除了在react社区,我从来没有听说过“单向数据流动”是fp的特征,更没有听说过“数据的单向流动简化了逻辑,减少了业务逻辑的复杂度。”
不太清楚你反复强调的这个单向数据流动到底是指什么。在前端框架领域,我所理解的单向数据流动,和状态不变性、fp无关,仅仅是指,数据是从组件树的顶端往下通过props层层传递的,下层组件不能直接修改来自上层组件的数据,必须通过向上发送事件的办法,委托上层组件来执行修改。假设,我们没有搞组件化,那么,所有的状态都是在顶层App组件里,就无所谓单向数据流动了。如果你就是指的这个,我不明白这个东西是怎么和fp联系上的。因为这是react vue ng三家都遵循的组件树数据流向原则。
另外,你说 single store 就有 single source of truth,multi store 就不行,我也不明白为啥。状态一致性,难道不是靠数据结构的 normalize 实现的吗?或者做精细的多处非规范化数据的同步?
举个例子。我们用redux,single store,存所有的页面状态。页面上,一左一右两个列表,都是来自一个entity库的item,但是左右两个列表的items可能不同,当然也有可能重复。我们的redux里面要保存这个state,不得有一个 state.listA[],一个state.listB[]嘛,那么,如果这两个list里面有重复的item,redux的 single source of truth是怎么保证重复的item的内部数据也是一致无冲突的呢?不还得手写代码来保证嘛?single store本身不能自动保证任何 single source of truth,保证它的是人。
在前端应该使用fp不变性风格模型的场合也很多。比如我写一个下棋的应用,可以悔棋或者复盘的,这种带history undo redo的业务肯定是把状态建模成不可变类型,然后用一堆纯函数去操作它们。redux适合做这个,mobx和vue就干不来,早期的vuex模仿这个能力也比较拙劣。
如果你非要把redux算进react范畴的话,我能不能说,vuex也是vue范畴的,如果一个vue项目利用vuex做single store,不允许任何组件内的独立state,必须通过vuex的mutation action来操作数据,那么,虽然它是通过可变数据的proxy来实现的,但是形式和结构上,也满足你说的“fp”了呢,毕竟都是单向数据流,都是single source of truth呀
【 在 eGust (十年) 的大作中提到: 】
: 标 题: Re: 对比 vue,reactjs 就是个笑话!
: 发信站: 水木社区 (Sat Jul 3 18:07:45 2021), 站内
:
: redux 本来就是 flux 的特殊情况,同样单向的数据流动,属于 react 生态环境的一部分。不然为啥 jquery 的时候没诞生 redux,最多只搞出了饱受诟病的 ng1?1985年微软就搞出来 excel 了,为啥直到 react 大家才意识到 declarative ui 才是正确的?
:
: 后面的不管 vue 还是 svelte,本质上都在用更符合人直觉的方式来组织数据,或者说,使用 procedural programming 替代 react 的 fp。我还是那句老话,数据的单向流动简化了逻辑,减少了业务逻辑的复杂度。算法和数据结构等等的核心思想,都是把复杂的问题简单化,而在这点上 fp 是做到了极致的。你要看不出来的话我也真没啥办法解释,就跟很多人不觉得 declarative ui 不比传统的 imperative ui 有优势一样,也一样举出前者各种的毛病,后者的问题也一样可以解释成,缺乏良好的架构约束。
:
: 另外,我不了解 ng2+,了解仅限于 rxjs 火了的很大一部分原因是由于它。如果设计相当于是 multiple stores 的话,那我可以肯定是比 single store 更糟糕的。因为又回到了起点,没有 single source of truth 了。在多个 stores 之间发生基于同一个源的数据交换的时候,是很难确定哪个 store 里的数据才是应该更新的。虽然可能更符合人的直觉,但比单源系统复杂多了。
:
: 【 在 beep (菜M.喵星耗子) 的大作中提到: 】
: : 你说的react-redux整体方案的可维护性优势是存在的,但是我觉得你夸大了react的作用。这个优势主要是redux带来的。我们可以看到大量的react项目,业务逻辑也都是写在组件里面的,在组件里搞一大堆数据存取和计算,然后在组件里setState。这种玩法照样不可能带来任何好的
: : vue生态在这方面基本是没什么建树的。ng在这方面的做法我觉得反而更靠谱些,就是引导大家把业务逻辑集中到service里,然后把可测性目标聚焦在service的设计上。不像redux,service不是全局单例的,是每一个组件都可以new的(其实是通过di系统注入的)。这就更合理一些。
: : 我认为试图利用react vue ng这样的框架或者ui库来推行好的架构,本身就不彻底。前端在这方面和后端没啥区别,好的做法依然是靠架构规范来保证,而不是靠库来保证。
: : ...................
:
: --
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 122.57.163.*]
--
FROM 123.120.180.*