面向对象编程小记
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 | class Bike { |
通过接口或者抽象类来封装抽象,实现依赖倒置;
Person 依赖抽象的接口 Runnable,而不是具体的 Bike 类。
1 | protocol Runnable { |
0x3: 23 种设计模式
总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
0x4: UML 统一建模语言
帮助我们梳理流程和类的各种关系
- 类图
- 序列图
0x5: 扩展
面向对象编程的弊端是什么?
https://www.zhihu.com/question/20275578
提到了 封装 和 归一化的概念,不要为了面向对象而面向对象,在设计对象之前需要先思考,有些问题有更好的解决方案,例如游戏中的角色技能是采用数据库的方式来实现的。这类问题用面向对象的思想来处理,会出现类爆炸,无法维护。
编程的首要原则是什么?
KISS:Keep it simple, stupid
DRY:Dont Repeat Yourself
http://mindhacks.cn/2009/03/09/first-principles-of-programming/