为什么需要高质量代码?
更规范更结构更便于开发更易修复与阅读
你写的每一句代码都是你的label,你的id card
什么是高质量代码
没有对比就没有伤害,代码亦是如此。那么什么才是高质量,好代码呢?有没有哪些可明确度量的维度呢?
- 可维护性(maintainability)
- 可读性(readability)
- 可扩展性(extensibility)
- 灵活性(flexibility)
- 简洁性(simplicity)
- 可复用性(reusability)
- 可测试性(testability)
如何才能编写出高质量,好代码
写出满足这些评价标准的高质量代码,我们需要掌握一些更加细化、更加能落地的编程方法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。而所有这些编程方法论的最终目的都是为了编写出高质量的代码。
比如,面向对象中的继承、多态能让我们写出可复用的代码;编码规范能让我们写出可读性好的代码;设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;
设计模式可以让我们写出易扩展的代码,持续重构可以时刻保持代码的可维护性等等
核心修炼技巧
发现好代码
学习与实现”好”代码
持续
Code Style
现在主流的编程范式或者是编程风格有三种,它们分别是函数式编程、面向过程、面向对象。
现在比较流行的编程语言大部分都是面向对象编程语言。大部分项目也都是基于面向对象编程风格开发的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
面向对象的四大特性:封装、抽象、继承、多态
面向对象编程与面向过程编程的区别和联系面向对象分析、面向对象设计、面向对象编程接口和抽象类的区别以及各自的应用场景基于接口而非实现编程的设计思想多用组合少用继承的设计思想面向过程的贫血模型和面向对象的充血模型
设计原则
设计原则是指导我们代码设计的一些经验总结。设计原则这块儿的知识有一个非常大的特点,那就是这些原则听起来都比较抽象,定义描述都比较模糊,不同的人会有不同的解读。所以,如果单纯地去记忆定义,对于编程、设计能力的提高,意义并不大。对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。只有这样,我们才能在项目中灵活恰当地应用这些原则。
你需要透彻理解并且掌握,如何应用下面这样几个常用的设计原则。
- SOLID 原则 -SRP 单一职责原则
- SOLID 原则 -OCP 开闭原则
- SOLID 原则 -LSP 里式替换原则
- SOLID 原则 -ISP 接口隔离原则
- SOLID 原则 -DIP 依赖倒置原则
- DRY 原则、KISS 原则、YAGNI 原则、LOD 法则
SRP原则:一个类只能承担一个事情
OCP:实现不可修改,但可面向扩展
LSP:子类型能够替换它们的基类型
ISP:抽象不持有特定逻辑,应持有实现的公有逻辑
DIP:高底层不能互相依赖,应同时依赖抽象
DRY:不做重复的事,不写重复类似的代码
KISS:keep it simple,尽量简单的代码,让代码更容易被别人理解
YANGNI:you ain’t gonna need it,只着眼必需的功能,不添加认为可能需要的功能
LOD:类应减少被外界直接访问的机会,类与类之间避免直接通信
设计模式
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。大部分设计模式要解决的都是代码的可扩展性问题。设计模式相对于设计原则来说,没有那么抽象,而且大部分都不难理解,代码实现也并不复杂。它们又可以分为三大类:创建型、结构型、行为型
这一块的学习难点是了解它们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。
经典的设计模式有 23 种。随着编程语言的演进,一些设计模式(比如 Singleton)也随之过时,甚至成了反模式,一些则被内置在编程语言中(比如 Iterator),另外还有一些新的模式诞生(比如 Monostate)。
创建型
- [x] 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。
- [ ] 不常用的有:原型模式。
结构型
-
[x] 常用的有:代理模式、桥接模式、装饰者模式、适配器模式。
-
[ ] 不常用的有:门面模式、组合模式、享元模式。
行为型
- [x] 常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。
- [ ] 不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
重构
在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。随着需求的变化,代码的不停堆砌,原有的设计必定会存在这样那样的问题。
针对这些问题,我们就需要进行代码重构。重构是软件开发中非常重要的一个环节。持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步。
而重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。
实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候。
我们前面讲过,虽然使用设计模式可以提高代码的可扩展性,但过度不恰当地使用,也会增加代码的复杂度,影响代码的可读性。在开发初期,除非特别必须,我们一定不要过度设计,应用复杂的设计模式。
而是当代码出现问题的时候,我们再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。
对于重构这部分内容,需要掌握:
-
重构的目的(why)、对象(what)、时机(when)、方法(how);
-
保证重构不出错的技术手段:单元测试和代码的可测试性;
- 两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)
五者之间的联系
关于面向对象、设计原则、设计模式、编程规范和代码重构,面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。
比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。
从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。编程规范主要解决的是代码的可读性问题。
编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。实际上,面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或者提高代码质量的方法论,本质上都是服务于
编写高质量代码这一件事的。当我们追本逐源,看清这个本质之后,很多事情怎么做就清楚了,很多选择怎么选也清楚了。