前言:
面向对象, 设计原则, 设计模式, 编程规范, 重构, 这五者有啥关系?
上一讲说到, 要具备编写高质量代码的能力, 需要学习一些编程方法论, 其中就包含了以上5点.
一. 面向对象
首先, 主流的编程范式或编程风格有3种, 分别是: 面向过程编程, 面向对象编程, 函数式编程, 其中面向对象编程一定是当下最最主流的.
为什么面向对象编程会成为主流呢? 因为其具有丰富的特性: 封装, 抽象, 继承, 多态, 可以实现很多复杂的设计思路, 是很多设计原则, 设计模式编码实现的基础.
1.1 面向对象编程有七大知识点
- 面向对象四大特性: 封装, 抽象, 继承, 多态
- 面向对象编程和面向过程编程的区别和联系
- 面向对象分析, 面向对象设计, 面向对象编程
- 接口和抽象类的区别以及各自的应用场景
- 基于接口而非实现编程的设计思想
- 多用组合少用继承的设计思想
- 面向过程的贫血模型和面向对象的充血模型
二. 设计原则
注: 每学一种设计原则, 我们都要掌握它的设计初衷, 能解决哪些编程问题, 有哪些应用场景.
SOLID原则, 由5大原则组成, 分别是:
-
SRP单一职责原则: Single Responsibility Principle
注: 一个类或一个模块只负责完成一个职责 -
OCP开闭原则: Open-Closed Principle
注: 对扩展开放, 对修改关闭 -
LSP里式替换原则: Liskov Substitution Principle
注: 子类必须能够替换他们的父类 -
ISP接口隔离原则: Interface Segregation Principle
注: 一个接口应该声明在它真正需要的方法, 而不是把所有方法都声明在一个接口里 -
DIP依赖倒置原则: Dependency Inversion Principle
注: 高层模块不应该依赖底层模块, 二者应该依赖于抽象; 抽象不应该依赖于具体实现, 具体实验应该依赖于抽象
其他常用设计原则:
- DRY原则: Dont Repeat Yourself, 不要重复自己(不要编写重复代码)
- KISS原则: Keep It Simple Stupid, 保持简单
- YAGNI原则: You aint(are not) Gonna Need It, 不要去编写当前用不到的代码和功能
- LOD法则: Law Of Demeter, 迪米特法则, 高内聚低耦合
三. 设计模式
设计模式不是只有23种, 只是最经典的设计模式有23种.
23种经典的设计模式分为三大类:
- 创建型
- 结构型
- 行为型
3.1 创建型
常用的有: 单例模式, 工厂模式(工厂方法和抽象工厂), 建造者模式
不常用的有: 原型模式
3.2 结构型
常用的有: 代理模式, 桥接模式, 装饰者模式, 适配器模式
不常用的有: 门面模式, 组合模式, 享元模式
3.3 行为型
常用的有: 观察者模式, 模版模式, 策略模式, 职责链模式, 迭代器模式, 状态模式
不常用的有: 访问者模式, 备忘录模式, 命令模式, 解释器模式, 中介模式
四. 编程规范
编程规范主要解决的是代码的可读性问题
编程规范包含: 变量, 类, 函数命令, 如何写代码注释, 函数不宜过长, 参数不能过多等.
五. 代码重构
在软件的世界中, 根本就没有一劳永逸的设计, 需要不停的迭代, 设计, 重构.
然而, 重构的工具就是上面列举的4个模块.
重构时, 我们需要掌握如下知识点:
-
重构的目的(why), 对象(what), 时机(when), 方法(how)
注: 为什么重构? 重构哪些类和模块? 什么时候重构? 使用什么技术重构? -
保证重构不出错的技术手段: 单元测试和代码的可测试性(mock)
-
两种不同规模的重构: 大重构(大规模, 高层次)和小重构(小规模, 低层次)
六. 以上五者之间的联系
面向对象是武器, 设计原则是招式, 设计模式是心法. 以心法为基础, 使用武器运用招式面对复杂的问题.
七. 课堂讨论
7.1 第一道题
在今天讲到的内容中, 你觉得哪一部分内容对提高代码质量最有效? 为什么? 除了我罗列的这些内容外, 你还知道哪些可以提高代码质量的方法?
答: 编码规范. 因为编码规范能起到立竿见影的效果, 而重构的很大一部分原因是因为代码不符合编码规范
7.2 第二道题
我们知道, 最经典的设计模式数据是GoF的<设计模式>, 它的中文全称: <设计模式: 可复用面向对象软件的基础>, 英文全称: Design Patterns: Elements of Reusable Object-Oriented Software. 为什么它在标题中特意提到面向对象呢?
答: 因为面向对象编程具有丰富的四大特性(封装, 抽象, 继承, 多态), 可以实现很多复杂的设计思路, 是设计原则, 设计模式等编码实现的基础.