Android组件化(业务拆分)

前言

本文会从业务的角度,给大家讲讲为什么要拆分App业务,如何拆分,以及优点等等。

为什么要组件化、模块化

项目存在问题

代码量大,耦合严重

编译慢,效率低

业务开发分工不明确,开发人员要关心非业务的代码

改代码时,可能会影响其他业务,牵一发动全身

优点

架构更清晰,解耦

加快编译速度

业务分工明确,开发人员仅专注与自己的业务

提高开发效率

组件、业务独立更新版本,可回滚,持续集成

组件化与模块化

组件、模块,中文字面意思相近,在英文上都可以翻译为"Module",加上Android Studio上,library被称为"Module",这就不难解释为什么我们谈到“组件化”、“模块化”,两者之间的区别相当的模糊。

组件

App工程上所说的组件,应该翻译为“Component”,意思是组件、部件、元件。在电子电路中,电子元件是电子电路中的基本元素。在App工程上,组件是构成业务或者功能模块的基本单位。原则上,组件与组件之间互不依赖。

组件,components

例如,图片上传功能,应该叫“图片上传组件”,而不是“图片上传模块”。因为图片上传从功能、业务上,已经不能往下拆了。图片上传可能使用七牛sdk,或者又拍云sdk。无论图片上传组件用七牛sdk,还是又拍云sdk,都不会影响这个组件的功能,因此组件具有可替换性;同时,图片上传组件可以被多个业务使用,因此组件具有可复用性。由于sdk只是技术细节,它跟业务并没有关系。在业务架构图上,也不会出现“xx sdk”,因此我们说图片上传组件不能拆分了

同理,日志功能,叫“日志组件”,不叫“日志模块”。

模块

模块翻译为“Module”,字面意思。模块由多个组件构成,它可以实现一个独立的功能,甚至业务。

模块,module

例如,大众点评的美食功能,是一个业务,可以叫“美食模块”,习惯上叫“美食业务”。它可以拆分更小的模块:搜索、签到、评论等。

两者关系

从上面的阐述可以得出,一个工程,由多个模块组成,每个模块由多个组件构成。但很多时候,两者界限还是相当模糊。例如“日志组件”称为“日志模块”,也没有违和感。

组件从业务角度上不能继续拆分,可替换,可复用

模块的定义比较笼统,可以是一个Business业务,可以是技术架构中一个业务,也可以是几个组件构成的小功能。

无论是组件化还是模块化,目标都是把臃肿的工程,拆分为更小的部分,解耦各种复杂的逻辑,便于代码管理。

业务划分

一个产品的业务,其实是在规划产品功能,或者做产品原型时,已经定好了(如果连产品或者老板都没这概念的话,我们还是算了);如果后端牛逼的话,他们也会做业务划分,每个业务部署到独立的容器、虚拟机、服务器。所以,我们做业务划分时,可以咨询后端,也可以咨询产品经理。

例如,大众点评,首页已经展示了好多个业务:美食、电影、酒店、休闲娱乐、外卖、机票/火车票.....这种多业务APP,通常会把业务尽量展示在首页,这种APP大的业务很好划分。美食、电影这类看起来完全不同的业务,笔者称为Business业务

大众点评-首页

但并不是这样划分就OK了,好像大众点评这种超级APP,每个Business业务都能分成很多基础业务。例如,美食业务,可以搜索商铺、预约、使用优惠券、点评、签到等;同时,电影业务也有搜索、优惠券、点评等。所以,搜索商铺、优惠券、点评这种基础业务,可以独立出来,被多个Business业务使用

业务架构

组件与业务

上文提过,多个组件构成一个模块,当模块相当于业务时,就是说该业务由多个组件组合而成。

还是拿大众点评做例子,点评基础业务,发布点评需要上传图片、网络提交、记录本地日志等,那么需要调用上传图片组件、网络组件、日志组件等

点评业务-组件

不仅仅点评业务调用,所有业务都会调用这些组件。于是,业务架构如下:

Business业务 -> 基础业务 -> 各种组件

业务-组件架构

业务与业务

情景

场景:在大众点评订了酒店,入住之后,打开该酒店详情页,大众在“推荐列表”给你推荐若干大保健......

(不要问笔者大保健是什么,笔者什么都不知道)

情况1:

前端H(负责酒店业务H):后端D,麻烦给酒店业务单独做个推荐大保健的api。

后端D(负责大保健业务D):大保健业务有api D,你调用api D吧

前端在酒店业务Module,写了调用api D,功能上线。

=============================================================

过了一段时间,大保健业务做了调整,数据变动、改域名等。

后端D:前端H,api调整了,麻烦调用api D改为调用api D1。

前端H:现在好忙,我加班搞吧。

于是前端H加班改代码,还要做单元测试等一系列工作。

=============================================================

又过了一段时间,大保健业务再次数据变动。

后端D:前端H,api D1改成api D2。

前端H:怎么又改.....

本来前端H是做酒店业务的,为了大保健的推荐列表,不得不因为大保健业务调整,而加班加点。再延伸一下,如果酒店业务H还需要调用电影院列表、美食列表.....每个业务的改动,前端H就呵呵了。

情景2:

当然了,要前端不改动,后端保持原来api D也可以的。只不过,会引发下面对话:

前端H:后端D,不过你一直提供api D给其他业务使用,当数据调整时,api D做好兼容我们就不用改了。

后端D:你傻逼啊,兼容多麻烦,我们很忙的,你们不就改一点代码吗?我们还要#&^@&#$"@*#......

维护兼容/对外开放接口确实是一种解决方法,只不过会加重后端开发、运维的工作量,长期来看并不科学。

情景3:

如果在前端业务与业务在独立的情况下,也可以相互调用,那就简单多了:

前端H:前端D,麻烦写一个接口,让其他前端业务可以请求大保健推荐列表。

前端D(负责大保健业务D),没问题,你调用D类getHealthCare(),就会请求大保健推荐列表,并返回你要的数据了。

=============================================================

过了段时间,大保健数据变动。前端D在前端大保健业务D做了api D->api D1改动,并对D类getHealthCare()做了数据兼容,前端H不需要额外改代码。

从上面3个情景看,情景3是最优的做法,前端H并不需要跟后端D对接,大保健业务D改动,后端D不需要通知前端H,只需要跟前端D对接即可。而前端的兼容工作,比后端兼容工作要简单得多。

业务之间跳转

业务之间跳转,这个话题老生常谈了。无论是Android、iOS,都是URL Scheme跳转这种解决方案。原因是url不需要任何依赖,而且可传递参数。

业务数据交互

无论前端、后端,业务之间数据交互,都是很重要的环节,选用何种合适的方案,就考验架构师的水平了。

未做业务拆分时,直接调用其他业务的代码即可:

数据直接交互,强耦合

但业务拆分后,就不能直接调用代码了。两个业务相互独立,代码互不依赖,必须用某种协议(常用json)用数据。

间接交互,服务中心做数据中转

如果其他业务需要获取大保健数据,首先大保健业务要注册大保健服务到服务中心,其他业务才可以通过协议调用这个服务。

业务相互调用-服务中心

如何注册服务,Android和iOS都有不同的做法,而且方法不止一种。本文仅提供思路,技术细节,会在之后的文章阐述。

其实组件与组件之间,也存在相互调用的情况,可参考这种做法。

P.S.大众点评没有“大保健”业务,只有“足疗按摩”业务。笔者为渲染气氛虚拟一个大保健出来,希望大众的朋友谅解。

小结

组件化、拆分业务后:

单一职责:开发人员专注于自己的业务

依赖倒置:上层业务依赖下层业务,业务依赖组件,业务之间、组件之间不相互依赖

接口隔离:业务之间调用数据,通过统一的协议与服务中心交互,不调用业务实际代码

代码质量与规范程度明显提高,高内聚、低耦合。业务职责分明,单元测试也更好写。如果业务拆分做得好,可以一个业务一个单独工程编译,不仅大幅提高编译速度,而且业务代码还可以回滚、版本发布等。

一切为了更清晰的架构、更干净的代码^_^。

注:非原创

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

推荐阅读更多精彩内容

  • 前言 最近事情比较多,2个月没写文章了。看笔者圣诞节还在写技术文章,就知道程序猿的生活有多惨淡。 上几篇单元测试的...
    键盘男阅读 13,981评论 29 111
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • 前言: 本文转自前同事casa的博文,这篇文章是基于runtime实现的iOS组件化方案,其实iOS组件化方案基本...
    monkey01阅读 1,628评论 1 2
  • 有些事情不是不想讲出来是因为害怕舌根子嚼的噼里啪啦响
    波力海苔呀阅读 176评论 0 0
  • 昨日,与朋友一起,带着孩子闲逛。一家商场开业庆典,在门口进行产品宣传和促销,又唱又跳,还有主持人派发礼品。其实,我...
    123深呼吸阅读 530评论 3 7