由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 转 Redux写起来很麻烦... 去你大爷的纯函数
相关主题
有人用react + redux么有没有喜欢haskell的同学
最近工作和业余编程的一点感想>>有名字吗
看了一下Meteor很不错Clojure上手123
go几天的一些感受ZK框架用处大吗?
Web技术的发展趋势关于mapreduce一问
javascript: 有没有办法同时发多个http request?大家有没有觉得Scala不如Haskell美?
请问大牛,ajax这个东东过时了吗?interviewstreet 明天有个quora专场 感兴趣的童鞋们可以参加试试
我老给你们指条明路吧再说说react & angular 2
相关话题的讨论汇总
话题: redux话题: 函数话题: reducer话题: 异步话题: 麻烦
进入Programming版参与讨论
1 (共1页)
d*******r
发帖数: 3299
1
作者:Jim Liu
链接:https://www.zhihu.com/question/63726609/answer/212357616
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' =
f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库
,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供
了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。
而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是
S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的
DEMO里,它就+1了,但放到生产需求里,很可能是要先发起一个Ajax请求,请求OK了再
+1,甚至这时候不是+1,而是直接和服务端同步一个新的值。
但异步的reducer就破坏了它的“纯度”,因为异步是不确定的,先发不一定先至,这
会破坏reducer的“可回放性”,它引以为豪的replay就不成立了,它的基石就崩塌了。
这就注定了它解决不了异步的问题,然后它为了让自己显得很白玉无瑕,死活也不愿意
碰异步那摊子脏东西,什么?你要在reducer里发起一个Ajax请求?对不起这不是我们
的best practice,我们对此嗤之以鼻,你如果真要这么做,那就……做去吧。
于是Redux在解决异步问题上的“残疾”就注定给它擦屁股的库会如雨后春笋一样的涌
现出来,比如其他回答里提到的dva,再比如redux-saga,它们都是勇士,做了redux所
不愿意做的那摊子脏活。
这个过程又引入了新的麻烦,一方面是异步本身带来的复杂度,比如redux-saga里的
every和latest;另一方面是代码写起来的麻烦,比如redux-saga里各种yield,还有可
以堆成山的胶水代码。
所以你觉得redux写起来很麻烦,麻烦就对了,这不是幻觉,因为它为了保证自己的简
洁,把麻烦的事情抛给了你。结论很简单,要么就引入更多“生态”,让别人帮你解决
麻烦,让它们对你输出价值观。要么就别走redux的函数式路线,去你大爷的纯函数,
用别的价值观,我用全局变量全局事件,用watch,用observable,用whatever,反正
不用你。
s***o
发帖数: 2191
2
正是因为繁琐麻烦,所以入了坑的勇士们都会乐意拉别人也下来享受,不然好不容易掌
握的很快就成垃圾了 LOL

=

【在 d*******r 的大作中提到】
: 作者:Jim Liu
: 链接:https://www.zhihu.com/question/63726609/answer/212357616
: 来源:知乎
: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
: Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' =
: f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库
: ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供
: 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。
: 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是
: S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的

d******c
发帖数: 2407
3
纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。
不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。
Haskell就是太追求纯,我看clojure没这个问题。
redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。
c******n
发帖数: 16666
4
上午在知乎还看到一个用react-native搞出大坑的帖子
m****o
发帖数: 182
5
Haskell吧side effect都封装到IO Monad里面去了。我看上Scala最好,想fp也可以,
想oo也行。

【在 d******c 的大作中提到】
: 纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。
: 不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。
: Haskell就是太追求纯,我看clojure没这个问题。
: redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。

a*****e
发帖数: 1700
6
问题不在纯函数,而在于副作用有很多种类(包括无副作用的特例,也即纯函数)。
这都源于类型系统太弱鸡:
1. 异步请求也可以是纯函数,但是类型系统不够强大,无法表达这种条件
或者:
2. Reduction 也可以允许副作用,只要副作用不影响 determinism 就好了。如果类型
系统不够强大,也无法表达这种条件
Untyped 语言(如 Clojure)其实是在说:“随便你怎么写,如果不满足条件的代码被
默认做了非法的优化造成的后果你自己看着办,谁让你这么写来着[摊手]”
归根结底,type is the study of an intrinsic property of
code (without executing it). 不会因为写程序的人的观点而改变
Haskell 的目的不是追求纯函数,而是研究如何用类型系统来学习和安排副作用,从而
写出正确的代码。

【在 d******c 的大作中提到】
: 纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。
: 不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。
: Haskell就是太追求纯,我看clojure没这个问题。
: redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。

s***o
发帖数: 2191
7
那个我也看了,主要是遇人不淑,选什么技术都是一个死字。
你们的mobile是用什么在做?

【在 c******n 的大作中提到】
: 上午在知乎还看到一个用react-native搞出大坑的帖子
c******n
发帖数: 16666
8
有钱有时间上原生
没时间还是web,css改改凑活下 最多也就是redirect到稍微对mobile优化了点的web
少传点东西什么的
hybrid有个几个小的试水的 大的还是没上 就是怕这种时间精力扔进去了效果还不行
你们呢

【在 s***o 的大作中提到】
: 那个我也看了,主要是遇人不淑,选什么技术都是一个死字。
: 你们的mobile是用什么在做?

s***o
发帖数: 2191
9
也是web+css顶

【在 c******n 的大作中提到】
: 有钱有时间上原生
: 没时间还是web,css改改凑活下 最多也就是redirect到稍微对mobile优化了点的web
: 少传点东西什么的
: hybrid有个几个小的试水的 大的还是没上 就是怕这种时间精力扔进去了效果还不行
: 你们呢

c*********e
发帖数: 16335
10
写ajax是在actions里,你怎么在reducer里写這個?

=

【在 d*******r 的大作中提到】
: 作者:Jim Liu
: 链接:https://www.zhihu.com/question/63726609/answer/212357616
: 来源:知乎
: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
: Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' =
: f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库
: ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供
: 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。
: 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是
: S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的

相关主题
javascript: 有没有办法同时发多个http request?有没有喜欢haskell的同学
请问大牛,ajax这个东东过时了吗?>>有名字吗
我老给你们指条明路吧Clojure上手123
进入Programming版参与讨论
c*********e
发帖数: 16335
11
這個jim liu对javascript一无所知,可能是后台转前台的,用的后台的思维来做前台。

=

【在 d*******r 的大作中提到】
: 作者:Jim Liu
: 链接:https://www.zhihu.com/question/63726609/answer/212357616
: 来源:知乎
: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
: Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' =
: f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库
: ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供
: 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。
: 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是
: S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的

l**********n
发帖数: 8443
12
完全同意
d*******r
发帖数: 3299
13
JS还是不适合做纯FP吧

【在 a*****e 的大作中提到】
: 问题不在纯函数,而在于副作用有很多种类(包括无副作用的特例,也即纯函数)。
: 这都源于类型系统太弱鸡:
: 1. 异步请求也可以是纯函数,但是类型系统不够强大,无法表达这种条件
: 或者:
: 2. Reduction 也可以允许副作用,只要副作用不影响 determinism 就好了。如果类型
: 系统不够强大,也无法表达这种条件
: Untyped 语言(如 Clojure)其实是在说:“随便你怎么写,如果不满足条件的代码被
: 默认做了非法的优化造成的后果你自己看着办,谁让你这么写来着[摊手]”
: 归根结底,type is the study of an intrinsic property of
: code (without executing it). 不会因为写程序的人的观点而改变

l**********n
发帖数: 8443
14
redux不算啥,整个react生态圈很分割。不像angular那么统一。
G**U
发帖数: 180
15
用了一段时间的redux,现在转vue了。
lz可以看看vue
c*********e
发帖数: 16335
16
还是gmail简单,angularjs, react都不用。

【在 l**********n 的大作中提到】
: redux不算啥,整个react生态圈很分割。不像angular那么统一。
c******n
发帖数: 16666
17
gmail还是gwt写的吗

【在 c*********e 的大作中提到】
: 还是gmail简单,angularjs, react都不用。
c*********e
发帖数: 16335
18
gmail的web server都是google自己写的,更何况其它的。反正google里牛人有的事,
写这些东西易如反掌。

【在 c******n 的大作中提到】
: gmail还是gwt写的吗
m****x
发帖数: 9
19
其实redux的好处还是比较复杂的单app多component频繁切换的场景,mvc里面数据模型
独立性比较好。如果是简单app或是复杂多app切换场景,redux route绑定起来就复杂
了。。。
1 (共1页)
进入Programming版参与讨论
相关主题
再说说react & angular 2Web技术的发展趋势
react+redux这段评论的蛮好javascript: 有没有办法同时发多个http request?
做个类似于redfin那样的网站怎么入手?请问大牛,ajax这个东东过时了吗?
stack overflow 算大型 web app 么?我老给你们指条明路吧
有人用react + redux么有没有喜欢haskell的同学
最近工作和业余编程的一点感想>>有名字吗
看了一下Meteor很不错Clojure上手123
go几天的一些感受ZK框架用处大吗?
相关话题的讨论汇总
话题: redux话题: 函数话题: reducer话题: 异步话题: 麻烦