全局变量 vs 依赖注入,你更喜欢哪一个

2023-02-23 12:55:42 +08:00
 Ayanokouji
java 转 golang 小半年了,还是不太适应 golang 的全局变量模式。

我知道 golang 也有 google wire 和 uber fx 这样的框架,但是所在项目并没有使用。

这里不是引战,只希望各位讨论下,这两种方式的优缺点和个人喜好。
3893 次点击
所在节点    程序员
18 条回复
Mohanson
2023-02-23 13:00:35 +08:00
看我头像然后猜猜答案
chaleaochexist
2023-02-23 13:01:41 +08:00
可以通过别的方式实现 IOC 不一定非得依赖注入.
Ayanokouji
2023-02-23 13:01:44 +08:00
@Mohanson golang 新人,猜不到
aristotll
2023-02-23 13:04:57 +08:00
> 所在项目并没有使用

只能说明所在项目不需要这个复杂性 或者水平比较低
Ayanokouji
2023-02-23 13:06:47 +08:00
@aristotll 但是还是会使用很多中间件,使用的是全局初始化的方式管理中间件的客户端
jeesk
2023-02-23 13:07:52 +08:00
看领导的
kongkongye
2023-02-23 13:09:54 +08:00
有个依赖循环的蛋疼问题
Ayanokouji
2023-02-23 13:12:14 +08:00
@kongkongye 这确实是一个缺点
showshowcode
2023-02-23 13:35:21 +08:00
我没用过别的 不过我们用的 fx
luob
2023-02-23 13:45:21 +08:00
match (单元测试, 参与人数) {
| (false, _) => 全局变量
| (true, n) when n < 10 => 手动依赖注入
| (true, _) => 自动依赖注入
}
coderxy
2023-02-23 14:00:54 +08:00
不要全局变量也不要依赖注入, 做好变量作用域规范就好了。 全局变量跟依赖注入都是大坑。
JamesMackerel
2023-02-23 14:07:27 +08:00
前段时间自己写的项目试了一下 wire ,感觉还可以。我自己是 Java Go 都做的,不过最近 Java 做得更多。

全局变量的这个模式,最烦人的一点就是单元测试很难搞。很难 mock 。但是依赖注入这个就是说会多一些黑盒步骤,出问题的概率会多一点(不过可能手动依赖注入出问题的概率还要大点?)。

说到这里,我又想说一下 beego 的那个 router 的设计。他的 controller 传进去只是拿来做一个识别类型的作用,最后 beego 会根据这个类型,再根据字符串里的函数名,用反射重新创建对象然后搞一遍……完全杜绝了你搞依赖注入那一套。
biubiuF
2023-02-23 14:07:34 +08:00
@Ayanokouji 他头像就是 golang 的 logo
Ayanokouji
2023-02-23 14:18:42 +08:00
@biubiuF 还是不明白能猜出啥来
billlee
2023-02-23 14:22:13 +08:00
依赖注入。而且大部分情况根本不需要框架,手工 wire 就足够了。
JamesMackerel
2023-02-23 14:47:42 +08:00
@Ayanokouji 一般写 go 的人都很讨厌 Java 那一套依赖注入之类的操作。
xiaocaiji111
2023-02-23 15:09:17 +08:00
依赖注入我觉得大项目是必须的,不然全局变量满天飞,很难管理,谁知道啥时候给谁改成了啥。
目前 java 写的多,go 也接触不少年了,go 项目基本使用 wire 做静态注入,简单的就手动组合。像 dig 那种基本无感。
Nazz
2023-02-23 16:41:01 +08:00
推荐私有全局变量, 包内进行相关操作, 尽量可控

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

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

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

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

© 2021 V2EX