设计模式学习之路(一)

设计模式

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)代码重构

在软件开发中,只要软件在不停地迭代,就没有一劳永逸的设计。

重构是软件开发中非常重要的一个环节。持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步。

重构的工具就是前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。

需要掌握的知识点:

  • 重构的目的、对象、时机、方法
  • 保证重构不出错的技术手段:单元测试和代码的可测试性。
  • 两种不同规格的重构:大重构(大规模高层次)和小重构(小规模低层次)。

五者之间的联系

  • 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
  • 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
  • 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
  • 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。

面向对象、设计原则、设计模式、编程规范、代码重构,这五者都是保持或者提高代码质量的方法论,本质上都是服务于编写高质量代码这一件事的。

posted @ 2020-03-09 14:50  zsiscool  阅读(164)  评论(0编辑  收藏  举报