Clean Architecture
Clean Architecture
NowinAndroidApp 这个工程是Google 官方开发的,符合Android 官方推荐应用架构的应用(official architecture guidance )。
同时也是符合Clean Architecture 思想的架构。
分层思想
上图显示了整洁架构的示意图,其中每个同心圆层代表了软件开发中的不同层,越是靠近中心,同心圆层所代表的东西越抽象。可以这么理解,内部的圆层定义的是规则,外部的圆层定义的是实现机制。
整洁架构试图聚合这样几个特点:
- 框架无关,即架构设计不依赖任何一个既有的开发框架,因此理论上可以使用任何框架来实践整洁架构。
- 业务规则的可测性,即可以方便地测试业务逻辑所涉及的代码,不依赖UI、数据库或者 Web 服务等外部元素。
- 功能实现不依赖 UI 的实现细节,比如同样一套后台系统可以用在 Web 应用,也可以用在 App 原生应用。
- 业务逻辑不依赖数据库的实现细节,可以把数据保存在 Oracle、SQL server、Mongo、Mysql 等任意一种数据库中,同时业务逻辑不需要做任何改变。
总结起来就是:业务逻辑对外界实现完全没有依赖,任你外面的实现细节如何改变,核心业务逻辑不需修改。
依赖规则
为了实现上面所讲的特点,只需要遵循依赖规则:只允许外部圆层的代码依赖内部圆层的代码,反之则禁止。换言之,内部同心圆层的代码不知道任何外部同心圆层的代码,比如内层的代码一律禁止引用外层声明的函数、类、变量或其他任何元素。
其实上面的规则还隐含着另一个规则:当有数据传递时,只允许外部圆层接受内部圆层的数据格式,反之则不允许。这也是为避免外部的代码逻辑影响内部的代码逻辑。
NowinAndroidApp
Google 实现的Clean Architecture 里包含三层,分别为UI Layer、Domain layer、Data layer,其中Domain layer 是可选的。
1 | Considering the common architectural principles mentioned in the previous section, each application should have at least two layers: |
UI Layer
UI Layer 用于展示页面。由于NowinAndroidApp 是采用Jetpack Compose 实现的,以首页为例,UI Layer 主要包括MainActivity、NiaApp 和NiaAppState 类。
Data layer
Domain layer
总结
Benefits of Architecture
回过头来看下这样架构的好处,也就是Clean Architecture的优点(以下翻译自Android 官网):
- 增加可维护性、质量和整体的稳定性
- 项目规模扩展的时候能很好的支持,并且保持在大团队开发时代码冲突最小化
- 架构一致性可以保证新加入团队的成员可以快速适应项目
- 便于测试
- 便于调试定位问题
个人看法
总体上来看Clean Architecture 的思想还是挺好理解的,简单来说就是实现分层,并且层与层之间单向依赖。举个不太恰当的例子,web由以前的jsp 变成现在的前端node项目、后端微服务、再加上缓存服务和数据库服务,也可以算是一种意义上的Clean Architecture。
不过Android 官方推荐的实现方式还是有一定缺陷的。首先,引入过多依赖,代码结构变得复杂。如果只是简单项目的话是否有必要引入?其次,dagger + hilt 的实现会在编译时生成大量代码,实际编写的代码的可读性较差。特别是对于不熟悉dagger 和hitl 框架的人来讲,读懂代码难度很高。
Clean Architecture