一点关于 Component 的思考
前置知识
面向对象编程 Object Oriented Programming
继承
实现继承
让派生类可以使用基类的接口和实现,而不需要重新编写相同的代码。目的是代码的复用。
但是实现继承会导致派生类和基类之间的强耦合,当基类的实现发生变化时,派生类也需要跟着变化。
接口继承
接口继承是指派生类只继承基类的接口,而不继承基类的实现。目的是让更高层的调用者不需要关注具体细节,可以一视同仁的去处理他见到的所以对象。我们也会把这种思想叫做“归一化”,典型的就是toString()
方法。
反过来也一样,高层的调用者不需要对底层的实现指手画脚,最好连告知都不需要告知他们。我们把这种策略叫做“封装”
缺点
- 代码复用性相对差
- 实际开发中,对象缺少明显的父子继承关系
- 实现继承的强耦合性
游戏世界的对象是绝对复杂的,再父子继承的过程中,我们几乎没办法找到一个父类或者祖父类让所有子类都心甘情愿的继承他。
下面可以举一个小栗子
我们有一个 水陆空三栖核能魔法混动运兵器
,那么这个类该继承自谁呢?
或许你能搞定他的父类,但是你能搞定他的祖父类吗?战车?船只?还是飞机?
或许你会觉得这个例子太过刁钻了,但事实上,哪怕是现实世界的对象,纯粹的 OO 也会心有余而力不足。比如,弓骑兵到底是骑兵的子类还是弓手的子类?还有那个经久不衰的笑话,连裤袜倒是改继承自裤子还是袜子?虽然最高法告诉我们连裤袜就是连裤袜,但是对于一种编程范式来说,模糊和冗余是致命的。
这就是这节课我为什么要和大家谈面向组件开发。
什么是面向组件编程 Component-Oriented Programming
什么是组件
组件的本质,就是把一些经常使用的功能或者行为抽离出来,封装成一个个独立的模块,在要使用的时候想乐高积木或者 Switch 的游戏卡带一样,组装起来或者插进我们想要构建功能的对象中就可以了。这种性质,我们也称为 PnP,即 Plug and Play, 即插即用。大家以后要熟悉这个词,在很多领域都会大量出现。
另一种解决方案——面向数据编程 Data-Oriented Programming
没有银弹
“A”:“a”
“B”:“b”
“Sprite”:4