咨询:同一对象两方法入栈时夹异对象方法的术语及反模式名称
对应的术语:循环回调(Circular Callback)与双向依赖反模式
你要找的这个术语其实挺常见的,就是循环回调(Circular Callback),它一般和**双向依赖(Bidirectional Dependency)**这个代码结构绑定在一起——也就是两个类互相持有对方的引用,并且在各自的方法里交叉调用,刚好对应你描述的“同一对象的两个方法处于调用栈中,中间夹着另一个对象的方法”的场景。
这种模式之所以常被视为反模式,主要有这些问题:
- 调用流程变得极难追踪和调试,交叉的调用栈很容易让逻辑变得混乱,排查问题时要来回跳两个类的代码
- 双向依赖会把两个类的耦合度拉得很高,单独测试其中一个类会变得麻烦(比如你没法单独测
Master而不模拟一个Slave,反过来也一样) - 极端情况下还可能引发意外的递归循环或者资源释放问题,比如你例子里
onSlaveFinished调用了slave.dispose,如果dispose里又触发了和Master相关的逻辑,很容易出bug
结合你给出的代码例子来看:
class Master { Slave slave; public void startSlave() { slave.doWork(); } public void onSlaveFinished() { slave.dispose(); } } class Slave { Master master; public void doWork() { // ...执行一些工作 master.onSlaveFinished(); // ...可能执行一些其他操作... } }
这里的调用栈流程是:Master.startSlave() → Slave.doWork() → Master.onSlaveFinished(),完美符合你说的场景,这就是典型的循环回调,根源就是Master和Slave之间的双向依赖。
另外,有时候这种情况也会被宽泛地称为交叉调用(Cross-Call),但循环回调是更精准的官方术语。
内容的提问来源于stack exchange,提问作者Máté Safranka
相关产品推荐
相关产品推荐

