项目需求分析与架构设计

一、需求清单

1.1 功能需求模块

基于任务管理类应用的核心场景,结合行业最佳实践,本项目需实现四大功能模块,覆盖任务全生命周期管理:

  • 任务列表模块
    核心功能包括任务的创建(新增)、读取(列表展示)、更新(状态修改)和删除(移除)操作,支持本地与远程状态实时同步。列表需按优先级(高/中/低)或截止日期排序,可通过滑动手势快速标记完成状态,并提供批量操作入口(如批量删除已完成任务)。参考 TODO 应用经典设计,列表项应包含任务标题、截止日期、优先级标签及完成状态标识[24][45]。

  • 任务详情模块
    点击列表项进入详情页,展示任务完整信息:标题、描述、创建时间、截止日期、优先级、关联标签及历史修改记录。支持从详情页直接跳转至编辑页,并提供返回列表时的状态刷新机制,确保数据一致性。

  • 任务编辑模块
    提供统一界面处理任务创建与修改,包含表单验证逻辑(如标题非空、截止日期需晚于当前时间)。编辑页需支持富文本描述(基础格式化)、优先级选择器(下拉菜单)及标签管理(多选),并通过防抖处理避免重复提交——参考 GitHub 仓库搜索功能的输入节流策略,在用户停止输入 500ms 后触发本地存储操作[46]。

  • 数据统计模块
    基于任务数据生成可视化统计,包括:

    • 完成率趋势图(近 7 天/30 天)
    • 优先级分布饼图(高/中/低占比)
    • 延期任务预警列表
      统计数据需支持离线计算,确保无网络时仍可展示历史统计结果。
1.2 技术指标要求

为保障用户体验与兼容性,需满足以下硬性指标:

  • 系统兼容性:支持 Android API 24(Android 7.0)及以上版本,覆盖 95%以上活跃设备
  • 性能要求:冷启动时间 < 3 秒(基于 Android Vitals 标准,在中端机型(如骁龙 660)上测试)
  • 响应速度:列表滑动帧率稳定 60fps,编辑页表单提交响应时间 < 300ms
  • 状态恢复:支持配置变更(如屏幕旋转、深色模式切换)及进程重建后的状态自动还原,数据丢失率为 0
  • 输入处理:搜索/筛选功能需实现输入节流(用户停止输入 800ms 后触发请求),避免无效网络调用[46]

核心需求提炼:以任务 CRUD 为基础,通过状态同步确保数据一致性,以统计模块提升产品价值,同时通过严格的技术指标保障流畅体验。功能设计参考 todo-mvp 项目的"列表-详情-编辑-统计"经典四页架构,技术指标对齐 Android 官方性能标准[45]。

二、架构设计

2.1 整体架构思想

本项目采用分层架构设计,融合 Clean Architecture 的领域驱动思想与 MVVM 的数据驱动特性,实现关注点分离与高内聚低耦合。核心原则包括:

  • 单向数据流:数据从数据层流向 ViewModel,再驱动 UI 更新,避免反向依赖
  • 依赖规则:内层不依赖外层(如领域层不引用 Android SDK,数据层不感知 UI 实现)
  • 可测试性:每层通过接口定义边界,支持独立单元测试(如 ViewModel 可脱离 UI 层测试)

架构层次自顶向下分为:UI 层(表现层)、ViewModel 层(业务逻辑层)、领域层(用例层)、数据层(存储与访问层),整体遵循"单 Activity + 多 Compose 页面"架构模式,通过 Navigation Compose 实现页面路由[9][47]。

2.2 架构图(Mermaid)
plaintext
复制代码
graph TD
    subgraph "UI 层"
        A[Compose 页面] -->|触发用户操作| B[UI 状态处理器]
        B -->|调用| C[ViewModel]
        C -->|暴露 StateFlow| B
        B -->|渲染| A
        A1[通用组件] --> A  // 如 Button、Card 等可复用组件
    end

    subgraph "ViewModel 层"
        C -->|调用| D[用例 (UseCase)]
        C -->|依赖| E[数据仓库 (Repository)]
        C -->|管理| F[UI 状态 (UiState)]
    end

    subgraph "领域层"
        D -->|编排业务逻辑| E
        D1[实体 (Entity)] --> D  // 纯数据类,无业务逻辑
    end

    subgraph "数据层"
        E -->|协调| G[本地数据源]
        E -->|协调| H[远程数据源]
        G --> I[Room 数据库]  // 本地持久化
        H --> J[Retrofit API]  // 远程数据请求
    end

    subgraph "基础设施层"
        K[Hilt] -->|注入依赖| C  // ViewModel 注入
        K -->|注入依赖| E  // Repository 注入
        L[协程 (Coroutines)] --> C  // 异步处理
        M[Flow] --> C  // 数据流管理
    end

    style UI 层 fill:#f9f,stroke:#333,stroke-width:2px
    style ViewModel 层 fill:#9f9,stroke:#333,stroke-width:2px
    style 领域层 fill:#99f,stroke:#333,stroke-width:2px
    style 数据层 fill:#f99,stroke:#333,stroke-width:2px
    style 基础设施层 fill:#ff9,stroke:#333,stroke-width:2px
2.3 项目目录结构

基于功能模块化与分层思想,目录结构设计如下(Kotlin 实现):

kotlin
复制代码
com.example.taskmanager/
├── ui/                      // UI 层
│   ├── screen/              // 页面定义
│   │   ├── TaskListScreen.kt  // 任务列表页
│   │   ├── TaskDetailScreen.kt // 详情页
│   │   ├── TaskEditScreen.kt  // 编辑页
│   │   └── StatisticsScreen.kt // 统计页
│   ├── component/           // 通用组件
│   │   ├── TaskItem.kt      // 列表项组件
│   │   └── PriorityTag.kt   // 优先级标签
│   └── theme/               // 主题配置(Material3)
├── viewmodel/               // ViewModel 层
│   ├── TaskListViewModel.kt
│   ├── TaskDetailViewModel.kt
│   └── StatisticsViewModel.kt
├── domain/                  // 领域层
│   ├── entity/              // 实体类
│   │   └── Task.kt          // 任务数据模型
│   └── usecase/             // 用例
│       ├── GetTasksUseCase.kt
│       ├── SaveTaskUseCase.kt
│       └── CalculateStatisticsUseCase.kt
├── data/                    // 数据层
│   ├── repository/          // 仓库实现
│   │   └── TaskRepositoryImpl.kt
│   ├── local/               // 本地数据源
│   │   ├── dao/TaskDao.kt
│   │   └── database/TaskDatabase.kt
│   └── remote/              // 远程数据源
│       ├── api/TaskApiService.kt
│       └── model/RemoteTask.kt
└── di/                      // 依赖注入
    ├── AppModule.kt         // 全局依赖配置
    └── ViewModelModule.kt   // ViewModel 注入

三、技术选型

3.1 核心技术栈:Kotlin+Jetpack Compose+MVVM+Hilt
(1)Kotlin:官方首选开发语言
  • 核心优势
    • 空安全:编译期检测空指针,降低 30%以上的运行时异常
    • 协程:简化异步代码编写,替代传统回调(Callback)和 RxJava,如通过 viewModelScope.launch 管理任务生命周期
    • 扩展函数:增强代码可读性,如为 Task 类添加 isOverdue() 扩展方法判断是否延期
    • 与 Android SDK 深度集成:Jetpack 库优先提供 Kotlin API,如 Room、ViewModel 均支持 Kotlin 协程与 Flow
(2)Jetpack Compose:现代化 UI 开发框架
  • 核心优势
    • 声明式 UI:通过 @Composable 函数描述 UI 状态,替代 XML 布局,代码量减少 40%~60%
    • 可组合性:支持组件嵌套与复用,如 TaskItem 组件可在列表页和详情页复用
    • 状态驱动:通过 rememberStateFlow 实现 UI 与数据自动同步,无需手动调用 notifyDataSetChanged()
    • 官方生态支持:与 Navigation Compose(页面导航)、Material3(设计系统)无缝集成,提供一致的设计语言[9][22]
(3)MVVM:数据与 UI 分离的架构模式
  • 核心优势
    • 关注点分离:ViewModel 负责业务逻辑,Compose 页面专注 UI 渲染,符合"单一职责原则"
    • 生命周期感知:ViewModel 独立于 UI 生命周期,避免屏幕旋转导致的数据丢失
    • 可测试性:ViewModel 不依赖 Android 环境,可通过 JUnit 直接测试业务逻辑,如验证 SaveTaskUseCase 的调用次数
(4)Hilt:依赖注入框架
  • 核心优势
    • 简化依赖管理:通过注解(如 @Inject@Module)自动生成依赖注入代码,替代手动 new 对象
    • 作用域控制:支持 @ViewModelScoped@Singleton 等作用域,确保资源合理释放
    • 与 Jetpack 集成:提供 @HiltViewModel 注解,直接注入 ViewModel 依赖,无需手动实现工厂类[47]

技术栈协同效应:Kotlin 协程与 Flow 为 Compose 提供异步数据流,MVVM 架构通过 ViewModel 连接数据流与 UI,Hilt 则通过依赖注入解耦各层组件,形成"数据驱动-状态管理-依赖解耦"的完整闭环。

3.2 方案对比与取舍
(1)与跨平台方案(Flutter)的对比
维度 Kotlin+Jetpack Compose(本方案) Flutter(跨平台方案)
原生集成度 100% 原生 API 支持,无中间层 通过引擎桥接,部分原生能力需自定义 Channel
性能 编译为原生代码,启动速度快 15%~20% AOT 编译优化,但首屏渲染略慢(多引擎初始化)
学习成本 复用 Android 开发者现有知识(Kotlin、Jetpack) 需学习 Dart 语言及 Flutter 框架,成本较高
生态成熟度 官方维护,与 AndroidX 库无缝集成 第三方库丰富,但部分场景需自行适配

取舍理由:本项目为 Android 平台专属应用,无需跨平台能力,选择原生方案可最大化利用 Android 生态优势,降低长期维护成本。若未来需扩展至 iOS,可考虑 Kotlin Multiplatform Mobile(KMM)作为迁移路径。

(2)与传统架构(MVC/MVP)的对比
  • MVC 架构:Activity 同时承担 Controller 和 View 职责,导致代码臃肿(常超 1000 行),难以维护
  • MVP 架构:通过 Presenter 分离业务逻辑,但需手动管理 View 与 Presenter 的生命周期,易引发内存泄漏
  • MVVM 优势:ViewModel 由系统托管生命周期,结合 Data Binding/Flow 实现数据自动同步,代码复用率提升 30%以上[48]
(3)与 Clean Architecture 的融合

本方案在分层架构基础上吸收 Clean Architecture 思想:

  • 将核心业务逻辑(如统计计算、任务状态校验)封装在领域层用例中,确保与 Android SDK 解耦
  • 数据层通过 Repository 模式隔离数据源实现,支持本地/远程数据切换(如调试环境使用内存数据库,生产环境使用 Room)[24]
  • 实体类(Entity)作为跨层数据模型,确保各层数据一致性
3.3 辅助技术选型
  • 数据存储:Room(本地数据库)+ DataStore(键值对存储,替代 SharedPreferences)
  • 网络请求:Retrofit + OkHttp,支持 RESTful API 调用与拦截器配置(如添加 Token)
  • 状态管理:StateFlow(UI 状态)+ SharedFlow(事件通知,如导航事件)
  • 图片加载:Coil,支持 Compose 组件 AsyncImage,自动处理缓存与生命周期
  • 测试工具:JUnit(单元测试)+ Espresso(UI 测试)+ MockK(模拟依赖)

选型原则:优先选择 Google 官方维护的技术栈,确保长期支持与版本兼容性;架构设计以"可测试性"和"可维护性"为核心,避免过度设计(如无需引入 Redux 等复杂状态管理库)。

四、总结

本项目通过明确任务管理的核心功能模块与技术指标,构建了"UI-ViewModel-领域-数据"四层架构,并选择 Kotlin+Jetpack Compose+MVVM+Hilt 作为技术栈。该方案既符合 Android 官方推荐的架构模式,又通过分层设计确保代码的可扩展性与可测试性,为后续功能迭代(如团队协作、云同步)奠定基础。架构实现上参考 Google architecture-samples 开源项目的最佳实践,结合 Clean Architecture 思想优化领域层设计,最终形成兼顾实用性与规范性的技术方案[47]。