Skip to content

9.1_定义数据结构与业务逻辑

Model层核心职责

在MVVM架构中,Model层是应用程序的基石,它承载着核心数据和业务逻辑。想象一下,你的App就像一个精心设计的图书馆,Model就是那些珍贵的书籍和管理书籍的规则。它独立于用户界面,确保数据的纯粹性和可重用性。

Model层的主要职责包括:

  • 定义数据结构:明确你的应用程序需要处理哪些数据,例如用户、产品、订单等。
  • 封装业务逻辑:处理数据的存储、检索、验证以及任何与数据相关的操作。
  • 提供数据访问接口:允许ViewModel层安全地获取和修改数据。

构建数据结构:以用户为例

让我们以一个常见的场景为例:管理用户数据。在Model层中,你会定义一个User结构体或类来表示一个用户。这个结构体将包含用户的各种属性,比如idnameemailage

swift
struct User {
    let id: String
    var name: String
    var email: String
    var age: Int
}

这个User结构体是纯粹的数据表示,不包含任何UI相关的代码。它就像一张蓝图,清晰地描绘了用户数据的样子。

业务逻辑的封装与实现

Model层不仅仅是数据结构,更是业务逻辑的所在地。例如,你可能需要一个方法来验证用户的邮箱格式,或者计算用户的年龄是否符合某个标准。这些逻辑都应该封装在Model层中。

swift
extension User {
    func isValidEmail() -> Bool {
        let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex)
        return emailPredicate.evaluate(with: email)
    }

    mutating func updateAge(newAge: Int) {
        guard newAge > 0 && newAge < 150 else {
            print("无效的年龄")
            return
        }
        self.age = newAge
    }
}

通过将这些逻辑放在User结构体的扩展中,我们保持了代码的组织性和可维护性。这使得Model层更加健壮和智能。💪

数据持久化与网络请求

在实际应用中,Model层通常还需要处理数据的持久化(例如保存到本地数据库或UserDefaults)和网络请求(从服务器获取数据)。这些操作也属于Model层的职责范围。

你可以创建一个UserManager类来管理User对象的集合,并处理这些复杂的任务。

swift
class UserManager {
    private var users: [User] = []

    func fetchUsers() async throws -> [User] {
        // 模拟网络请求
        try await Task.sleep(nanoseconds: 1_000_000_000) // 延迟1秒
        let fetchedUsers = [
            User(id: "1", name: "Alice", email: "alice@example.com", age: 30),
            User(id: "2", name: "Bob", email: "bob@example.com", age: 24)
        ]
        self.users = fetchedUsers
        return fetchedUsers
    }

    func addUser(_ user: User) {
        users.append(user)
        print("用户 \(user.name) 已添加。")
    }
    
    func getUsers() -> [User] {
        return users
    }
}

这个UserManager负责数据的获取和管理,它不关心数据如何展示,只专注于数据的本身。这正是Model层的精髓所在!✨

Model层的优势与最佳实践

将数据和业务逻辑封装在Model层带来了诸多好处。首先,它提高了代码的可测试性。你可以独立测试Model层的逻辑,而无需启动UI。其次,它增强了代码的可重用性。同一个Model层可以在不同的ViewModel和View中使用。

最佳实践包括:

  1. 保持纯净:Model层不应该引用UIKit或任何UI框架。
  2. 单一职责:每个Model对象或类应专注于一个特定的数据或业务领域。
  3. 易于测试:设计Model时要考虑到单元测试的便利性。

通过遵循这些原则,你将构建一个强大、灵活且易于维护的应用程序。🚀

本站使用 VitePress 制作