这儿每天共享一个 iOS 的新知识,快来重视我吧
前言
在软件工程中,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
来直接依靠前面两个类,这种做法就违背了依靠倒置准则。
正确的做法是将 NetworkFetcher
和 DatabaseFetcher
笼统出一个新的接口给 DataProvider
依靠,咱们能够界说一个 DataFetcher
协议,然后让 NetworkFetcher
和 DatabaseFetcher
类完成这个协议:
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新知”,每天准时共享一个新知识,这儿只是同步,想要及时学到就来重视我吧!