采用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结构的核心原则都是:
- 遵循关注点分离:UI层、ViewModel层、数据层职责清晰,互不越界
- 优先按业务功能聚合代码,而非按组件类型分类
- 抽取通用代码到
core或独立模块,避免重复造轮子
内容的提问来源于stack exchange,提问作者Hassan Tariq
相关产品推荐
相关产品推荐

