Clean Architecture(整洁架构) 是一种以业务逻辑为核心的软件架构设计模式,由 Robert C. Martin(Uncle Bob)提出。其核心目标是隔离业务逻辑与技术实现细节,构建一个高度可维护、可测试、可扩展的系统。它的设计灵感来源于六边形架构(Hexagonal Architecture)、洋葱架构(Onion Architecture)和分层架构思想。
核心特征与设计思想
-
分层依赖规则
- 层级从内向外:业务核心在最内层,技术细节在最外层。
- 依赖单向流动:外层可依赖内层,但内层绝不依赖外层(通过依赖倒置原则实现)。
⬅️ 依赖方向: 框架层(数据库、UI、网络) ↑ 接口适配层(Presenter/Gateway) ↑ 用例层(应用逻辑) ↑ 实体层(核心业务模型与规则) -
四大核心层级
层级 职责 示例 实体层 (Entities) 封装企业级核心业务模型与规则,与技术框架无关 User、Order、验证逻辑用例层 (Use Cases) 实现具体业务场景的逻辑流程(如“用户登录”“订单支付”) LoginUseCase、PaymentUseCase接口适配层 (Adapters) 转换外部系统(如API、数据库)与核心层的数据格式和协议 REST控制器、数据库Repository、ViewModel 框架层 (Frameworks) 实现具体的UI、数据库、网络等技术细节 Spring Boot、Retrofit、Room -
核心原则
- 独立性:实体层和用例层不依赖任何框架、UI或数据库代码(如不导入Android SDK或Spring包)。
- 可替换性:外围技术组件(如数据库、UI框架)可随意更换,不影响核心逻辑。
- 可测试性:核心业务逻辑可直接单元测试,无需启动应用或模拟外部依赖。
与MVC/MVVM的对比
| 架构模式 | 核心问题 | Clean Architecture的优势 |
|---|---|---|
| MVC | 业务逻辑易与UI层耦合,难以独立测试 | 严格分离业务与技术层,UI变更不影响核心逻辑 |
| MVVM | ViewModel可能包含技术细节依赖 | 用例层纯业务逻辑,ViewModel仅负责数据适配与状态管理 |
| 分层架构 | 层间依赖易混乱(如数据库代码渗透到业务层) | 依赖倒置原则强制隔离层级,依赖方向明确 |
实际应用示例
// 实体层:纯业务模型
data class User(val id: String, val name: String, val balance: Double)
// 用例层:业务逻辑(不依赖Android或Retrofit)
class TransferUseCase(private val repository: AccountRepository) {
fun execute(from: User, to: User, amount: Double) {
if (from.balance >= amount) {
repository.updateBalance(from.id, from.balance - amount)
repository.updateBalance(to.id, to.balance + amount)
} else throw InsufficientBalanceException()
}
}
// 适配层:数据转换(依赖用例层,但不含业务逻辑)
class AccountViewModel(private val transferUseCase: TransferUseCase) : ViewModel() {
fun transfer(from: User, to: User, amount: Double) {
try {
transferUseCase.execute(from, to, amount)
_uiState.value = Success
} catch (e: InsufficientBalanceException) {
_uiState.value = Error("余额不足")
}
}
}
为什么选择Clean Architecture?
- 长期价值:适合业务复杂且频繁变更的系统(如金融、电商),减少技术债务。
- 跨平台复用:核心业务代码可复用于Android、iOS、Web等多个平台。
- 团队协作:领域专家与技术专家可并行开发不同层级。
总结
Clean Architecture 通过分层解耦和依赖倒置,将系统划分为稳定核心(业务)与易变外围(技术实现)。它并非银弹,但能为中大型项目提供清晰的代码边界和可持续的演进能力。