App架构理解

这篇文章主要谈一下自己对App架构的理解,以及如何封装UI,如何拆分代码库。

1. 良好的App代码结构

我整理了一个App架构图,围绕这幅图来说明一下我对App整体结构的理解。
App架构图

如图所示,从上到下,上层依赖下层,下面对每一层的职责具体说明:

  • 零业务耦合基础能力层

这一层是整个App最重要的部分,一个公司的所有App都应该在这一层的基础上建立起来。他必须严格遵守一个规则:零业务耦合,不能掺杂任何业务,必须经过严格的code review才可以入代码库。
我把这一层分两部分:

  1. 优秀三方库,对于github上开源的优秀三方库,我的建议是能用则用,原因很简单,即使自己有封装能力,也很难写到优秀三方库那么好,能站在巨人的肩膀上编程,为啥还要自己造轮子。
  2. 基础base层,这一层是最能体现一个公司技术功底的,这一层的能力越强大,App的技术能力越强大。对于那种零业务耦合的基础能力,都可以放在这一层,例如:可灵活控制的UI,公司统一的网络请求库(依赖AFN做的封装),工具Categroy等等。
  • 通用基础能力层

这一层是有轻度业务耦合的,例如,针对公司统一封装固定样式的UI,公司通用的分享模板,公司通用的业务模块(比如IM),都可以放这一层。

  • App层

这一层是真正的业务代码层,各个App根据自己的业务去堆叠代码,一个App可以说百分之九十的代码量都在这一层。有时根据业务要求的特殊性,通用基础能力层不能满足业务要求,那么各个App端,会在零业务基础层的基础上去开发自己的业务base库,供自己专业。当App业务越来越多,可以对App进行模块化拆分,对模块可以进行组件化拆分,关于模块化和组件化我这里不做说明,感兴趣的可以看看我之前总结的iOS组件化、模块化

吐槽:App结构虽然简简单单几句话就概括了,看似简单,然而实际我的工作经历中,却很少有公司能做到代码库归类明确的,这个归类小细节貌似关注的人少,尤其是上图说的零业务基础能力层、通用基础能力层容易混到一起去,甚至有的还把App层的业务base也归类到基础能力层,长此以往,雪球就越过越大,一旦雪球大了,基础层的东西就不太好重构了,因为基础层的修改牵扯到公司所有App,所以我会关注,零业务耦合基础层一定要经过严格的code review,对这部分代码严格确保质量

下面通过如何拆分代码库、如何封装UI,来说明一下我对代码归类的理解。

2. 如何拆分代码仓库

我通过一个分享库的拆分来说明一下,库的拆分原则。
相信不少公司会对项目中的分享库独立拆分,比如一个公司有多个App,最初开发的那个A-App在拆分分享库的时候很可能也会把自己的业务模板也归类到分享库中。当公司的第二个B-App也需要分享库的时候,肯定会引入之前A-App封装好的分享库,这样一来,就会耦合A-App中的业务,对于B-App来说,却导入了A-App中的东西,不仅包会变大,而且增加了不必要的维护负担。那么如果A-App在拆分分享库的时候,拆分合理,那么就不会出现这种混乱的现象。

分享库如何拆分

这幅图能很好的说明一个好的分享库应该如何去拆分,ShareService针对三方提供的shareSDK做一层封装,这部分只提供分享的基础能力,不涉及任何业务耦合,图中右边baseShareSDK就可以归类在上面App架构中的零业务耦合基础层。为了快速响应业务迭代,公司可以封装一个通用分享模板放在通用基础能力层,各个App端可以有选择性的选择是否要用通用分享模板,如果App需要独立特性的分享模板,那么有了基础的分享能力层,再来开发分享模板也是很方便的,甚至是去其它App中copy分享模板过来改,也不能直接引入代码库。

这里只是拿了分享库举例,如果每个库都经过仔细思考归类,相信代码库会清晰很多

3. 如何封装UI

相信不少公司都会统一封装不少基础UI组件,使得使用方便,提升开发效率,然而依然会出现基础UI组件归类混乱的现象。比如说封装了一个统一的弹窗,这个弹窗的字号、颜色、样式布局等都是固定的,然而这部分代码却被作为归类在了基础UI库中,基础UI库在零业务耦合层。这样一来,其它App都会引入零业务耦合层,而对于其它App来说,这个弹窗不是他想要的。
那么如何封装UI会更好一些呢?

UI封装的基础理论模型:
UI封装模型

举例说明


轮播UI组件封装过程举例

多样化的轮播组件在电商App中非常常见,那么如何去对这部分代码归类封装呢,从图示可以看出,(UICollectionView + layout + NSTimer)可以实现灵活多样化样式的轮播,这部分是零业务耦合的,所以当然要放在零业务耦合层的基础UI库中。为了方便开发者使用,开发者只需传一个url列表,及相关属性去控制轮播样式就能快速实现了,所以再之前的基础上包装一层,BannerLoopView,这一层也依然是没有业务耦合的,依然可以归类在零业务耦合的基础UI库中,那么各个App端只需要根据自己的业务要求去依赖BannerLoopView实现自己独特样式的视图就行了,所以这部分应该是跟着各个App走的,归类在各个App层中,如果需要统一样式的通用轮播,可以在通用基础能力层提供一个通用轮播,各个App端可以有选择性的使用。

以上是我对App整体架构的一个肤浅的理解,记录一下做个总结,也方便大家参考和交流。

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

推荐阅读更多精彩内容