关于框架和组件 20200328
我有一个比喻,来描述组件和架构的关系,就是用军种和军队,多个组件组成一个架构,多个军种组成一支军队,军队是为了达到特定目的,完成特定任务而设置的一个群体,目标不同、实际情况不同,可能组成军队的军种相差就非常大,你不能指望一只医疗队伍代替坦克去攻占阵地,你也不能让后勤部队执行空袭任务。其实一样的,不同的应用场景,我们所使用的框架有区别非常的正常。我们要适应、接受这个情况。
跟架构相比,组件相对稳定,就像军队可能多变,军种相对稳定。军种和军队没有谁比谁重要一说,两个是不同概念,同样的,组件和架构因为目标不同,所以在重要性方面也没有可比性。但是相比之下,组件是基础,架构是表现,是结果,所以组件会相对稳定。
如果大家理解了这个关系,我们再来谈谈如何提升各个兵种的价值输出,也就是各个组件自身的价值,首先,从理论上说各个组件的功能应该是正交的,通俗地讲你的网络库不能提供日志功能,你的Lua组件库没道理去依赖网络组件,在满足正交的前提下,让组件的功能做到极致,比如你一个网络库你不仅要提供TCP的服务器,客户端,还要HTTP的服务器和客户端,这些基础功能缺一不可。
如果各个组件之间的关系是正交的,那应该就是极度扁平状态,这样是最稳定,因为重心最低嘛、最容易组合,当然这个情况可能非常难,如果必要我们能接受一定程度的层次,最佳情况是彼此互不依赖,减少层级,层级越少,越容易组合,层级高的下面动动上面就倒了对不对?
还要纠正大家的一个错误认识,就是大家要在统一的一套框架下面做事情,我觉得这个出发点不对,框架是为了完成特定任务而构建的,如果需求不同强行统一框架就是“削足适履”。所以我之前提出了一个方案,就是为了统一大家的风格,可以从组件入手,大家用相同的组件,风格也会越来越统一。
统一框架我觉得他的本意是统一风格,风格统一还有一个很重要的要素,就是大家要多交流,多重构,其实很多事情都不会一次就做对,跳坑了积极主动的爬出来,告诉其他人怎么避免这个问题,正确姿势应该是什么,这样其他的人就能避免再次跳坑,久而久之,那个最正确的姿势就成了大家统一的姿势,这样不挺好么?

在说框架之前,先谈谈组成框架的组件,对于网络游戏来说,比较大的组件也就是核心组件有网络组件、数据库组件、日志组件。在我心目中只有这三个可以称之为核心组件。其他的稍微小一点的非核心组件有:定时器、ID生成器等。
组件是组成框架的前提,组件和框架之间的关系就相当于兵种和军队的关系,如果兵种没有战斗力,军队就是摆设。
各个组件会升级换代,有垂直方式的升级换代,也可能会有水平方式的替代,就像各个兵种一样,不输出战斗力就是要被替代,而军队只是为了完成特定任务而组合起来的兵种组合,同样,我们的框架也是为了完成特定任务,把必要的组件组合起来的一个有机的整体。任务不同,我们提出的框架也可能会不同。框架并非一成不变,不太可能也没必要用一种框架打遍天下,但是框架是组件的组合和实例化
我心目中高质量的组件长什么样?
高内聚,少依赖。简单地说要小而美,不要大而全,完成纯粹的功能。比如网络组件里面就不能依赖日志,一些网络库不仅有日志,还有Lua,这点让人很纠结,如果客户有一个更好的日志组件或者Lua组件,还用你这个心里就很尴尬。好的组件要干干净净,这里值得提的一点就是ASIO的网络库,我认为很不错,很干净,一旦很干净会不容易与客户其他的组件冲突。其实干净还有一个更重要的好处,易于拆卸能让我们更方便的去升级组件,一套框架只有进行不断地优化、改进、进化才不至于被淘汰。不指望一个组件能用到老。
跨平台,Windows、Linux都能跑。虽然主流的生产环境是Linux,但是Visual Studio强大的IDE让人欲罢不能,不愧是宇宙第一神器,如果服务器能用Visual Studio开发,跑在Windows平台,会对开发者非常友好,极大地提高开发效率。
尽量减少对编译器的版本依赖,让主流的编译器能编译通过。现在大多数项目组能接受C++11,除非很必要,尽量不提高需求。争取能做到随便一台主流的Linux机器,不管是Ubuntu,还是Centos都能方便的编译通过。
内置示例、功能测试、压力测试代码,一来容易进行各种测试、发现问题,二来很容易让人理解,容易使用。
一些基本要求就是,稳定性、性能。
有人可能有疑问,同样是做一款游戏,为什么每次提出的框架都不一样,这是个好问题,首先,我认为框架是为实现游戏功能,满足设计要求而定的,如果两款游戏的需求不一样,框架有区别是很正常的一件事情。
框架有生命周期,有它的历史使命,它应该会随着技术的发展、需求的更新而不断地更新换代,框架寿命有长有短,这本身无可诟病,也许没有一种框架是永恒的。
相比之下,组件的生命周期可能会长一些,这是由于组件所完成的功能比较固定,像网络游戏的三个核心需求:网络、数据库、计算这三样很难发生变化,所以你看网络组件、数据库组件几乎在任何网游框架里面都有。