MVC在游戏前端的应用,第一篇之问题篇

那非要这么说,就把XXController重命名一下叫XXModel也可以啊,只是说对外的要提取出来单独做一层免得污染到里面的数据结构。其实内部结构还是一样的,需要个整体对外的类

为什么不使用 private public 解决呢?或者单独写一个 interface 包装 M,这些都是比单独写个函数接口更高效的方式

这个不是单独接口啊,是提取出对外的事件处理,协议处理这些,专门做的隔离类
你就认为handleXXXEvent,handleServerMessageXXX,还有openView这种的提取出来单独的一个类。

我的意思就是说你的 C 对外接口就是一个单独的函数,而 private public interface 都能解决对外的接口/属性开放问题

private public interface 可以解决接入外部事件系统吗? 目前大部分模块对外的接口,就是全局事件系统咯。
就是这个类的函数名字叫:handleXXXEvent,handleServerMessageXXX,这些。不是接口函数

太强了,都是大佬!!!! :rofl:

看得出小弟对mvc的理解很肤浅

赚钱就是mvc,不赚钱就是一坨bull shit

对外的事件有很多解决方式,一是分两个事件对象但是模块编写者比较麻烦,二是定义两个事件范围,例如两个 interface 一个对外一个对内,然后合并类型即可,外部使用者则使用一个对外的类型接口

例如

interface event { ... }

interface public_event { ... }

class model {
    private _event = new SafeEventTargte<event | public_event>();
    get event(): SafeEventTargte<public_event> {
        return this._event;
    }
}

内部使用 _event ,外部使用 event

那我们的全局事件系统不太一样,我们是有全局管线的解耦各个模块。
就是以前flash,现在haxe库里面那种,你也可以看成node.on这种。通过addEventListener,dispatchEvent,以string做key派发的全局事件,不需要从model里面拿event,这样会依赖model。
这些就需要一个类去active的时候listen,然后注册自己的callback handler进去。协议处理也是一样,注册自己的messageHandler进去。
模块交互只需要通过stringkey 的event 来交互,有没有人接收,或者某个模块屏蔽了都没关系。

这只是我举例而已,也可以注册事件由全局对象管理,你举例的 node 是什么?一个全局对象?而且我并不喜欢直接使用 string,因为事件变更很频繁,也没有参数类型提示

就是类似cocos node 去注册鼠标点击回调的那种接口。
全局事件管线是一个全局的对象。所有的模块controller都注册回调在上面,跨模块可以通过这个事件管线来发送消息。
string key 是为了解除对模块显式的依赖,不需要去模块里面取事件引用。所以才用string,你用生成的id,或者命名好的object也可以。

了解了,你这种方式适合管理大型项目,但是如果没有类型提示,那就用起来就有点麻烦,单独一个事件键 enum 是没有太大用处的

业务复杂了是不能这么写的,肯定是多种模式的组合,不要拘泥于一种

待过几家基本都是MC-V的结构比较多,视图层单独拿出来,MC不分家写一个类里。标准的MVC还没遇到过,也可能是因为我重度项目接触的相对少一些。

比如视图层叫XXXPanel,控制层和数据层叫XXXSystem或者XXXModel

你们有没有见过:
Controller 里引用着model,引用着View
Model里 引用着Controller, 引用着View
View里 引用着Controller,引用着Model
Controller能广播消息,Model能广播消息,View里能广播消息, 一个控件监听着3大消息,还依赖于执行顺序

整个项目各个类的关系是一张大网,你中有我, 我中有你

如果你都见过,并且能处理的很好,说明你的工作经验够了,百屎丛中过,片屎不沾身

5赞

:joy:

招人么 马赛克

我在的公司目前不招人,抱歉哈

好吧 谢谢大佬