想象你经营一家外卖公司,公司里有三种角色:
- 老板(你):制定送餐规则,关心利润
- 餐厅经理:准备食物,保证质量
- 外卖员:把食物送到客户手中
现在,如果你是老板,你需要知道每个外卖员是骑电动车、自行车还是开车吗?需要知道他们用什么导航高德还是百度吗?
不需要! 你只关心:
- 食物准时送到(30分钟内)
- 客户满意(不洒不漏)
- 公司赚钱(成本控制)
这就是Clean架构的核心思想!让我们用这个外卖公司的例子,彻底理解Android开发中的关注点分离和依赖规则。
一、外卖公司的混乱:没有Clean架构
❌ 混乱的外卖公司(糟糕的代码结构)
问题分析:这个外卖员干了厨师、打包员、导航员、司机、收银员、文员的所有工作!
❌ 如果公司要扩张...
- 想换导航软件?要重新培训所有外卖员
- 想增加新菜品?外卖员要学新菜
- 想换支付方式?外卖员要重新学习
- 外卖员离职了?所有知识都带走了
二、专业的外卖公司:Clean架构实现
✅ 清晰的分工(关注点分离)
2.1 领域层:老板制定规则(不关心具体实现)
domain/model/Delivery.kt - 核心业务模型
domain/repository/DeliveryRepository.kt - 老板定义的接口
domain/usecase/AssignDeliveryUseCase.kt - 老板的业务逻辑
}
老板(领域层)的特点:
- 不知道外卖员开什么车(不关心具体实现)
- 不知道餐厅用什么灶具(不关心数据源)
- 只关心业务规则和利润
2.2 数据层:餐厅准备食物(具体实现)
data/repository/DeliveryRepositoryImpl.kt - 餐厅经理的实现
餐厅(数据层)的特点:
- 实现老板要求的菜品标准
- 可以使用各种厨房设备(Retrofit)
- 负责把原材料(网络数据)加工成标准菜品(领域实体)
2.3 表示层:外卖员送餐(UI展示)
外卖员(表示层)的特点:
- 可以是电动车、自行车、汽车(不同UI实现)
- 可以使用不同导航软件(不同地图SDK)
- 负责把食物(数据)展示给客户(用户)
- 与客户交互(用户输入)
三、依赖规则:为什么老板不需要知道外卖员开什么车?
3.1 依赖关系图
3.2 关键规则:依赖只能指向老板(领域层)
3.3 依赖注入:公司的HR部门
老板只需要告诉HR需要什么人,HR负责招聘
4.1 如何开始重构现有项目?
第一步:识别"超级外卖员"类
第二步:提取"老板规则"(领域层) 当然我不建议usecase 抛出异常,应该包装起来。这里只是举例。
第三步:创建"餐厅厨房"(数据层
第四步:改造"外卖员"(表示层)
5.2 常见问题解答
Q:小型项目也需要这样分层吗? A:就像小外卖店开始可能只有一个人(老板兼厨师兼外卖员),但当业务增长时,一定要提前规划分工。可以从简单三层开始。
Q:UseCase会不会太多? A:就像老板的规则文档,重要的规则才需要写成UseCase。简单的CRUD操作可以直接在Repository处理。
Q:测试真的变容易了吗? A:你可以单独测试:
- 老板的规则(UseCase测试)→ 验证业务逻辑
- 餐厅的菜品(Repository测试)→ 验证数据处理
- 外卖员的服务(UI测试)→ 验证用户交互
Q:学习成本高吗? A:就像培训外卖员需要时间,但一旦掌握,效率倍增。从一个小功能开始尝试。
5.3 外卖架构的终极好处
- 可维护性:老板换规则,不用重新培训外卖员
- 可测试性:可以单独测试老板的决策逻辑
- 可扩展性:增加新城市、新交通工具都很容易
- 团队协作:可以并行开发(有人设计规则,有人开发UI,有人对接API)
- 技术升级:换导航、换地图、换支付,都不影响核心业务
六、总结:像经营外卖公司一样写Android代码
记住这个简单的原则:
你的代码应该像一个专业的外卖公司:
-
老板(领域层):制定规则,关心业务,不关心具体实现
-
餐厅(数据层):准备标准菜品,可以用各种厨具
-
外卖员(表示层):专业配送,良好服务,灵活应变
依赖规则就是:外卖员听老板的,餐厅按老板的标准做菜,但老板不需要知道外卖员开什么车,也不需要知道餐厅用什么牌子的灶具。