不限语言,谈谈如何避免循环依赖?

2022-09-05 16:08:10 +08:00
 vczyh

如何避免循环依赖,这个其实和语言没什么关系。

解决方式也比较简单,但是随着业务复杂起来,比较容易出现这种情况。

就用 Java 来说,大家怎么避免 service 互相调用的。

6950 次点击
所在节点    Java
65 条回复
Kontinue
2022-09-05 16:11:48 +08:00
1. 设计问题,重新设计
2. 学阿里,加一层 manager 层
sunjiayao
2022-09-05 16:12:12 +08:00
接口和实现分不同的 module 。实现 module 禁止其他模块引用。多个接口模块需要同时引用的类放到 common-module ,common 不引用任何模块
VeryZero
2022-09-05 16:17:16 +08:00
分层,如果发现 service 互相调用,就再加一层。。
vczyh
2022-09-05 16:18:01 +08:00
@Kontinue 那 service 调用 service 是否合理呢,还是直接禁止 service 依赖其他 service ,如果需要组合那么在 manager ( facade )层干这件事。
superB
2022-09-05 16:18:31 +08:00
只要一個 God Class 就不依賴的
vczyh
2022-09-05 16:18:44 +08:00
@VeryZero 那这样是不是直接禁止 service 互相调用更好?
vczyh
2022-09-05 16:19:45 +08:00
@Very
@vczyh 写错了,应该是禁止 service 注入别的 service
Kontinue
2022-09-05 16:22:45 +08:00
@vczyh
我觉得 service 调用 service 是合理的,但是互相调用那就不合理了。。
1. 一般设计时候能想到的公共方法,一般会单独抽出来,放到 manager 层或者跟 2L 说的一样,搞一个 common module 。
2. 但写着写着,可能会出现新的 service 会用到之前 service 的某个方法,然后就开始互相调用了哈哈
Akitora
2022-09-05 16:27:54 +08:00
把需要调用的另一个服务的方法在上一层作为 callback 参数传进服务去
frank1256
2022-09-05 16:28:01 +08:00
无脑用,写完了,不同语言写工具去检测,spring 的 ioc ,或者 go 的 go-wire ,你让人去设计,不如让工具检测来的方便
Jooooooooo
2022-09-05 16:29:46 +08:00
刻意追求这种规定干啥...
optional
2022-09-05 16:33:13 +08:00
application service 禁止互相调用
hay313955795
2022-09-05 16:34:14 +08:00
..循环依赖???不是有个懒加载就能解决了吗.现在没问题 能跑就行..等以后出了问题再说呗
sadfQED2
2022-09-05 16:35:16 +08:00
再加一层
xuanbg
2022-09-05 16:45:47 +08:00
我从来不考虑循环依赖问题,因为我写代码前先画个思维导图。我就问你思维导图怎么产生交叉?
vczyh
2022-09-05 16:58:29 +08:00
@frank1256 主要是检查出来后又得重新设计,不如在设计之初想想如何避免。
vczyh
2022-09-05 16:59:08 +08:00
@Jooooooooo 不是追求规定,如果一开始没有规定或者设计不合理,之后大概率出现循环依赖。
vczyh
2022-09-05 16:59:22 +08:00
@hay313955795 在理哈哈
Jooooooooo
2022-09-05 17:01:04 +08:00
@vczyh 有很多场景循环依赖是最简单合理的设计, 我认为刻意是规避没有意义.
vczyh
2022-09-05 17:01:49 +08:00
@xuanbg 你其实说到重点了,最根本的就是设计问题,谁依赖谁在设计之初就决定了,如果大家都了解那么没有问题,但是在业务发展的过程中,没有 review 很有可能破坏规则,那么可以可以在工程代码上指定一些规范来尽量避免,比如说:禁止 service 调用 service ?

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

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

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

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

© 2021 V2EX