架构Android ...最清晰的方式是?

原文链接:http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

在过去的几个月,并具有Tuenti像@ pedro_g_s和@ flipper83(顺便说一下2坏蛋Android开发的)同事友好协商后,我决定,这是写架构Android应用的一篇文章的好时机。
它的目的是要告诉你一个小方法,我脑子里在过去的几个月里加上所有我从研究和落实学到东西。

开始

我们知道,编写高质量的软件是很难和复杂的:它不仅是满足要求的,也应该是稳健的,可维护,可测试的,并且具有足够的灵活性,以适应增长和变化。这是“干净的建筑”来了,可能是开发任何软件应用程序在使用一个不错的办法。
这个想法很简单:干净的建筑代表的一组生产出系统的做法:

  • 独立的框架.
  • 可测试的.
  • 独立的 UI架构.
  • 独立的Database架构.
  • 任何独立的外部代理.

它不是只使用4圈(你可以在图片中看到)必须的,因为他们只是示意性的,但你应该考虑到依赖关系规则:源代码的依赖只能向内指向和没有在一个小圈子里就可以知道任何关于在外圈的东西。

下面这些词汇,让你更好更方便的理解这个原则:

  • Entities: 这些是应用程序的业务对象.
  • Use Cases: 链接数据的流入和流出的实体。也被称为交互件。
  • Interface Adapters: 这组适配器从最方便的用例和实体转换格式的数据。表现者和控制器属于这里.
  • Frameworks and Drivers: 这些说明一些细节去哪里: UI, tools, frameworks, etc.

我们的方案

我将用一个简单的场景来得到的东西去入手:简单地创建一个小的应用程序,它显示出从云和,检索朋友或用户列表,点击其中任何一个,一个新的屏幕将打开显示该用户的更多细节时。

下面是一个视频,看完这个视频以后,你可以对我讨论的有一个非常清楚的了解。

width="640" height="480" src="http://www.youtube.com/embed/XSjV4sG3ni0" frameborder="0" allowfullscreen="allowfullscreen" style="box-sizing: inherit; max-width: 100%;">

Android 架构

我们的目标是通过保持业务规则,不知道任何关于外面的世界,因此关注点分离,它们可以可无任何依赖性任何外部元件测试。
为了实现这一目标,关于打破该项目,我的建议是分为3个不同的层,其中每个人都有自己的目的,会独立运作。
值得一提的是,每一层使用自己的数据模型,使这种独立性可以到达(你将在需要为了一个数据映射器来完成数据转换,要付出的代价代码中看到的,如果你不想穿越用你的模型在整个应用程序)。
下面是一个架构,以便你可以看到它的样子:

clean_architecture_android

NOTE: 我没有使用任何外部库(除了GSON解析JSON数据和JUnit,的Mockito,robolectric和espresso用于测试)。究其原因,是因为它提出的例子一点更加明确。反正不要犹豫,加入ORMS用于存储磁盘的数据或任何依赖注入的框架或任何工具或库你所熟悉的,这可能使你的编程生活更轻松。(请记住,重新制作轮子不是一个好的做法)

表现层

在这儿,在这里可以欣赏和动画相关的逻辑发生。它使用不超过一个Modal View Presenter(从现在起讲MVP),但你可以使用任何其他格式,如MVC或MVVM。我不会进入细节就可以了,但在这里Fragment和Activity只是View,里面有他们比UI逻辑没有其他逻辑,这就是所有的渲染的东西发生。
在这一层Presenter 具有干扰作用(用例)来实现在Android UI线程之外的一个新的线程工作,回来使用与将在视图中呈现的数据的回调。

clean_architecture_mvp

如果你想要一个关于Effective Android UI的例子, 是用 MVP and MVVM设计思想进行设计的, take a look at what my friend Pedro Gómez has done.

Domain 层

Business 规则: 所有的业务逻辑写在这层 考虑到Android Project, 你会看到所有的interactors (use cases) 在这里实现.
这层就是简单的java代码modul,没有其他的依赖. 外部组件 通过use interfaces 和外部业务层进行联系。

clean_architecture_domain

Data 层

应用程序所需的所有数据来自于通过UserRepository实现这一层(这个接口是domain层),使用一个存储库Patternwith的策略是,通过工厂,拿起根据某些条件不同的数据源。
例如,得到由ID的用户时,磁盘高速缓存数据源将被如果用户在缓存中已经存在选择,否则云将被查询以检索数据,并稍后将其保存到磁盘高速缓存。
这背后的所有的想法是,所述数据源是透明的客户机,如果该数据是从存储器,磁盘或云来不关心,唯一的事实是,该数据将到达,将被得到。

clean_architecture_data

NOTE: 在代码方面我已经实现使用文件系统和机器人偏好一个非常简单的和原始的磁盘高速缓存,这是用于学习目的。再次请记住,永远不要重复造轮子

Error 处理

这始终是一个讨论的话题,如果你在这里分享您的解决方案可能是巨大的。
我的策略是利用Callback,因而,如果事情在例如数据储存库发生,回调有2种方法onResponse()和onError的()。最后一个封装在称为“ErrorBundle”包装类例外:这种方法带来了一些困难,因为有回调的链一前一后,直到错误进入到要呈现的表示层。代码的可读性可能有点损害。
在另一边,我可以实现抛出事件,如果一些错误发生,但这种解决方案是像使用GOTO事件总线系统,而且,在我看来,有时你可能会丢失,当你订购了多个事件如果你不仔细控制。

测试

关于测试,根据每层提出了几种解决方案。

  • Presentation Layer: 使用android工具和  espresso for 集成测试和功能性测试.
  • Domain Layer: JUnit + mockito 使用单元测试.
  • Data Layer: Robolectric(因为这一层有Android的依赖),加上加的JUnit +Mockito集成和单元测试.

代码是什么样子的

你肯定在想代码在哪里对不对?这是Github的链接

https://github.com/android10/Android-CleanArchitecture:

  • presentation: android module表现层.
  • domain:java module没有任何依赖.
  • data: android module 表示从哪里获取数据.
  • data-test: Data层的测试. 由于有一些限制当用 Robolectric 测试的时候,所以我不得不建立一个新层。

结果

就像BOb叔说的, “架构是架构的意图,而不是你的框架” 我非常同意这点. 当然也有很多做的事情(不同的实现)不同的方式,我敢肯定你(像我)每天都要面对很多挑战,但通过使用这种技术,您确保您的应用程序将是:

  • Easy to maintain.
  • Easy to test.
  • Very cohesive.
  • Decoupled.

作为一个结论我强烈建议你给它一个尝试,看看和分享您的成果和经验,以及工作得更好,你已经找到其他的办法:我们知道,持续改进始终是一个很好的和积极的事情。
我希望你已经发现这篇文章有用,并一如既往,任何反馈是非常欢迎的。

Source code

  1. Clean architecture github repository – master branch
  2. Clean architecture github repository – releases
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值