Swift 中 OOP vs POP (举例说明)

OOP

什么是OOP?

  • 面向对象程序设计(英语:Object-oriented programming,缩写OOP
  • 几乎所有的编程语言都支持OOP,Java、Ruby等语言的设计理念几乎将一切事物都看作对象,对象即中心,对象即真理。

OOP主要关心对象是什么

// 基类,人类
class Human {
    var name: String
    var age: Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    func sayHi() {
        print("Hello")
    }
}
// 运动员,继承自人类
class Athlete : Human {
    override func sayHi() {
        print("Hi,I'm \(name)")
    }
}
// 田径运动员,继承自运动员
class Runner: Athlete {
    func run() {
        print("run")
    }
}
// 游泳运动员,继承自运动员
class Swimmer: Athlete {
    func swim() {
        print("swim")
    }
}
// 那这时候,如果一个有一个天赋异禀运动员,田径和游泳均会,咋处理?

OOP缺陷

  • 继承机制要求你在开始之前就设计好整个程序框架、结构、事物间的连接关系,比如上面例子中的全能运动员,这要求开发者必须有很好的分类设计能力,将不同的属性和方法分配到合适的层次里面去。但是设置清晰明了的继承体系总是很难的。
  • 结构天生对改动有抵抗特性。这也是为什么OOP领域中所有的程序员对重构都讳莫如深,有些框架到最后代码量急剧膨胀变得难以维护从而失控。
  • 继承机制带来的另一个问题就是:很多语言不支持多继承,我们不得不在父类塞入更多的内容,子类可能会存在无用的父类属性和方法,而这些冗余的代码给子类带来一定的风险,而对于层级很深的代码结构来说Bug修复将会成为难题
  • 对象的状态不是我们的编码的好友,相反是我们的敌人。对象固有的状态在分享和传递过程中很难追踪调试,尤其在并行程序编码中问题就更加明显。OOP所带来的可变、不确定、复杂等特征完全与编程倡导的小型化、核心化高效化完全背离

POP

面向协议程序设计(英语:Protocol Oriented Programming,缩写:POP),是Swift的一种编程范式,Apple于2015年WWDC提出,Swift是世界上第一门面向协议编程的语言。它是swift2.0引入的一种新的编程范式,通过协议扩展,协议继承和协议组合的方式来设计编写代码。

  • 一个协议会描述方法属性的蓝图。这个协议可以被其他的类、结构体、枚举去遵循
  • POP本身就是OOP的演化,只是在OOP(99%)的基础上又迈进了一小步(1%),补足OOP一些设计的不足。

POP主要关心对象做什么

// 定义人类的协议
protocol Human {
    var name: String { get set }
    var age: Int { get set }
    func sayHi()
}
// 定义跑步协议
protocol Runnable {
    func run()
}
// 定义游泳协议
protocol Swimming {
    func swim()
}
// 定义田径运动员
struct Runner : Human, Runnable {
    var name: String = "zhangsan"
    var age: Int = 20
    
    func sayHi() {
        print("Hi,I'm \(name)")
    }
    
    func run() {
        print("run")
    }
}
// 定义游泳运动员
struct Swimmer : Human, Swimming {
    var name: String = "lisi"
    var age: Int = 21
    
    func sayHi() {
        print("Hi,I'm \(name)")
    }
    
    func swim() {
        print("swim")
    }
}
// 定义全能运动员
struct Aller : Human, Runnable, Swimming {
    var name: String = "wangwu"
    var age: Int = 22
    
    func sayHi() {
        print("Hi,I'm \(name)")
    }
    
    func run() {
        print("run")
    }
    
    func swim() {
        print("swim")
    }
}

 

 

版权声明:
作者:Amber
链接:https://late.run/archives/149
来源:LATE-努力努力再努力
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录