Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第四部分:实践与案例

第四部分:实践与案例

第11章:最佳实践与模式

MVVM 项目中的代码组织

在 MVVM 架构中,良好的代码组织是保证项目可维护性和可扩展性的关键。以下是一些核心原则和实践方法:

1. 分层目录结构

推荐按功能模块划分目录,每个模块内再按 MVVM 分层:

Project/
├── Modules/
│   ├── FeatureA/
│   │   ├── Model/
│   │   ├── View/
│   │   ├── ViewModel/
│   │   └── Utilities/
│   └── FeatureB/
│       ├── Model/
│       ├── View/
│       ├── ViewModel/
│       └── Tests/
├── Shared/
│   ├── Extensions/
│   ├── Protocols/
│   └── Services/
└── Resources/

2. 命名规范

  • View: TodoListView.swift
  • ViewModel: TodoListViewModel.swift
  • Model: TodoItem.swift
  • 协议: IdentifiableTodo.swift

3. 依赖管理

  • 使用 protocol 定义服务接口
protocol DataService {
    func fetchTodos() async throws -> [TodoItem]
}
  • 通过依赖注入传递服务:
class TodoListViewModel: ObservableObject {
    private let service: DataService
    
    init(service: DataService = DefaultDataService()) {
        self.service = service
    }
}

4. 状态管理分层

  • @State: 仅限当前视图的临时状态
  • @StateObject: 视图拥有的 ViewModel
  • @ObservedObject: 父视图传递的 ViewModel
  • @EnvironmentObject: 全局共享状态

5. 代码分离技巧

  • 将复杂视图拆分为多个子视图
  • 使用 ViewModifier 封装样式逻辑
  • 通过 Extension 组织相关功能:
extension TodoListViewModel {
    private func validateInput(_ text: String) -> Bool {
        // 验证逻辑
    }
}

6. 资源管理

  • 颜色、字体等统一在 Assets.xcassets 管理
  • 字符串使用 Localizable.strings
  • 常量集中到 Constants.swift

案例:Todo 项目的代码组织

// 在 View 层
struct TodoListView: View {
    @StateObject var vm = TodoListViewModel()
    
    var body: some View {
        NavigationStack {
            List(vm.items) { item in
                TodoRow(item: item)
            }
            .toolbar { AddTodoButton() }
        }
    }
}

// 在 ViewModel 层
final class TodoListViewModel: ObservableObject {
    @Published private(set) var items: [TodoItem] = []
    private let persistence: TodoPersistenceService
    
    init(persistence: TodoPersistenceService = CoreDataService()) {
        self.persistence = persistence
        loadItems()
    }
    
    func addItem(_ title: String) {
        let newItem = TodoItem(title: title)
        items.append(newItem)
        persistence.save(newItem)
    }
}

通过这种组织方式,各层职责清晰,测试和维护都会变得更加容易。

Last Updated:: 4/25/25, 8:30 PM