第四部分:实践与案例
第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)
}
}
通过这种组织方式,各层职责清晰,测试和维护都会变得更加容易。
