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

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

作者: DingGa | 来源:发表于2023-05-15 23:46 被阅读0次

    单一职责原则(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)
            }
        }
    }
    
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/yipvsdtx.html