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

对,其实内聚的处理逻辑是可以写在M的,C相当是一个包装,对外接口。
例如C 监听 A_UPDATED, 并且有一个 handleAUpdate函数。
handleAUpdate (aData) {
model.changeAPart1(aData.data1);
model.calculateAPart2(aData.data2);
}
view 根据model数据变化抛出事件刷新,或者就直接C里面调v.refreshAData(),就是你说的C调V。

关键就是handler本身做了一个转发函数handleAUpdate,这个转发函数就是和model的中间层,他直接注册在事件系统里,而把model从外部事件系统里面隔离开了。
其实就是facade包装整合。或者你也看成PureMVC的command整合也可以。

那么MV的职责怎么划分?我直接把数据写在V里呢?然后C调V就行了,你怎么处理

或者我直接全部写在C里面,你怎么处理?没有编辑器支持的判错机制,一定会出现问题

也就是怎么确认代码写在MVC的哪个部分。这个必须要有一个统一且编辑器能判错的机制,如果没有这个东西,我可以写在任一一个地方

目前我还没看到一个强制划分职责及代码的方式,都是人工判断,那么这种问题只要写代码的人没有这个思想,那就总会出现代码混在一起的问题

其实MVC挺难强制划分的,关键是在V有自己的界面轻数据,在C也有可能有中间数据,没办法用机械的方式来判断,这个数据一定要放到M里面。这个就只能是统一思想,人工判定。
然后如果做不到这点的情况下,例如新人多,进度紧。那就把模块看成黑盒,输入输出没问题就可以了。某些关键模块,需要被其他模块大量用到的,例如玩家基础数据等,就需要仔细检查下,可能要擦点屁股就是了。
编辑:其实也不能因为手下人不会而因噎废食,主要还是要把规范贯彻下去,几年配合下来基本上团队上不会有太多这个问题。

另外我自己在写UI模块的时候,没有MVC是写不下去的,我试过单纯写一起,但是会很别扭,或者就逐步重构成了类似MVC的结构了。
当时我深入思考了一下,可能是因为,我习惯于抛开对外交互和展示,单纯先构建数据和逻辑,就是核心的M,我看了领域模型设计相关的内容,确认这就是领域模型。构建完模型和测试后,才会考虑抽对外接口和展示相关。所以自然而然就会MVC化。

所以这就是开发效率比单模块和MV低的原因,直接一把梭,只要自己不偷懒分割组件功能,每个模块的代码也很少

可能还是规模上不一样吧。一把梭到后面配合改起来就比较麻烦了,整体代码量也不少。

用你的方式代码业务代码大多也在M,但是 C 的职责并没有限定所以可以写在 M 也可以写在 C,那还不如直接用 MV

C的职责限定了。就是模块对外接口,事件和协议处理,你可以认为是facade吧,C 才是接入全局事件系统和协议回调的。
M完全不对外,保持内聚,没有外部引用。

我的意思是你的业务代码怎么判断写在 M 还是 C?即使外部调用,我可以写在 M 被 C 调用,你怎么划分?

对,就是写在M,但被C调用,用C是为了解耦M不暴露在外部系统中。
你可以看看PureMVC为什么有一个Command的概念,这个Command也是C的职责。

所以这就是多了一个中间层,那和我直接写在 M 只暴露指定的接口有什么区别?变得更复杂?

你让M直接接入全局事件管线和协议处理,发送协议? 这样责任太多容易乱。并且M对外的依赖会干扰到逻辑内聚。

反正就是:依赖解耦,统一对外接口。
其他的我也不多说了,你可以看看facade模式。

网络请求通常是单独的,因为可能多个地方调用,所以我不会写在 M 内,而事件是必须的,即使你的方式也需要监听事件从 C 调用 MV,而直接在 M 内监听调用 V 无疑更方便

一个设计模式并不符合所有的使用场景,什么使用方便,利于维护,且优于其他方式那就应该用它

那就对了。反正我这边项目用这个方式,划分的非常清晰,那你非要说不行我也没办法。

举个在同一使用场景下和 MV 比较的更优的例子?游戏中通常遇到的?直接用案例比较吧,说的太空洞用实际举例

每个人的理解可能都是不一样,代码结构、编程思路,每个人可能都是对的,因为适合自己。

团队开发中还是讲究大面上的规范性,把大家的思路收敛一下,借助工具或框架约束一下,但细致上也确实不好把控(几乎也不会有那个精力去把控细节)。

优不优主要还是看代码清晰不清晰,我Model完全内聚解耦了,不需要沾染外面的事件,不就更清晰了。用handlerXXXEvent做函数名,还是说领域里面实际业务做函数名分拆。整体清晰度就不一样。
还是不继续说了,反正总是能找到理由。看项目适合程度吧,我不习惯直接暴露数据层作为对外接口。

如果不能在同一使用场景下找到比另一种方式更好的证明,例如开发时间,代码划分,那么即使你认为它再好也是你认为的,在实际中并没有另一种好

你说的是对的,但是现在讨论的是哪种规范更有效的问题,并不是是否遵守规范的问题

循环引用的问题能够解决的话,其实把m暴露出来,他全揽下所有数据层面的工作,个人觉得对于开发效率来说是最高的