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

2022 年 9 月 5 日
 vczyh

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

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

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

8879 次点击
所在节点    Java
65 条回复
Kontinue
2022 年 9 月 5 日
1. 设计问题,重新设计
2. 学阿里,加一层 manager 层
luman
2022 年 9 月 5 日
接口和实现分不同的 module 。实现 module 禁止其他模块引用。多个接口模块需要同时引用的类放到 common-module ,common 不引用任何模块
VeryZero
2022 年 9 月 5 日
分层,如果发现 service 互相调用,就再加一层。。
vczyh
2022 年 9 月 5 日
@Kontinue 那 service 调用 service 是否合理呢,还是直接禁止 service 依赖其他 service ,如果需要组合那么在 manager ( facade )层干这件事。
superB
2022 年 9 月 5 日
只要一個 God Class 就不依賴的
vczyh
2022 年 9 月 5 日
@VeryZero 那这样是不是直接禁止 service 互相调用更好?
vczyh
2022 年 9 月 5 日
@Very
@vczyh 写错了,应该是禁止 service 注入别的 service
Kontinue
2022 年 9 月 5 日
@vczyh
我觉得 service 调用 service 是合理的,但是互相调用那就不合理了。。
1. 一般设计时候能想到的公共方法,一般会单独抽出来,放到 manager 层或者跟 2L 说的一样,搞一个 common module 。
2. 但写着写着,可能会出现新的 service 会用到之前 service 的某个方法,然后就开始互相调用了哈哈
Akitora
2022 年 9 月 5 日
把需要调用的另一个服务的方法在上一层作为 callback 参数传进服务去
frank1256
2022 年 9 月 5 日
无脑用,写完了,不同语言写工具去检测,spring 的 ioc ,或者 go 的 go-wire ,你让人去设计,不如让工具检测来的方便
Jooooooooo
2022 年 9 月 5 日
刻意追求这种规定干啥...
optional
2022 年 9 月 5 日
application service 禁止互相调用
hay0577
2022 年 9 月 5 日
..循环依赖???不是有个懒加载就能解决了吗.现在没问题 能跑就行..等以后出了问题再说呗
sadfQED2
2022 年 9 月 5 日
再加一层
xuanbg
2022 年 9 月 5 日
我从来不考虑循环依赖问题,因为我写代码前先画个思维导图。我就问你思维导图怎么产生交叉?
vczyh
2022 年 9 月 5 日
@frank1256 主要是检查出来后又得重新设计,不如在设计之初想想如何避免。
vczyh
2022 年 9 月 5 日
@Jooooooooo 不是追求规定,如果一开始没有规定或者设计不合理,之后大概率出现循环依赖。
vczyh
2022 年 9 月 5 日
@hay313955795 在理哈哈
Jooooooooo
2022 年 9 月 5 日
@vczyh 有很多场景循环依赖是最简单合理的设计, 我认为刻意是规避没有意义.
vczyh
2022 年 9 月 5 日
@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