1
twotiger 2021-03-10 11:50:18 +08:00
是的就是解耦。
我个人也很少用到这个,不过之前的公司用来删除数据时,做一些操作。 这种东西也就是一种设计模式,用好了,写的很好看,用的不好,还不如不写。 |
2
xiaolinjia 2021-03-10 11:52:19 +08:00
确实就是解耦,而之所以不写个普通函数,大概是因为传参很麻烦。
|
3
GTim 2021-03-10 11:54:50 +08:00
普通函数会涉及到声明的地方和调用的地方,这两者可能会高度耦合的。这边 import 一下 那边 import 一下。
信号就不一样了,信号不用管谁接收,发出去即可。接收的地方也不用管谁发的,收到消息处理即可 |
4
IurNusRay OP @GTim 可是似乎用能信号来实现的功能,用普通函数来实现也可以啊,信号好像没没什么优势。比如我在收到客户端的点赞、评论、回复等请求的时候,要向指定用户发送消息提醒,那么我完全可以写一个公共函数,接收用户 id 、消息内容,然后发送消息,这个函数也可以在全局所有地方导入、调用,并没有什么缺点啊。。
|
5
GeruzoniAnsasu 2021-03-10 12:57:41 +08:00 2
想象一下 UI 编程。
把 click 看成一个 signal,http 模块把现在文本框的内容 post 出去作为 slot 显然在 button 的 onclick handler 里完全没必要实例化一个 http requester,从某个全局区获取一个 requester 再进行请求则更显怪异。优雅的做法当然是让 click 只作为一个信号灯,我们找一个第三者视角,看到灯亮的时候指使 http 模块发出请求。在第三者的上帝视角里能看到 button 的实例与 http 模块的实例,而 button 和 http 相互并不需要知道对方的实例存在。 这是 qt 框架最基本的事件响应机制。基本上有 signal 这个概念的框架设计理念都是类似的。 |
6
IurNusRay OP @GeruzoniAnsasu 好像有点明白了,谢谢
|
7
est 2021-03-10 13:16:37 +08:00
> 如果这样干嘛不直接写个普通函数呢..
因为你手上的业务不够多。。 等你一个函数内部同时服务 3 、5 个需求方的时候,就知道麻烦了。 |
8
coolair 2021-03-10 13:30:07 +08:00
这个是我很喜欢 Django 的一点……太好用了,太方便了。
|
9
2owe 2021-03-10 15:04:57 +08:00
Signal,就是一种“注册-发布-订阅”的功能实现。
Django 框架对外提供了一些信号,比如 post_save Ps. 想要异步的话,可以自己加 celery 改造 |
10
23333333333 2021-03-10 16:07:55 +08:00
其实最大的作用就是解耦
举个例:子 更新 cache * 有个函数去接 post_save 的信号,接到这个信号之后去删除对应的 cache,而不是每次手动去操作 |
11
hj24 2021-03-10 16:14:59 +08:00
确实只能解耦,你把代码写到一个函数里也是一样的,之前用 go 重构这种代码的时候基本都是写回到一个函数里
|
12
acmore 2021-03-10 16:25:00 +08:00
类似于(或者就是) Mediator pattern
小项目用这个没有啥显著收益,直接普通函数完全没问题。 大项目的好处楼上已经说得很全面了。 但它会造成调用方和服务提供方在语法上的隔离,不是完美也不是唯一的方案。 |
13
zachlhb 2021-03-10 18:14:24 +08:00 via iPhone
逻辑解耦,比如完成一个操作后需要执行其他操作,而这些操作可能现在不确定或不是由你开发的,这时就需要用到信号,一个信号可以有多个接收者,这个很好管理,如果需要异步,可以在信号接收逻辑里派发异步任务
|
14
zepc007 2021-03-31 17:49:07 +08:00
实际用处并不大,又不是异步,只不过是对数据处理提供一种 hook 方式
|