Clean Architecture

Clean Architecture

NowinAndroidApp 这个工程是Google 官方开发的,符合Android 官方推荐应用架构的应用(official architecture guidance )。
同时也是符合Clean Architecture 思想的架构。

分层思想

architecture

上图显示了整洁架构的示意图,其中每个同心圆层代表了软件开发中的不同层,越是靠近中心,同心圆层所代表的东西越抽象。可以这么理解,内部的圆层定义的是规则,外部的圆层定义的是实现机制。

整洁架构试图聚合这样几个特点:

  • 框架无关,即架构设计不依赖任何一个既有的开发框架,因此理论上可以使用任何框架来实践整洁架构。
  • 业务规则的可测性,即可以方便地测试业务逻辑所涉及的代码,不依赖UI、数据库或者 Web 服务等外部元素。
  • 功能实现不依赖 UI 的实现细节,比如同样一套后台系统可以用在 Web 应用,也可以用在 App 原生应用。
  • 业务逻辑不依赖数据库的实现细节,可以把数据保存在 Oracle、SQL server、Mongo、Mysql 等任意一种数据库中,同时业务逻辑不需要做任何改变。
    总结起来就是:业务逻辑对外界实现完全没有依赖,任你外面的实现细节如何改变,核心业务逻辑不需修改。

依赖规则

为了实现上面所讲的特点,只需要遵循依赖规则:只允许外部圆层的代码依赖内部圆层的代码,反之则禁止。换言之,内部同心圆层的代码不知道任何外部同心圆层的代码,比如内层的代码一律禁止引用外层声明的函数、类、变量或其他任何元素。
其实上面的规则还隐含着另一个规则:当有数据传递时,只允许外部圆层接受内部圆层的数据格式,反之则不允许。这也是为避免外部的代码逻辑影响内部的代码逻辑。

NowinAndroidApp

architecture2
Google 实现的Clean Architecture 里包含三层,分别为UI Layer、Domain layer、Data layer,其中Domain layer 是可选的。

1
2
3
4
Considering the common architectural principles mentioned in the previous section, each application should have at least two layers:  
- The UI layer that displays application data on the screen.
- The data layer that contains the business logic of your app and exposes application data.
You can add an additional layer called the domain layer to simplify and reuse the interactions between the UI and data 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 框架的人来讲,读懂代码难度很高。

Author

Lyuku

Posted on

2023-12-06

Licensed under