You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

采用MVVM模式的App理想包/文件夹结构及大型项目优化方案问询

MVVM模式下App的理想包结构及大型项目优化方案

谷歌的官方态度

谷歌在Jetpack架构指南中并没有强制规定单一的“标准结构”,但明确推荐按业务功能/特性组织代码的原则,而非按组件类型(如把所有Fragment、Activity集中在根目录)。像Flower这类演示应用的简化结构,是为了聚焦核心架构逻辑,仅适用于小型项目,并非生产级大型应用的最佳实践。

中小型应用的理想结构(MVVM基础版)

对于功能较少的应用,可以采用“按组件类型分层+轻度功能分组”的结构,兼顾清晰性和简洁性:

com.example.myapp
├── ui/                  # 所有UI组件,按页面分组
│   ├── home/            # 首页相关Fragment/Activity
│   ├── profile/         # 个人中心相关UI
│   └── base/            # 基础BaseActivity/BaseFragment
├── viewmodel/           # 对应UI的ViewModel
├── model/               # 数据层,含Repository、数据源
│   ├── remote/          # 网络请求
│   ├── local/           # 本地存储
│   └── entities/        # 数据实体类
├── di/                  # 依赖注入配置
└── utils/               # 全局工具类、扩展函数

大型应用的最优方案:按垂直业务模块划分

当应用包含数十个Activity/Fragment时,按组件类型聚合的结构会导致代码分散、维护困难,此时按垂直业务模块划分是更优选择。每个模块包含自身完整的MVVM组件,结构示例如下:

com.example.myapp
├── core/                # 全局通用核心模块
│   ├── di/              # 全局依赖注入配置
│   ├── ui/              # 基础UI组件、通用自定义View
│   ├── model/           # 全局通用数据实体、基础Repository
│   └── utils/           # 全局工具类、扩展函数、常量
├── features/            # 业务功能模块容器
│   ├── home/            # 首页业务模块
│   │   ├── ui/          # 首页的Fragment/Activity、适配器、自定义View
│   │   ├── viewmodel/   # 首页专属ViewModel
│   │   ├── model/       # 首页数据实体、Repository、本地/远程数据源
│   │   └── di/          # 首页模块的依赖注入子组件
│   ├── order/           # 订单管理模块
│   │   ├── ui/
│   │   ├── viewmodel/
│   │   ├── model/
│   │   └── di/
│   └── checkout/        # 结算支付模块
│       ├── ui/
│       ├── viewmodel/
│       ├── model/
│       └── di/
└── data/                # 可选:跨模块共享的全局数据层(如统一的网络服务、数据库)
    ├── remote/
    ├── local/
    └── repository/

这种结构的核心优势:

  • 高内聚低耦合:每个业务模块的所有相关代码(UI、ViewModel、数据层)集中在一起,修改功能时无需跨多个包查找文件,降低维护成本
  • 可扩展性强:新增业务模块只需在features下新建子包,不会影响现有代码结构
  • 团队协作友好:不同成员可独立负责不同模块,减少代码冲突
  • 支持模块化演进:后续若需拆分为动态功能模块(Dynamic Feature Module),该结构可无缝过渡

关键原则总结

无论项目规模如何,MVVM结构的核心原则都是:

  1. 遵循关注点分离:UI层、ViewModel层、数据层职责清晰,互不越界
  2. 优先按业务功能聚合代码,而非按组件类型分类
  3. 抽取通用代码到core或独立模块,避免重复造轮子

内容的提问来源于stack exchange,提问作者Hassan Tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:45:29