Android clean architecting

更多 Android 博文请关注我的博客 http://xuyushi.github.io

本文为翻译,在原文的基础上略有改动

http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

Getting Started

当你写一个软件时不仅要满足需求,还要使得系统健壮、易于测试、方便修改。这样才能满足需求的变化。写满足这些条件的程序通常是很难很复杂的。这就是为什么提出 “the clean architecture”,这可能是在开发任何应用程序时都是一个不错的办法


理念很简单。clean 架构 代表了一组拥有如下特点的实践

  • 框架独立
  • 容易测试
  • UI独立
  • 数据库独立
  • 不依赖任何中介


实际情况可能和上图不一致,图片只是示意,不是一定要分为4层,我们需要考虑的是依赖规则依赖关系只能是外层依赖内层,内层不应该知道外层的存在

为了更方便的理解,下面是一些名词解释

  • Entities: APP 的业务逻辑
  • Use Cases:这些用例从Entities中流入流出,也被称作Interactors
  • Interface Adapters:这些 adapter 将data 转换为方便 Use Cases使用的结构。Presenters 和 Controllers 都属于这里
  • Frameworks and Drivers: 所有 UI 细节、工具、框架

Our Scenario

...(作者例子的视频展示)

Android Architecture

我们的目标是分离业务逻辑,使得业务逻辑对外部不感知。这样我们在外部可以独立对业务代码进行测试

为了达成这个目标,我们的目的是将项目分为三层,每层都有自己的目的并且独立于其它层

值得一提的是为了达到每层都独立,每一层都有自己的数据结构。(在代码可以看到通过 mapper来进行层与层之间的数据变换)

框架大致是这样

NOTE: 我没有使用任何的第三方库(除了使用 gson 来解析数据,junit,mockito,robolectric 和 espresso 来测试),不使用第三库的原因是我希望例子能更清晰。不用犹豫使用 ORMs做存储,或者依赖注入框架,或者任何使你更方便的的工具(记住重复造轮子并不好)。

Presentation Layer

view 和动画的逻辑的地方。使用了 MVP 模式(可以看这篇 http://xuyushi.github.io/2016/02/28/MVP/ ),你也可以使用 MVC,MVVM。我不会深入讲解这部分。fragments、activities都只是 view,没用业务逻辑, ,渲染的逻辑也在这

其中的Presenters是由** interactors (use cases)**组成的,这些 use cases 在 UI 线程之外的其他线程做一些工作,并且在回调中更新 view

Domain Layer

所有的业务逻辑都在这一层,对于 Android 工程,所有的interactors (use cases)的实现都在这一层。

这一层是纯 java 的,没用 android 的相关依赖,所有的外部交互都是通过接口实现的

Data Layer

所有应用需要的数据都通过这一层的UserRepository(domain 层定义接口的实现)获取,这里使用了 Repository Pattern 模式,通过 factory 选取不同的 data 的数据源

举个栗子,当我们需要获取一个 userID,如果disk 缓存有则使用他,若没有,则获取数据,并把数据保存在 disk 缓存中

核心的思想是 data 的获取对客户端透明,客户端无需关注数据的来源,内存,disk,或者网络。客户端只需要获取数据

NOTE:同上个 NOTE,数据库的实现比较简单,可以使用第三方库。 不要重复造轮子

Error Handling

这一直是一个值得讨论的话题,我在这里分享一下我的解决方案。我的策略是使用回调,举个栗子,如果在repository产生事件之后,callback中包含两个方法,onResponse()onError(),后者把错误封装在 ErrorBundle 类里:这样带来一个问题,因为错误通过层层传递导致代码可读性变差。

另一方面,我们可以实现一个 event bus 系统来抛出错误,这种解决方法类似于 GOTO 语句。在我的观点中,当你订阅了多个事件是你很容易弄混

Testing

对于测试,对于每层我都给出了不同的解决方案

  • Presentation Layer: 使用 android instrumentatioespresso 做集成 和功能测试
  • Domain Layer: 使用JUnitmockito做单元测试
  • Data Layer: 使用Robolectric(因为这层有 Android 的依赖)和 junit、mockito做集成和单元测试。

Show me the code

https://github.com/android10/Android-CleanArchitecture
通过 module 来表示不同的层

  • presentation: Android Module
  • domain: 没有 依赖Android的 java Module
  • data: Android Module,获取数据的地方
  • data-test: Data 的测试。

Conclusion

就像Bob大叔所说的,『Architecture is About Intent, not Frameworks』。

确保的应用满足以下几点:

  • 易维护 Easy to maintain
  • 易测试 Easy to test.
  • 高聚合Very cohesive.
  • 低耦合 Decoupled.

**我现在根据这个架构为模板做一个开源 APP,完成以后会开源,详见请见 http://xuyushi.github.io/tags/从零开始/ **

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

推荐阅读更多精彩内容