Android 官方 App 架构指南系列文章
随着 App 功能的不断增加,其代码实现复杂度将会呈指数级增加,具体体现在以下几个方面:
所以在 App 开发的过程中必须要有一个合适的架构指南来帮助完成上述挑战。
为了满足上面的一些需求,整体架构至少需要采用以下几个大的设计原则:
分离关注点
分离关注点是解决复杂问题的一种常见的解决方案,它是将一个计算机程序拆分为不同部分的设计原则。每一部分都有自己需要关注的焦点。从而达到将一个复杂问题拆解成多个简单问题的效果。
如 Activity
、Fragment
主要职责是绘制数据与响应用户的操作事件;于此同时,Android 系统可以根据当前系统的资源状况随时对其进行销毁。如果想要在此部分中编写业务逻辑以及耗时操作的话,将会增加其复杂度,从而导致页面开发变得难于维护(容易产生bug)。
关注分离点这种解决问题的思路并非仅适用于计算机编程问题,比如阿德勒心理学中的客体分离概念也与此大同小异。
数据驱动页面
数据是项目的核心,也是状态的最终保存者。而视图,只不过是一种能够由数据延迟计算出来的最终结果而已,它本身不存储状态。
这也是近些年响应式编程的流向的原因之一,将更多的精力放在的复杂数据的处理上,View 只需要观察数据变化并做出响应即可。
除了上面的指导原则之外,还有一个官方文档中没有提到的一些设计准则仍然非常有用:
根据以上的架构指南,一个 App 至少应该拆分为两层,UI 层及数据层:
还可以额外添加一个 Domain 层,以重用界面层的业务逻辑或是拆分业务避免大型类。整体如下:
UI Layer 主要包含了以下几个部分:
UI Layer 主要是做了一下几件事情:
UI Elements
渲染的数据(UiState
)。这部分转换主要发生在 State Holder
中。UiState
转换为对应的 UI elements
展示给用户。这部分主要发生在 Activity 或 Fragment 中,不论 Activity 和 Fragment 使用的是 View 还是 Jetpack Compose 构建的。UI elements
中的输入事件,并且根据需要做出响应。Domain Layer 主要是可以做以下及件事情:
Domain Layer 是一个可选层,可以根据自己项目的复杂情况决定是否使用。Domain Layer 主要是有不同的 UseCase
(有的框架中也称作 Interactor
)组成,其依赖关系大致如下:
Data Layer 主要做了下面两件事情:
DataSource
封装系统及三方 API;Repository
使用 DataSource
封装业务逻辑,并暴露给使用者;一个业务模块中可以包含一个或者多个 Repository
,每个 Repository
中包含零个或多个 DataSource
,DataSource
根据其来源可以分为 LocalDataSource
、RemoteDataSource
等。大致依赖关系如下:
以上几层内容中会存在大量类的初始化及注入管理问题,如果处理不好将会导致一些不必要的麻烦。这种问题有两种解决方案:
官方推荐使用 Hilt 来进行依赖管理,如果你的项目中在使用其他的依赖管理方式,并且没有遇到问题的话,那么继续使用当前的框架即可。
当然还是会有一些其他的最佳实践需要我们去遵守:
Context
、Activity
等)的依赖,减少耦合,提高可测试性;更多详细内容可查看 官方文档 。