这儿每天共享一个 iOS 的新知识,快来重视我吧

讲讲 iOS 开发中的 SOLID 准则

前言

软件工程中,SOLID 准则是五个基本准则,旨在促进更好的软件规划:更可保护、更易于了解、更灵敏。关于 iOS 开发者来说,把握和运用这些准则是非常重要的,因为它们能够帮助你构建出高质量的运用程序。今日准备来测验介绍下我对这些准则的了解,并供给具体的 iOS 开发比方来说明怎么在实践中运用这些准则。

单一责任准则 (SRP)

单一责任准则指的是一个类应该只担任一项使命。在 iOS 开发中,遵从此准则能够防止创立巨大的类,每个类都应该专心于单一的功用。

举个比方,比方你有一个个人中心的控制器 UserProfileViewController,它的责任是展示用户的个人信息,而不应该一起担任从网络获取这些信息。这种责任的分离使得代码更易于保护和测验。

class UserProfileService {
    func fetchUserProfile(completion: @escaping (UserProfile) -> Void) {
        // 完成网络恳求获取用户资料
    }
}

假如你的这个页面有网络恳求相关的代码,能够考虑创立另一个类,比方 UserProfileService,在这个类中进行页面需求的数据恳求,这样咱们就使 UserProfileViewController 遵从了单一责任准则,使其变得愈加明晰和易于办理。

敞开关闭准则 (OCP)

敞开关闭准则着重软件实体(类、模块、函数等)应该对扩展敞开,对修正关闭。

什么意思呢,一个类一旦规划开发完结,就应该能够独立完结其工作,而不要对类进行任何修正,假如你想要添加功用,应该经过扩展/集成/完成接口等方法。

在 iOS 开发中,这种准则也很常见,比方我要规划一个图像处理功用的协议 ImageFilter,协议一旦规划完结,就不再更改了,假定这个协议只要一个方法 apply(to:) 输入一个图片,回来一个图片。

protocol ImageFilter {
    func apply(to image: UIImage) -> UIImage
}

假如此刻我想添加一个含糊滤镜的功用,我能够新建一个类来恪守这个协议,并完成 apply(to:) 方法:

class BlurFilter: ImageFilter {
    func apply(to image: UIImage) -> UIImage {
        // 运用含糊滤镜...
        return image
    }
}

这样,任何新的滤镜都能够经过完成ImageFilter协议来创立,然后遵从了敞开关闭准则。

里氏替换准则 (LSP)

里氏替换准则其实是针对继承而言的,要求子类能够替换其基类,而不损坏程序的正确性。这意味着子类应该彻底完成父类的行为。

在现在的编程语言中基本都契合这个准则,在 iOS 开发中也不破例,一个简略的比方,假如咱们有一个 Bird 类和一个 FlyingBird 子类,那么任何 FlyingBird 的实例都应该能够替换Bird的实例。

class Bird {
    func layEgg() {
        print("Laying an egg.")
    }
}
class FlyingBird: Bird {
    func fly() {
        print("Flying.")
    }
}

经过确保 FlyingBird 遵从 LSP,咱们能够确保咱们的代码愈加灵敏和可靠。

接口阻隔准则 (ISP)

接口阻隔准则指的是客户端不应该依靠它不运用的接口,这其实跟单一责任有点关系,一个大型接口往往有许多功用,但是继承者往往不需求这么多功用,就需求把大型接口拆分为更小、更具体的接口。

例如,你有一个打印机的类,它拥有打印、扫描、仿制等功用,咱们能够将打印、扫描和复印功用分解为独立的协议,这样,打印机只需求依靠打印功用、扫描仪就只需求依靠扫描功用,或者选择性的依靠多个功用。

// 打印功用
protocol Printer {
    func printDocument(document: Document)
}
// 扫描功用
protocol Scanner {
    func scanDocument(document: Document) -> Data
}
// 复印功用
protocol Copier {
    func copyDocument(document: Document) -> Document
}
// 只打印,只需求恪守 Printer 协议
class SimplePrinter: Printer {
    func printDocument(document: Document) {
    }
}
// 办公室多功用打印机,需求恪守 Printer, Scanner, Copier 协议
class OfficePrinter: Printer, Scanner, Copier {
    func printDocument(document: Document) {
        // 打印
    }
    func scanDocument(document: Document) -> Data {
        // 扫描
        return Data()
    }
    func copyDocument(document: Document) -> Document {
        // 复印
        return Document()
    }
}

这样,完成这些协议的类只需求关怀它们真正需求的功用,然后使代码愈加明晰和灵敏。

依靠倒置准则 (DIP)

依靠倒置准则着重高层模块不应该依靠低层模块,两者都应该依靠笼统。

概念仍是太笼统了,咱们来举个比方帮助了解,比方你有个从网络获取数据的类 NetworkFetcher,和一个从数据库获取数据的类 DatabaseFetcher,然后有个供给数据的工具类 DataProvider 来直接依靠前面两个类,这种做法就违背了依靠倒置准则。

正确的做法是将 NetworkFetcherDatabaseFetcher 笼统出一个新的接口给 DataProvider 依靠,咱们能够界说一个 DataFetcher 协议,然后让 NetworkFetcherDatabaseFetcher 类完成这个协议:

protocol DataFetcher {
    func fetchData(completion: @escaping (Data?) -> Void)
}
class NetworkFetcher: DataFetcher {
    func fetchData(completion: @escaping (Data?) -> Void) {
        // 从网络获取数据
    }
}
class DatabaseFetcher: DataFetcher {
    func fetchData(completion: @escaping (Data?) -> Void) {
        // 从数据库获取数据
    }
}
class DataProvider {
    let fetcher: DataFetcher
    init(fetcher: DataFetcher) {
        self.fetcher = fetcher
    }
    func fetchData() {
        fetcher.fetchData { data in
            // 运用数据
        }
    }
}

这样,DataProvider 类就能够依靠于 DataFetcher 协议,而不是任何具体的数据获取方法,然后提高了代码的灵敏性和可测验性。

定论

遵从 SOLID 准则是构建健壮、可保护和灵敏的 iOS 运用程序的要害。经过实际的比方,咱们能够看到这些准则怎么帮助咱们改善规划和架构。虽然有些人(或者初学者)可能会觉得遵从这些准则有些麻烦或者困难,但随着经历的不断堆集,你就会越来越能感觉到这些准则的重要性,学习更多编程的哲学,这也是你变成大佬的必经之路。

这儿每天共享一个 iOS 的新知识,快来重视我吧

本文同步自微信大众号 “iOS新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!