Clean Architecture配合MVP使用

概念

  • 什么是Clean架构
    网上已经有很多文章已经很好的很准确的回答了这个问题。在这里也不再多做赘述。而Clean Architecture的特性有如下几点:
    • 易于测试
    • 易于维护
    • 高内聚
    • 低耦合

Clean架构层级

Clean Architecture中系统最少要分为但不局限于四层:

  • 1.实体层(Entities) -- EnterPrice Business Rules
    实体层是用来规定和封装业务规则的,即是公司的业务对象(可以简单理解为后台接口数据)。具体表现形式可以是方法,业务数据结构,或者类。
  • 2.用例(User Case) -- Application Business Rules
    用例则是用来协调和控制流入实体的数据流(Entity)和流出实体(App Model)的数据流的实现,即将后台接口数据转换为App展示所需的数据。又可以称作为交互器。
  • 3.接口适配层(Interface Adapters)
    该层就是进行数据的转换,将便于用例和实体层操作的数据结构变化成为最便于外部结构操作的数据结构。Presenter或者Controller则属于这一层。
  • 4.框架和驱动层(Frameworks and Drivers)
    这层表达的是所有的数据应该具体最终到达的地方。比如用于UI展示,比如数据库存储。我们把这些东西放在最外层,它们几乎对个系统的架构造不成什么影响。
Clean.jpg

由图可以看出,Clean的依赖规则只能由外向内进行单向依赖。外层的类,方法等不需要被内层知晓。
Clean架构中,最重要的一层是用户实例层(应用业务逻辑层),这一层中我们决定了软件有什么功能, 最终目标是什么, 以及解决了什么现实问题。

Clean+MVP

引用Clean到MVP以后,总共可以分为三个层次:
展示层
领域层
数据层


MVP+Clean.jpg
  • Domain Layer
    在Android app中,最重要的是领域层,在这一层我们会实现app业务逻辑。这一层不应该依赖任何安卓的FrameWork,它是一个纯粹的Java层。其中Use Case(Interactor)定义了每个具体业务的具体操作,细化了业务粒度。它将Presentation和Data分隔开,负责所有的业务逻辑交互,释放原本Presentation中Presenter中要做的大量逻辑处理,避免了Presenter代码臃肿。
  • Data Layer
    Data层则用来存放具体的业务数据类型,网络(本地)数据获取,以及将业务数据转换为App展示所需的数据模型,或者App需要的数据模型,例如Parcelable。
  • Presentation Layer
    MVP则表现在展示层,P层通过获取到Data层的用例数据流出,从而改变UI。

实现MVP+Clean

实现一个天气展示的Demo App。
创建Android项目。创建两个lib:data和domain。domain建议创建为java library,保证其不会受到污染。
app目录下使用MVP模式进行开发。


Demo.jpg

依赖注入(Dependency Injection)

引入Clean以后,对象的引用和传递将会变得十分繁复,当业务拓展到一定程度,到处的传参将会使代码的层次结构深层化以及降低代码可读性,为了研究一个功能的实现,有时候会需要从上层一直追溯参数到底层,同时又会加剧耦合关系,违背我们的初衷,这是一件很苦恼的事情。
这时候DI则解决了我们的问题,推荐使用Google的Dagger2,Dagger2的原理和使用方式在这里不做赘述。有需要可以看本人的前几篇博客或者自行查阅。

RxJava

推荐使用RxJava(2)做数据流转换以及异步处理。

测试

我们花了这么大代价,搞了个Clean进来,明明很简单的功能,我们却需要大量的类和代码完成,这么做的好处有啥呢(敲代码都敲的手酸没点好处能行?)。
高内聚,低耦合,易维护都是很容易理解的。那么易测试呢?因为各个模块相互独立,耦合性低,特别是对于domain层的纯java业务,剔除了安卓FW的侵入,细分了业务粒度以后,每个业务都可以在单测进行数据mock来测试。

总结

值得注意的是Clean架构能在一定程度上缓解代码耦合的问题,并规定好各个分层领域的职责,但是它并不是银弹,它并不能完全解决开发中App由于业务功能复杂化带来的不可避免的耦合,同时也会在App起初阶段引入Clean会提高代码复杂性和带来多余的累赘类。针对前者我们可以尝试引入更多的例如组件化,模块化等思想来解决,而针对后者,考虑短期性的快速开发,仅仅引入MVP就可以,考虑后期业务的复杂,提前引入也OK,仁者见仁,智者见智。

Demo地址:https://github.com/RemindPan/CleanMVPDemo
水平有限,如有问题,欢迎随时指正。

参考

Android-CleanArchitecture

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

推荐阅读更多精彩内容