设计模式
1.什么是设计模式?
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式可以直接的提高开发能力、能够写出可扩展、可读、可维护的高质量代码。
2.学习设计模式的作用
1.应对面试中设计模式的问题
2.提高代码的质量
3.提高复杂代码的实际和开发
4.提高读源码、学框架的效率
3.怎么判断代码的好坏
可以根据不同维度进行评判。
(1)可维护性(maintainability)
维护在代码中就是修改bug,修改老代码,添加新的代码。
代码可维护就是:在不破坏原有代码设计,不引入新的bug的情况下,能够快速地修改过着添加代码。
代码不易维护:修改过着添加代码需要冒着极大的引入新bug的风险,并且需要花费很长时间才能完成。
(2)可读性(readability)
软件设计大师 Martin Fowler 曾经说过:“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” “任何傻瓜都会编写计算机能理解的代码。好的程序员能够编写人能够理解的代码。”
代码被阅读的次数远远超过被编写和执行的次数。
代码的可读性应该是评价代码质量最重要的指标之一。写代码的时候,时刻要考虑到代码是否易读、易理解,从而会影响到代码的可维护性。
代码可读性的要求:
是否符合编码规范、命名是否答意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否高内聚低耦合等。
(3)可扩展性(extensibility)
代码的可扩展性:在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。
对修改关闭,对扩展开放
(4)灵活性(flexibility)
灵活性是一个抽象的评价标准。
- 当要添加一个新的功能代码时,原有代码已经预留好了扩展点,不需要修改原来的代码,只要在扩展点上进行添加新代码即可。可以说代码易扩展,还可以说代码灵活。
- 当要实现一个功能时,发现原有代码中已经抽象出了很多底层可以复用的模块、类等代码,可以直接进行使用。可以说代码易复用之外,还可以说代码写得好灵活。
- 当使用某组接口时,如果这个接口可以应对各种使用场景,满足不同的需求。可以说接口易用之外,还可以说这个接口设计得好灵活或者代码写得好灵活。
(5)简洁性(simplicity)
KISS 原则:“Keep It Simple,Stupid”。
尽量保持代码简单。
代码简单、逻辑清晰意味着:易读,易维护。
思从深而行从简,真正的高手能云淡风轻地用最简单的方法解决最复杂的问题。这也是一个编程老手跟编程新手的本质区别之一。
(6)可复用性(reusability)
代码的可复用性可以简单地理解为,尽量减少重复代码的编写,复用已有的代码。
代码可复用性跟 DRY(Don’t Repeat Yourself)这条设计原则的关系很紧密。
(7)可测试性(testability)
代码可测试性的好坏,能从侧面上非常准确地反应代码质量的好坏。
4.如何才能写出高质量的代码
面向对象中的继承、多态能让我们写出可复用的代码;编码规范能让我们写出可读性好的代码;设计原则中的单一职责、DRY、基于接口而非实现、里式替换原则等,可以让我们写出可复用、灵活、可读性好、易扩展、易维护的代码;设计模式可以让我们写出易扩展的代码;持续重构可以时刻保持代码的可维护性等等。
5.面向对象、设计原则、设计模式、编程规范、重构,这五者的关系
(1)面向对象
现在主流的变成风格有三种:面向过程、面向对象和函数式编程。面向对象又是其中最主流的。因为面向对象编程具有丰富的特性:封装、继承、多态和抽象。可以实现很多复杂的设计思路,是很多设计原则和设计模式编码的基础。
主要掌握的知识点:
- 面向对象的四大特性:封装、继承、多态、抽象
- 面向对象编程与面向过程编程的区别和联系
- 面向对象分析、面向对象设计、面向对象编程
- 接口和抽象类的区别以及各自的应用场景
- 基于接口而非实现编程的设计思想
- 多用组合少用继承的设计思想
- 面向过程的贫血模型和面向对象的充血模型
(2)设计原则
设计原则是指导我们代码设计的一些经验总结。设计原则这块儿的知识有一个非常大的特点,那就是这些原则听起来都比较抽象,定义描述都比较模糊,不同的人会有不同的解读。
对于每一种设计原则,我们需要掌握它的设计初衷,能解决哪些编程问题,有哪些应用场景。
需要理解并掌握的常用设计模式:
- SOLID原则 -SRP 单一职责原则
- SOLID原则 -OCP 开闭原则
- SOLID原则 -LSP 里氏替换原则
- SOLID原则 -ISP 接口隔离原则
- SOLID原则 -DIP 依赖倒置原则
- DRY原则、KISS原则、YAGNI原则、LOD法则
(3)设计模式
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。大部分设计模式要解决的都是代码的可扩展性问题。
设计模式有23种,又可以分为三大类:创建型、结构型、行为型。
a.创建型
常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。
不常用:原型模式。
b.结构型
常用:代理模式、桥接模式、装饰者模式、适配器模式
不常用:门面模式、组合模式、享元模式。
c.行为型
常用:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。
不常用:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
(4)编程规范
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。
可以参考书籍:《重构》《代码大全》《代码整洁之道》。
(5)代码重构
在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。
重构是软件开发中非常重要的一个环节。持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步。
重构的工具就是前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。
需要掌握的知识点:
- 重构的目的、对象、时机、方法
- 保证重构不出错的技术手段:单元测试和代码的可测试性。
- 两种不同规格的重构:大重构(大规模高层次)和小重构(小规模低层次)。
五者之间的联系
- 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
- 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
- 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
- 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
- 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。
面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或者提高代码质量的方法论,本质上都是服务于编写高质量代码这一件事的。