0x1: 三大特性

​ 封装,继承,多态

0x2: 五大原则

S.O.L.I.D

  • Single Responsibility Principle 单一职责原则:一个类只有一个职责,高内聚,降低类的改变所带来的影响。

    A. 如何界定单一,什么样的职责才算单一的职责 ?

    Q: 大体上需要符合类名的表意,不能有超出预期的职责。是否需要细分职责,取决于该类的需求变更是否频繁以及该类变更后的影响范围。

  • Open-Closed Principle 开闭原则:一般通过 多态,工厂模式来实现,避免修改引入其他问题。

  • Liskov Substitution Principle 里氏置换原则:子类无副作用置换父类,子类不要出现超出父类预期的行为。例如 正方形 继承 长方形。

  • Interface Segregation Principle 接口隔离原则:不要依赖你不需要的东西,如果存在需要抽离到另外一个接口。

  • Dependency Inversion Principle 依赖倒置原则:高层次模块不应该依赖于低层次模块;他们应该依赖于抽象。抽象不应该依赖于细节;细节依赖于抽象。

😊太抽象了,来个 Demo 吧。

假设 Person 是上层模块,Bike 是底层模块, Person 依赖于底层模块 Bike。

1
2
3
4
5
6
7
8
9
10
11
12
class Bike {
func run() {
print("Bike run...")
}
}

class Person {
func travel() {
let bike = Bike()
bike.run()
}
}

通过接口或者抽象类来封装抽象,实现依赖倒置;

Person 依赖抽象的接口 Runnable,而不是具体的 Bike 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protocol Runnable {
func run();
}
class Bike:Runnable {
func run() {
print("Bike run...")
}
}
class Person {
public var transportTool:Runnable?
func travel() {
self.transportTool?.run()
}
}

0x3: 23 种设计模式

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

0x4: UML 统一建模语言

帮助我们梳理流程和类的各种关系

  • 类图
  • 序列图

0x5: 扩展

  1. 面向对象编程的弊端是什么?

    https://www.zhihu.com/question/20275578

    提到了 封装 和 归一化的概念,不要为了面向对象而面向对象,在设计对象之前需要先思考,有些问题有更好的解决方案,例如游戏中的角色技能是采用数据库的方式来实现的。这类问题用面向对象的思想来处理,会出现类爆炸,无法维护。

  2. 编程的首要原则是什么?

    KISS:Keep it simple, stupid

    DRY:Dont Repeat Yourself

    http://mindhacks.cn/2009/03/09/first-principles-of-programming/