Lua化代码的一种设计模式

将现有代码改写为Lua,是减少安装包大小的方式之一。目前最多实现方案是,用Lua实现一个完全相同的类替换原生代码。比如一个ViewController,在Lua中也实现这个类,
OC层则通过预编译宏来选择是否用OC代码或Lua代码。更进一步,通过将一些变量作为参数传递到Lua层,把与该类相关的所以操作都在插件中实现,比如set property、push等。

上面的这种做法,将省代码做到了极限。当然缺点也很明显,如果该类用的地方很多,预编译的宏可能会写多次。另外,由于没有OC的接口,别的地方使用该类的对象的接口时,必须先强制转换。因此我们选择了一种更为友好的实现方式——继承+工厂方法。如图所示:

              +---------------------+
              |   ViewController    |
              +---------------------+
              |                     |
Objective-C   | @property id var    |
              |                     |
              +---------------------+
              |                     |
              | +(void)foo          |
              | +(instance)create +-------+
              |                     |     |
              +----------+----------+     |
                         ^                |
                        +-+               |
                         |                |
                         |                |
                         |                |
              +----------+----------+     |
              |                     |     |
Wax           |  LuaViewController  +<----+
              |                     |
              +---------------------+

之所以这样做,主要是基于以下3个方面考虑

  1. 收敛对象构造。提供工厂方法主要是为了降低外部对Lua的感知,外部统一用create工厂方法获取实例,内部可以随时用宏控制编译的代码。
  2. 保留methord/property。因为从Lua得到的对象都是id类型,通过继承能很好的保留这些接口信息。体积方面,method可以只声明不实现,property可以用@dyanmic。
  3. 部分OC不Lua。Wax这个框架主要是利用反射机制与OC Runtime通信,调用并不高效。C/C++的函数不能调用,对结构体支持比较弱。不排除框架本身也有Bug。通过继承,就能灵活规避这些不利因素,把性能相关的部分交给父类实现。

鱼和熊掌不能兼得。这种半Lua的方式,即使空壳的父类还是占了一定的体积(根据属性和偏继承不同,OC层的代码一般1k左右)。只适用于OC和Lua混用的较多,和规避Wax做得不足的地方。

你可能感兴趣的:(Lua化代码的一种设计模式)