iOS 开发面向对象设计的六大设计原则 - 单一职责(Singl

2023-05-15  本文已影响0人  DingGa

单一职责原则(Single Responsibility Principle, SRP)是面向对象设计的 SOLID 原则中的第一个,意指一个类或者模块只应该负责一项职责。这样可以让代码更好地组织,更易于理解和维护。

在 iOS 开发中,可以通过以下几个实践来遵循单一职责原则:

拆分视图控制器 (View Controllers):经常会看到一个视图控制器负责过多的任务,比如获取数据、设置视图、处理用户输入等。可以将这些职责拆分到其他类中,例如创建一个专门获取数据的类(DataProvider),一个处理用户输入的类(InputHandler),等等。

使用扩展 (Extensions):Swift 提供了扩展机制,可以将一个类或者结构体的功能拆分到不同的扩展中。每个扩展负责一个特定的功能,这样就能遵循单一职责原则。

使用协议 (Protocols):协议可以定义一组关联的方法、属性,然后由具体的类、结构体或者枚举去实现。这样可以将复杂的功能拆分成一系列小的、独立的部分。

下面是一个 ProfileViewController 未遵守单一职责原则的示例。在这个示例中,ProfileViewController 负责获取用户数据、配置和显示视图,以及响应用户交互。

class ProfileViewController: UIViewController {
    var profile: Profile?

    override func viewDidLoad() {
        super.viewDidLoad()

        loadProfile()
    }

    private func loadProfile() {
        // Fetch profile data from server or local database
        // ...

        // Update views with profile data
        // ...
    }

    @IBAction func editProfileButtonTapped(_ sender: Any) {
        // Navigate to edit profile screen
        // ...
    }

    private func updateProfile(_ profile: Profile) {
        // Update profile data on server or local database
        // ...
    }
}

在这个示例中,ProfileViewController 承担了太多的职责。这可能会导致 ProfileViewController 代码量过大,难以理解和维护。同时,如果需要修改获取用户数据的方式、显示数据的方式或者处理用户交互的方式,都可能需要修改 ProfileViewController 的代码,这可能会引入 bug 或者影响其他功能。遵守单一职责原则可以帮助我们避免这些问题。

我们可以将这些责任分离,让 ProfileViewController 只负责配置和显示视图,创建一个 ProfileManager 来负责获取和处理用户数据,以及一个 ProfileRouter 来负责处理用户交互。
ProfileManager 负责获取和更新用户资料,ProfileRouter 负责处理导航(用户交互),ProfileViewController 负责配置和显示视图。这样每个类都只有一个职责,符合单一职责原则。

// ProfileManager 负责获取和处理用户数据
class ProfileManager {
    func fetchProfile(completion: @escaping (Profile?) -> Void) {
        // Fetch profile data from server or local database
        // ...
    }

    func updateProfile(_ profile: Profile, completion: @escaping (Bool) -> Void) {
        // Update profile data on server or local database
        // ...
    }
}

// ProfileRouter 负责处理用户交互
class ProfileRouter {
    weak var viewController: UIViewController?

    func navigateToEditProfile(_ profile: Profile) {
        // Navigate to edit profile screen
        // ...
    }
}

// ProfileViewController 只负责配置和显示视图
class ProfileViewController: UIViewController {
    var profileManager = ProfileManager()
    var profileRouter = ProfileRouter()
    var profile: Profile?

    override func viewDidLoad() {
        super.viewDidLoad()

        profileRouter.viewController = self

        loadProfile()
    }

    private func loadProfile() {
        profileManager.fetchProfile { [weak self] profile in
            self?.profile = profile

            // Update views with profile data
            // ...
        }
    }

    @IBAction func editProfileButtonTapped(_ sender: Any) {
        if let profile = profile {
            profileRouter.navigateToEditProfile(profile)
        }
    }
}

上一篇 下一篇

猜你喜欢

热点阅读