安卓实现clean architecture的大体思路


书接上回 点击打开链接



Fernando Cejas 给出了一个实现clean architecture很好的尝试。

github:  点击打开链接

blog:  点击打开链接


总体的结构图就不贴了,链接里面都有,国内也有好多翻译这个帖子的可以参考。大概就是下面的这个结构。


domain layer         --> 逻辑业务抽象,java类
data layer           --> repository pattern,从数据源获取数据, 提供给数据使用者(presentation layer),
presentation layer--> 安卓UI(mvp),仅仅包含UI逻辑。


在我看来这个clean architecture 的实现有以下四个重/难点 :

1 repository pattern --> 使用repository patter来获取数据。


2 用RxJava/RxAndroid 来实现 UseCase(Clean Archetecture中的Interactor) 

UseCase负责完成系统的一个功能,并且获取数据,产生结果,给到ui显示。很明显,它需要处理安卓开发中UI/非UI线程切换这个问题, 而RxAndroid可以轻松实现这个异步线程的过程。



3 用MVP pattern 来实现UI和业务分离 

当然如果你不喜欢MVP一样可以用mvc/mvvm 来处理,我感觉都可以。 其实很多人都知道,要用MVP/MVC之类的来分离逻辑和UI,但是仅仅使用MVP并不能在“架构”这个层次上一劳永逸的达到可扩展可维护可测试的效果。 MVP只是处理UI的,MVP里Model的逻辑处理/数据来源并没有交代清楚,而这正是前面两点(repository pattern +UseCase )来完成的。 ( MVP不算是架构的出处:点击打开链接    原话 MVP is not an architectural pattern,我个人也觉得是这样。)



4 使用 DI framework dagger II来管理依赖关系(dependencies).  

在Fernando Cejas的demo中,如果你被各种奇怪的annotation搞晕了的话,不要紧张,这些都是和Dagger(还有ButterKnife,后面会提到)相关的。 所幸,它们俩都不是必须的,不用Dagger一样可以实现clean architecture(当然RxAndroid 也不是必须的)。RxAndroid 和 Dagger 在这里都是工具,没有RxAndroid 可以用Handler或者AsyncTask,没有Dagger可以自己new对象或者用setters方法来注入依赖。但是,我个人认为RxAndroid这个工具更加重要,RxAndroid的异步处理比Handler或者AsyncTask好用太多。Dagger只有在比较大的项目里的优势会明显。dagger的开发者在介绍dagger的时候提到,曾经,他们写代码,写着写着发现一个构造函数有几千行(大概3000),于是他们决定搞一个框架来帮他们new 对象。如果你的构造函数有3000行那你肯定会需要Dagger, 但是在一般的app(规模/功能较小)开发中Dagger的好处并不明显,甚至用起来比较麻烦,new两个对象就完了,干嘛要用一整个FrameWork。 基于这个原因,我建议如果想学习Fernando Cejas 的这个项目的话,可以在一开始忽略dagger。 顺便提一下它也用到了Butter Knife。 Butter Knife和dagger的用途差不多,区别是butter KnIFE主要管理安卓view的依赖注入,用了butter knife可以省去那些findViewById/setOnClickListener 之类的模板代码。ButterKnife的使用倒是很简单的,但是考虑到它的作用和使用方法和dagger类似,把它和dagger放在一起最后介绍。如果你看dagger实在头大(刚开始我就是这样,硬着头皮看明白的),不妨试试先看看我写的demo,没有用dagger。



基本理清思路以后,要完成掌握,最好的方法还是自己写一写demo。我尝试模仿Fernando Cejas的项目,采用repository pattern+ 基于RxAndroid的UseCase+ MVP 写了一个小demo   点击打开链接 。相对与Fernando Cejas的demo应该要好理解很多,因为没有用Dagger和butterKnife。功能和那个类似,也是浏览图片的。我写的时候,为了方便学习(拷贝),把Fernando Cejas的demo也放在这个github仓库了。


下面总结下我觉得比较重要的一些地方。


首先,AS下面module的设置:


新建一个java library module,用来做domain layer。再建一个android library module,做data layer, build.gradle 里面加入 compile project(':ajavalib'); 使其依赖于domain layer。最后,建一个phone&tablet module,做presentation layer,同样地,在build.gradle加入前面两个module作为依赖。 

注意三个module的java版本要一致,否则会报错。

android module的build.gradle 中:
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
}


java module的build.gradle 中:
//noinspection GroovyUnusedAssignment
sourceCompatibility = 1.7
//noinspection GroovyUnusedAssignment
targetCompatibility = 1.7




然后,看java module。

java module里写业务逻辑很简单,也就是这个图最里面这环,demo很简单,几乎就是一个java bean:DisplayEntry 。包含图片url,图片介绍,图片Id(假设后台负责每个DisplayEntry 有一个唯一id)。demo么,逻辑还能复杂到哪里去。

安卓实现clean architecture的大体思路_第1张图片图片by Fernando Cejas  截取自blog:  点击打开链接


你可能感兴趣的:(架构设计,安卓开发,Architecture,clean)