【设计模式】03-面向对象、设计原则、设计模式、编程规范、重构的关系
一、面向对象
目前主流的编程范式有三种:
-
- 面向过程
- 面向对象
- 函数式编程
现在比较流行的编程语言大部分是面向对象编程语言,大部分项目也是基于面向对象编程风格开发的。面向对象编程具有丰富的特性(封装、继承、多态、抽象),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
对于这部分内容,要掌握以下 7 个大的知识点:
-
- 面向对象的四大特征:封装、继承、多态、抽象
- 面向对象编程和面向过程编程的区别和联系
- 面向对象分析、面向对象设计、面向对象编程
- 接口和抽象类的区别,以及各自的应用场景
- 基于接口而非实现编程的设计思想
- 多用组合,少用继承的设计思想
- 面向过程的贫血模型和面向对象的充血模型
二、设计原则
设计原则是指导我们进行代码设计的一些经验总结。
设计原则的原则比较抽象,定义描述也比较模糊,每个人都有自己的解读。单纯背诵定义意义不大。对于每种设计原则,都要掌握其设计初衷、能解决哪些编程问题、有哪些应用场景。
要透彻理解并掌握如何应用以下设计原则:
-
- SOLID 原则 -SRP 单一职责原则
- SOLID 原则 -OCP 开闭原则
- SOLID 原则 -LSP 里式替换原则
- SOLID 原则 -ISP 接口隔离原则
- SOLID 原则 -DIP 依赖倒置原则
- DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
三、设计模式
设计模式是针对软件开发常见的设计问题,总结出来的一套解决方案。大部分设计模式要解决的都是代码的可扩展性问题。这部分的重点是了解它们能解决哪些问题,掌握典型的应用场景。此外,不要过度应用设计模式。
经典设计模式有 23 种。随着编程语言演进,某些设计模式(譬如 Singleton)也随之过时,甚至称为反模式。有一些则被内置在编程语言中(譬如 Iterator)。还有一些新的模式诞生(譬如 Monostate)。
设计模式可以分为创建型、结构型、行为型。对于常用的设计模式,要重点理解掌握。不常用的设计模式了解即可。
四、编程规范
编程规范主要解决的是代码的可读性问题,它更加具体、更加偏重代码细节。即便对设计原则、设计模式不了解,最起码也要掌握基本的编码规范,比如,如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。每条编码规范都非常简单、非常明确,比较偏向于记忆,你只要照着来做可以。
如果有时间,可以看以下几本书:《重构》、《代码大全》、《代码整洁之道》。
五、代码重构
在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。随着需求的变化,代码的不停堆砌,原有的设计必定会存在这样那样的问题。针对这些问题,我们就需要进行代码重构。
重构是软件开发中非常重要的一个环节。持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步。
重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候。使用设计模式可以提高代码的可扩展性,但过度使用,也会增加代码的复杂度,影响代码的可读性。在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。
这部分需要掌握以下知识点:
-
- 重构的目的(why)、对象(what)、时机(when)、方法(how);
- 保证重构不出错的技术手段:单元测试和代码的可测试性;
- 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。
六、五者之间的联系
- 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
- 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
- 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
- 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
- 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。