调用类函数,比如 A.runAction(B)的时候, A 是作为主语还是宾语去理解比较好?

2022-07-15 18:15:12 +08:00
 washbrain

背景: 最近在看 Rxjs 的入门教程,看到 Observable.subscribe(observer), 第一反应是看到 Observable 去订阅 observer ,但这显然和框架本身表达的意思不一样,应该是 observer 去订阅 Observable 才对。让我来写这样的 api ,我感觉就会写成 Observable.beSubscribedBy(observer )了==

可能是我孤陋寡闻吧,感觉 A.runAction(B)这样的语法,一般都是 A 作为主语;但是 Rxjs 这个场景好像是 A 作为宾语?还有其他类似的例子吗?还是说我本身的理解就是错的

英语相当不行,也不太了解 Rx api 设计背后的规范,还请各位海涵 Orz

1073 次点击
所在节点    程序员
5 条回复
humbass
2022-07-15 18:22:48 +08:00
大部分操作都可以用 ES6 的 PROXY 直接解决。

Rxjs 实际上是早期 写给 JAVA 这类后端程序员在用数据同步框架。
MakHoCheung
2022-07-15 20:38:26 +08:00
响应式框架这里确实比较让人迷惑,按道理是订阅者去订阅发布者的,之前看过一个 stackoverflow 的帖子专门讨论这个,但是忘了内容
charlie21
2022-07-15 21:01:08 +08:00
Observable.subscribe(observer)

这里的 observable 可以是 of() 的返回值,它代表一个(可以被订阅的)内容发送器
subscribe() 调用时刻就是开始时刻
通常的用法是 subscribe(data => { 这里直接处理 data })

至于 lz 说的这个问题,它这里的 observer 是迭代器模式里的 “迭代器 (iterator)”:迭代器具有 next 方法,可以一次一次读到数据,故而有异步的意味

however, 迭代器这个东西在编程语言里往往是蕴含在流程控制里了,在同步编程直接 for 循环就 OK 了 不需要声明一个 iterator 再调用它进入循环;在异步编程里直接 subscribe 就 OK 了 不需要声明一个 iterator 再调用它来激活订阅。具有迭代器意味的东西都被隐藏起来了

迭代器模式和观察者模式 https://hijiangtao.github.io/2020/01/13/RxJS-Introduction-and-Actions/
secondwtq
2022-07-16 00:45:17 +08:00
要按照 SVO 的规则去套的话,很多都说不通的

比如 list.add(element),其实是 "add element to list",list 是双宾语之一,主语是啥?不知道
非要给这个神秘的主语一个名字的话,那就叫“有关部门”好了。觉得不够接地气的话可以用“系统”,这个词简直就是挨踢领域的“有关部门”。

还有什么 mutex.lock(), timer.stop(),都不能细想的

然后再看 Rx 源码里面怎么写的: https://github.com/dotnet/reactive/blob/85f1eb7c53e27cccdbeee3e0b044916168843fcc/Rx.NET/Source/src/System.Reactive/ObservableBase.cs#L21
> Subscribes the given observer to the observable sequence.
AllenHua
2022-07-16 09:13:18 +08:00
Observable.subscribe(observer)

英语里词根后缀 able 代表有什么样的能力,主语 Observable 表达的应该是具有观察能力的一类事物,有多种实现(所以没有写成 observer ),是主语。

subscribe 很明显是动词

observer 也很明显是宾语,是名词。

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

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

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

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

© 2021 V2EX