关于代码解耦的一点小困惑

有一个关于框架设计得问题想问一下大佬们,就是为了降低耦合,我用了mvc得方式来做UI界面,现在有一个情况是,模块v1想对模块v2 施加影响,但是又不想通过发事件的方式来解决这个问题,也不想v1 和v2之间产生依赖关系,这种情况下 应该怎么办呢

不想通过发事件解决的原因是实际开发过程中,会出现两个不同的人负责的不同的模块之间 会产生相互影响,最后会导致事件接收方来解决处理这个问题,但其实接收方是不关心这个事件的。

就比如说:我想在我的背包模块里面飞一个 金币去到 资产模块的位置,这时候就需要知道资产模块的位置信息,但我又不想这两个模块之间产生依赖关系,也不想发事件去资产模块,因为资产模块根本不想关心飞金币动画这个事情,只有背包模块关心这个事情。
然后最终想达到的目的就是:无论我屏蔽哪个模块 程序都不会报错

好苦恼啊 !!!!希望大佬们能帮助解惑

背包模块写死资产模块的位置不行吗 :smile:

资产模块位置一般就在最顶端吧,一般不会变动,楼上写死位置的办法可行啊。 :grinning:

实际情况的需求往往会是,当金币动画飞到资产的位置后,还需要资产上的ui配合着播放一些动画,这个时候就不得不通知资产模块做处理了。

接受不完美吧。

我遇到最常用的处理是把数据放在中介层,然后两边都可以取用,我公司项目中的中介层一般是 bundle 的数据集合

我个人的想法是,也用中介层,但是中介层可以做成一个注册机制,获取数据可以有两个接口,一个同步,一个异步,同步接口获取数据未注册时直接返回,异步接口获取数据直接返回 promise(可以在数据注册前获取),同时附带超时时间

同时还是要处理未获取到数据的情况。要么就写回调,未获取到就不调用,但我个人不推荐

非纯代码的话,给背包模块自定义个ui组件吧,组件上设置些参数和绑定目标node节点,就知道金币应该往哪飞
纯代码的话,调用时至少也得传入目标v2或node给背包模块

目标node这边,暴力点的话,检测是否添加了子节点之类的,并且子节点是否达到预期的状态(可能是个动画)

这样的写法是我最早的时候用的,写起来代码关系很杂乱,如果A和B模块都需要在onLoad里面用到对方模块的数据初始化自己,那么这种情况下只能做额外的操作避免,又增加了复杂度

我赞同楼上的,数据层分离出来共用

这样当然没问题咯,不过这只是举得一个例子啦~ 中心思想 还是 解决不同模块之间如何通信沟通得问题

难道你们不加 widget 适配?

对的 对的 完全有可能是这样

仅针对你这个问题,我目前的做法是,搞一个NodeMgr,用Key来绑定其它模块需要用到的节点,各个模块在onLoad()时,bindNode(key:string,node:cc.Node),然后其他模块要用的时候,getNode(key:string):cc.Node,然后key从一个枚举NodeKey里拿,各模块维护同一个NodeKey,防止节点重复绑定被覆盖。这样一来,运行时,如果发现getNode()为空,你就找负责绑定这个节点的人,问他怎么没把我要的节点给我,哈!

好,每次修改一次 UI 都需要重新检查一遍 NodeKey 是否对应,换皮时直接影响一大半,到时候直接累死你们

1赞

当然是 加了的,这个例子克能举得不太恰当 其实主要还是想 模块之间解耦,大佬你得这个加中阶层得思路还是很值得借鉴得

所以这也是一个加中间层得思路,把一些别得模块克能要用得东西放在一个公共得地方,然后其他模块随意取用么

我不是很理解额,换皮不是直接换图片嘛,节点应该是不动的吧。

确实会有这种问题

至少,针对你这个飞金币的问题,我一直是这么干的,感觉挺好用的呀 :laughing:

一句话,UI 换少了,你还真以为美术会看你的节点结构来出图?