2015年入职XDF参与留留学iOS端的研发,至今,参与了好几个项目(留留学、掌上新东方、SL、乐听说等),最近负责乐听说iOS App端。不同项目的经历,让我接触到了不同的项目架构和代码风格,也让我对App的项目架构有所思考与心得。 1、App早期架构1.02015年6月留留学App iOS端1.0.0版本诞生,当时采用的架构很简单,就是在传统的MVC架构基础上,封装了一个网络服务层构建而成的,当时为了快速迭代上线,所以移动端App开发采用了“短平快”的MVC架构,架构如下图所示: 这种架构以层次结构简单清晰,代码容易开发而被大多数人接受,各层的分工如下:
但经过几个版本的迭代,我们发现App所采用的MVC架构从Model-View-Controller走向了Massive-View-Controller的终点,其最严重的结果就是Control层的代码越来越多越来越臃肿难于扩展维护,同时Control层和View层之间存在一些较高的耦合。 2、App架构2.0基于上述遇到的问题,我们对原有的传统架构做了优化和调整,提出App架构2.0,并在留留学2.3.0项目中开始逐步重构采用MVVM分层架构,通过MVVM架构,可以有效实现Controller和View的解耦,同时使Controller轻量级,最终使越来越臃肿的Controller层逐步缩小并分解解耦,业务逻辑分模块下沉。 掌新架构如下: 各层的分工如下:
通过MVVM架构,可以有效实现Controller和View的解耦,同时使Controller轻量级,但这种架构也有一些弊端,会让导致VM或Model中出现大量的基本业务处理、数据处理等,最后也会导致VM层变的臃肿,同时让Model层没那么纯粹,变的杂乱无序,所以还是需要进一步优化和剥离业务与数据的耦合。 3、App架构2.0+也基于上述遇到的问题,我们对App架构2.0做了优化和调整,便衍生了App2.0+分层架构,采用MVVM+分层架构模式解耦,使越来越臃肿的Controller层逐步缩小并分解解耦,业务逻辑分模块下沉。由于留留学3.1.0之后就暂停了迭代,所以只对掌上新东方App 3.1.0之后的版本开始逐步采用MVVM+分层架构模式进一步解耦。调整后的架构如下: 各层的分工如下:
对比2.0架构,我们是在ViewModel层和Model层之间插入了一个Service层,对于此次架构调整优点如下:
对比1.0架构,我们是在原有的Controller层和Service层之间插入了一个ViewModel层,架构调整前后对比如下表:
4、App架构3.0都是基于当前我参与的乐听说基于2.0+架构采用swift开发的口语评测App,留留学、新东方、乐听说App等现有架构可实现内部竖向解耦,后续开发中我们将逐步实现各个层同层内部子模块的解耦工作(横向解耦);同层之间各个子模块之间调用相互依赖,会严重影响各个模块之间的解耦,如A模块内部(甚至外部)依赖B、C模块,而B、C模块又依赖A模块,这种相互依赖、相互include的情况导致各个模块相互不能独立,严重影响编译速度和扩展性、灵活性等, 在后续版本中为了完成横向解耦我们内部将开发实现一个动态路由组件(DR,Dynamic Route),以乐听说为例进行说明,如下图: 路由实现方案简图如下: 5、模块化结合Pods参与的项目基本都是采用模块化开发,尽量实现高内聚低耦合,以掌上新东方为例,App研发模块以及对接平台众多,我们采用MVVM架构(后期采用MVVM+架构)进行模块化开发,实现工程的可扩展性以及易维护性,尽量做到高内聚低耦合。如下图: 我们将尝试采用模块化结合Pods进行管理,对于常用功能的封装,只要开放出一些简单开关配置方式,就可以实现一个功能,比如日志记录、网络请求模块、网络状态变化提示等。 将分OC和Swift语言开发两套对应的路由组件,会优先着手OC版本的研发,由于之前都忙于项目开发,近期会抽时间对代码进行完善(LLRouter),如有好的思路和见解,可以给我提issues,核心代码如下图: 6、总结App架构以及相关性能的优化不是一蹴而就的,需要不断的探索和钻研!同时架构没有真正的好坏之分,只要适用于自己的业务,就是好的架构! |
|