秒速赛车技巧:iOS 混编 模块化组件化

  平常我们看到一些大型库,或者一些公司介绍自己产品架构时候都是什么样的?是不是下层有 OpenGL ES 和 Core Graphics 才有上层 Core Animation,再到 UIKit。下层决定上层,只有把复用率高的部分抽出才能逐步构建上层业务。

  先说 LPDBOCFoundationGarbage,叫这个名字显然不仅仅会放入上面所提到的文件。LPDBOCFoundationGarbage 还会大量放入长期不跟随业务变动的 OC 代码。这是因为,在实践中,我们发现总是『理想很美好』,虽然大家都抱有把旧代码整理一遍的愿望,但是实际上,我们项目的旧代码已经到了剪不断理还乱的地步,所以期望一边整理、一边分离的想法基本是不可靠的。这时候就要借用 MM 大佬给我们传授的一句话『让恶心的代码恶心到一起』,LPDBOCFoundationGarbage 正是为此而创建。

  关于前缀说两句。我们所有抽出的库都带有前缀 LPDB,但是针对 Swift 库和 OC 库稍有区分的是,OC 库内的文件也都带有前缀,而 Swift 库是去掉了前缀,这也符合两种语言的规范。

  Lotusoot是个由我开发的模块化工具和规范,一开始我叫它『路由』,但是随后发现部门这边因为叫它『路由库』而曲解了它的意思,所以后来我就叫『模块化工具』了。关于 Lotusoot 将会有另一篇文章。

  这块毋庸置疑,不管什么项目都基本有的一块,基本上我们项目中网络相关的旧代码都是 OC 的,唯一比较麻烦的是,我们的网络层,早期人员写的比较粗糙,甚至和 UI 层代码有很多耦合,比如网络请求中和网络请求失败有一些 HUD 显示,转转菊花什么的。所以导致在从主工程抽离的时候有很多恶心的地方。

  所以对于这种强耦合,最后解决的方式是分成了两遍代码改造,第一遍先通过反射先将 OC 代码抽出,保证代码可用,通过基础测试。第二遍是通过协议来代替原先的反射。秒速赛车技巧:iOS 混编 模块化组件化 经验指北第三遍是使用 Lotusoot 彻底规范服务调用。在后面一节『过程中的一些难点总结』中会介绍

  这块是用于环境控制的,切换要访问的服务器环境,这块本身可以不抽出的,但是由于有其他基础模块,比如 LPDBNetwork 依赖,而且其中相关代码比较多,环境相关的代码也比较独立,所以单独抽出。

  抽取代码第一遍使用反射的原因主要是,通常你在递归某个文件的依赖的时候,会递归出非常多的东西(尤其是我们的蜜汁旧代码),往往就是 A-B-C-D-F,中间有各种依赖,甚至到最后一层的时候还引用了 Swift 的类。直到最后你看 #import 就想吐。

  这主要是因为单个 Pod 库开发时使用开发模式是很容易调试的,但是两个 Pod 库同时在不发版本的情况下使用开发模式是比较难处理的。秒速赛车技巧:这种情况下,反复操作两个或者两个以上的库是麻烦的,所以优先考虑将代码尽快分离开来,并能通过基本测试,不影响功能。

  之前跟大神们讨论组件化(模块化)的具体实践时候,说到了主流的组件化可能都借用了 + (void)load 方法和 rumtime 操作来注册路由和服务。这时候 casa 大神提出了一种说法『组件化的根本目的是隔离、隔离问题影响域、隔离业务、隔离开发时的依赖。所以让两个本来有关系的人变得没有关系,就需要一个中间人,如果不用 runtime 能省掉不少事,如果考虑可维护性,用字符串足够了,也就是用字符串来表征方法、方法字典表征参数,URL 是字符串的更复杂表征,其本质还是字符串,用 URL 不如用字符串』。

  那个时候听了 casa 大神的说法觉得『哎?好像有点道理』,但是在后期的实践中,我觉得就我个人的代码习惯,是希望尽可能的将问题暴露在编译阶段,能让它抛出 error 就抛出 error,纵使使用字符串可以定义常量,但由于大家不是独立负责项目,在其他人看到你的方法参数时,比如:+ (void)callService:(NSString *)sUrl 或者 + (void)openURL:(NSString *)url ,对方发现你的参数是 NSStrring,很有可能直接硬编码字符串而不去查阅常量列表,这是习惯性编码很容易出现的问题。

  最后一点原因是,反射或者通过类/方法字符串字典的方式实在太 OC 了,不管怎么样我们是一个尽量 Swift 化的项目,应该尽量吸取其优点,虽然抽出的 OC 库可以使用反射,那 Swift 库咋办?目前 Swift3 与 4 都没有很好的支持反射。

  Lotusoot的最初目的就是为了解决模块间的耦合,并且同时支持 OC 和 Swift 使。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.yingkedasmt.com/ganhuo/535.html