本文是基于游戏开发进行讨论,我所使用的语言是脚本语言lua,所以此处拓展为mod,而拓展者为modder。
设计模式
设计模式中有一条叫做开闭原则,意思是:程序应该,对扩展开放,而对修改关闭。
而对拓展完全开放原则却不一样,对拓展完全开放原则坚持,一切都可以被修改,包括原有的函数实现,原有的变量。
这与设计模式中的开闭原则是相悖的,那么这种设计原则是好的吗?
为什么选择对拓展完全开放
为什么我选择对拓展完全开放?因为我是一名我的世界模组开发者,我知道modder们是怎么通过asm和反射等方法肆意修改java的类方法和字段。
这种修改是极其复杂的,但是也是不可避免的,有需求就有市场,我的世界的种种特性,导致了asm成为大型mod开发不可或缺的工具。很多人也通过asm来处理不同mod之间的不兼容问题。
为什么不选择对拓展完全开放
为什么不选择对拓展完全开放?原因很简单,因为不稳定,想象一种情况,两个mod同时修改了同一份代码,但是他们却都毫不知情对方,这样子就容易导致游戏的崩溃。对拓展完全开放必须建立在一个有效的交流和管理的机制上面。
为什么我选择对拓展完全开放
为什么我选择对拓展完全开放?因为我做的游戏是开源的,一个开源的mod游戏,既然开源,玩家就可以自己修改源代码,与其让游戏变出很多版本,不如让游戏变得更加开放,所以我选择对拓展完全开放。
我是怎么实现对拓展完全开放的
所有函数均为储存在全局的表里,以便于mod对原有函数实现进行替换。
所有变量均存放在全局的表里,以便于mod对原有变量实现进行修改。
这样做有啥好处
数据单独储存,游戏状态只与数据状态有关,有利于lua代码的热更新,也利于游戏的快存,快读。
所有函数都能直接操控的任意变量,基于所有的mod最高权限,以求最简单的实现功能。
易于模块化,所有模块均通过全局变量进行交互。
易于书写。
再谈设计
我不知道我这样做耦合度高不高。
我不知道我这样做好不好。
我只是这么想了,就这么做了。
希望这么做不要出大问题。
最后,向所有开源者和游戏模组作者表示最高的敬意,你们做的是世界上最伟大而美好的事情。