iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程

1.0 什么是模块化

很多关于重构设计模式的介绍中,经常提到的几个词语是复用解耦

模块化之所以被提出,也更多是为了解决这几个问题。

复用可以减少重复造轮子的情况,很容易理解的是,我们经常使用的github上的第三方框架,比如,AFNetworking等,有了这些组件,我们就不需要再写一遍了。

解耦可以减少类或文件之间的关联,如果一个类引用了其他10个类,那么当我们看到这个类或修改这个类的时候,我们同时需要关注另外10个类,了解它们与本类的关联情况。如果你的类,没有与其他任何类关联,你在阅读代码的时候,完全可以忘记其他代码的存在,只看这一个文件就够了。

我们可以看出,低耦合的系统,能够将无数简单的模块,组成复杂的工程。复用很明显能够提升工作效率,解放生产力。

这样一来,你的系统是简单的,清晰的,当你重构或修改系统的时候,可以不必有任何顾虑。

而实现低耦合可复用的手段,往往就称为模块化。

在实际开发中,模块往往被定义为能够独立实现单一任务的代码单元。

从代码角度讲,一个功能,一个文件,一个类,甚至一个函数,都可以成为一个模块。

除了上述优点之外,模块化之后,每个模块可以单独开发,单独测试,也更容易做内部代码的权限管理。

上面已经说过,整个系统都是由不同的模块构成。那么问题的难点就在于,如何定义模块的边界。

2.0 模块的划分及通信

在客户端实际开发中,根据模块的使用方式,可以大致分为2种。

第一种,提供非常基础功能,会频繁地被其他模块引用,其他模块可以直接引入这些模块的api进行调用。比如:网络模块,常用工具类,布局,图片,其他依赖的第三方框架。

第二种,提供有价值的产品功能,更多的是页面的展示接口,它从来不被别的模块直接引用,更多地通过异步的方式来进行通信(使用路由)。比如:会员模块,付费模块,短视频模块等等。

另外,除了这两种模块之外,还有一种模块既会被其他模块频繁地引用,也会提供页面的展示接口。比如:登陆,收藏,关注等功能。这种模块需要为其他模块提供数据及修改接口,有时候还需要展示UI。

其实对于第三种模块来说,可以根据数据和展示,拆分为2个模块:一个模块用于对外部提供数据,可以被其他模块直接引用;另一个模块用于通过异步的方式进行页面的展示。

3.0 iOS模块化的实践方案

3.1 模块化工作流程

iOS中的模块化,不同的模块是通过动态库/静态库的方式引入到主工程中的。

动态库和静态库的区别无需多说,可根据需要自行选择。

cocoapods是一个非常优秀的模块管理工具。

我们使用cocoapods来管理不同的模块时,代码可以以3种存在形式出现,分别是:源码,静态库,动态库。

所以在模块化之前,我们需要提前进行的工作有:

  • 安装cocoapods
  • 建立pod私有库,用来存储我们所有模块的podspec文件

我们创建一个新模块工作流应该是这样的:

  • 建立一个新工程,修改必要设置
  • 建立Podfile文件,添加依赖,然后执行pod install安装依赖
  • 开始开发工作,开发过程中,你可能需要建立一个Demo工程或者Demo target用于在开发过程中,测试你的静态库api
  • 编写单元测试
  • 测试通过后,你需要将代码提交到git中,并且打一个tag
  • 编写podspec文件
  • 检查podspec文件的正确性
  • 使用pod repo push命令将podspec文件推到pod私有库中
  • 如果其他模块想要引用这个模块,按照pod标准使用方式安装依赖即可

3.2 可能遇到的问题

在上述流程中,可能遇到的问题有:

  1. podspec文件怎么写?
  2. podspec文件提交和更新需要怎么做?
  3. Podfile文件怎么写?
  4. 如果我开发的模块依赖了我们之前开发的其他的模块该怎么处理?如果我依赖的模块也需要修改,应该怎样处理?
  5. 产生循环依赖怎么办?A依赖B,B又依赖A。
  6. 怎样处理图片等资源文件
  7. 如何进行OC与swift的混编
  8. framework如何编译,如何减肥,如何合并

4.0 流程自动化

我们可以看到,创建模块化的过程流程比较多,涉及的技术也很多:cocoapods,Xcode设置,资源管理,Swift&OC编译管理,静态库接入方式等等。

其中很多技术内容其实并不常用,在开发过程中,我们遇到问题后,即时查阅文档解决,过了一段时间,遇到同样的问题可能还需要再查阅。

而且,不同的人在实践过程中,可能会遇到相同的问题,每个人都需要解决一次。

流程过多,还容易因为误操作而产生错误,这种问题很难解决,往往遇到就会花费大量时间处理。

我们再回头看一下工作流程,其实很多工作都是固定不变的,每次创建新模块都是重复同样的过程,因此这部分流程我们可以通过自动化脚本自动完成。

我们哪些工作可以使用脚本完成呢?

  1. 创建模块工程Demo工程,自动设置里面的Build Setting选项,并使用.xcworkspace来管理
  2. 部分内容根据用户输入,自动创建podspec文件,并检查其正确性
  3. 根据用户输入的依赖模块,自动创建不同工程的Podfile文件,并使用pod install安装依赖
  4. 管理模块目录结构,脚本能够方便的对模块进行增删改查
  5. 如果某个模块依赖的是我们自己开发的其他模块,那么被依赖的模块会以local path的方式引入到工程中,这样我们可以在当前模块的工程中直接修改依赖模块的代码并进行测试,不需要打开多个工程。开发完成后,分别进行提交。
  6. 自动安装脚本所依赖的软件和环境
  7. 记录已经push到私有库的模块,方便处理多依赖模块的开发
  8. 开发完成后,使用脚本一键推送到pod库中
  9. 对已经在pod库中的模块进行二次开发时,可以一键拉取工程并安装所有依赖

完成上面的功能后,我们可以发现:

  1. 对于全新的模块,我们可以使用脚本,一键创建工程,然后就可以进行业务开发了,开发之后,只需要再执行一个脚本,就能够推送到私有库中,不需要了解cocoapods和Xcode设置的任何细节。
  2. 对于二次开发的模块,我们同样适用脚本,一键拉取工程及所有依赖,仅仅关注业务开发即可。开发完成后,同样使用脚本一键推送到私有库中。

--完--

  1. iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程
  2. iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容