前任留下的代码,大量使用了EventBus,注释很少,我非常头疼。
1、难以追踪
举个例子,类 A 使用 B 进行延时操作,A -> EventC -> B -> EventD -> A。
类 A 使用 B 却不需要依赖 B,这样我要修改 B,却不知道 A 有用到 B,那就可能出现 BUG。
退一步说,我可以通过事件 EventC 知道 A 与 B 有所关联,但可能还有 A1、A2、B1、B2 一大堆的类依赖了 EventC。
得了,现在我只能全局搜“post(C)”找出那些事件发起者,然后把它们一个一个记起来,“哦,原来是A、A1、A2”,然后再全局搜“(EventC”,记起来那些事件接受者,“哦,原来是B、B1、B2”。
然后我还要运行起来,给B上断点,看看实际是哪个A调用了我要修改的 B。而不是我没修改的 B1、B2 。
然而还不行,B切换了线程,现在我只能在 3个A中全打断点,看看是谁发起事件的。
最后呢,EventD 不仅被 A 接受,还被 A1、A2 接受,现在我还得注意,实际使用时会不会被A1、A2所影响。
回顾一下,为了追踪一个调用,我需要 全局搜+记起来+全局搜+记起来+断点运行一遍。而如果不用EventBus。我只需要按着 Ctrl 点进去就追踪到了。别提多难受了。
2、事件分化严重
实际上我希望代码调用流程是这样的(一目了然):
public void start() { createDog((dog) -> { touchDog(dog); removeDog(dog); }); }
而EventBus是这样的:
public void start() { createDog(); } private void createDog() { EventBus.getDefault().post(new Dog); } @Subscribe() public void createDogSucceed(Dog dog) { touchDog(dog); removeDog(dog); }
我需要追踪到 createDog 这个实现类中,才知道它是如何回调的。上述只分了两块,若果分块更多,一个一个找起来麻烦死。