设计模式之美第一周

之前也下决心看过《HeadFirst设计模式》和《HeadFirst面向对象分析与设计》,但是都没有坚持读完。看了下极客上的这个课程比较适合自己,希望能坚持下来✊

码农要尽早学习并掌握设计模式相关知识

设计模式能更直接地提高我们的开发能力,如同数据结构和算法教人如何写出高效代码,设计模式教我们如何写出可扩展、可读、可维护的高质量代码。

为什么学习设计模式?

  • 应对面试中的设计模式相关问题
    • 不管是前端、后端还是全栈工程师,在面试中设计模式问题总是被问得频率比较高。因此平时要多注意积累。
  • 被人吐槽代码烂
    • Talk is cheap。 代码能力是码农最基础的能力,是展示程序员基础素养的最直接的衡量标准。这个专栏不仅讲解设计模式,还会通过实战教我们避免类似命名不规范、类设计不合理、分层不清晰、没有模块化概念、代码结构混乱、高度耦合等代码问题
  • 提高复杂代码的设计和开发能力
  • 让读源码、学框架事半功倍
    • 优秀的开源项目、框架、中间件、代码量、类个数都会比较多,为了保证代码的扩展性、灵活性、可维护性,代码中会使用到很多设计模式或者设计思想。学习设计模式相关知识,可以让我们更轻松地读开源项目。
  • 为职场发展做铺垫

投资要趁早,这样才能尽早享受复利。设计模式作为一门与编码、开发有着直接关系的基础知识,早点学习就可以在项目中早点实践锻炼。

从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?

如何评价代码质量的高低?

  • 可维护性 Maintainability,对于一个项目来说,维护代码的时间远远大于编写代码的时间。工程师大部分的时间可能都是花在了修bug,改老功能逻辑,添加新功能之类的工作上。如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非事先编程的设计原则,那么就可能意味着代码易维护。除此之外,还跟项目代码量的多少、业务复杂程度、利用到的技术复杂程序、文档是否全面、团队成员的开发水平等诸多因素有关。
  • 可读性 Readability,Any fool can write code that a computer can understand, Good programmer write code that humans can understand. 看代码是否符合编码规范、命名是否达意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否符合高内聚低耦合等。 Code revie是很好的检测代码可读性的手段。
  • 可扩展性 Extensibility,对修改关闭,对扩展开放设计准则
  • 灵活性 Flexibility, 代码易扩展、易复用、或者易用。
  • 简洁性 Simplicity, KISS原则, ”Keep It Simple, Stupid“,思从深而行从简,真正的高手能云淡风轻地用最简单的方法解决最复杂的问题。
  • 复用性 Reusability, DRY设计原则,Don’t Repeat Yourself
  • 可测试性 Testability, 易写单元测试。

如何写出高质量代码?

需要掌握一些更加细化、更加能落地的编程方法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。

面向对象、设计原则、设计模式、编码规范重构,五者有何关系?

面向对象

  • 四大特性: 封装、抽象、继承、多态
  • 面向对象编程和面向过程编程的区别和联系
  • 面向对象分析、面向对象设计、面向对象编程
  • 接口和抽象类的区别以及各自的应用场景
  • 基于接口而非实现编程的设计思想
  • 多用组合少用继承的设计思想
  • 面向过程的贫血模型和面向对象的充血模型

设计原则

  • SOLID原则-SRP 单一职责原则
  • SOLID原则-OCP 开闭原则
  • SOLID原则-LSP 里式替换原则
  • SOLID原则-ISP 接口隔离原则
  • SOLID原则-DIP 依赖倒置原则
  • DRY原则、KISS原则、YAGNI原则、LOD法则

设计模式

经典的设计模式有23种,随着编程语言的演进,一些设计模式Singleton随时过时,甚至成了反模式,一些则被内置在编程语言中(如Iterator),另外还有一些新模式诞生(如Monostate)。

23中经典的设计模式,可以分为三大类:创建型、结构型、行为型。

  • 创建型
    • 常用的: 单例模式、工厂模式、建造者模式
    • 不常用: 原型模式
  • 结构型
    • 常用的: 代理模式、桥接模式、装饰者模式、适配器模式
    • 不常用: 门面模式、组合模式、享元模式
  • 行为型
    • 常用的: 观察者模式、模版模式、策略模式、指责链模式、迭代器模式、状态模式
    • 不常用: 访问者模式、备忘录模式、命令模式、解释器模式、中介模式

编程规范

编程规范主要解决的是代码的可读性问题。编程规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。 《重构》《代码大全》《代码整洁之道》书籍推荐

代码重构

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

重构的工具就是前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。实际上,设计思想、设计原则、设计模式一个最重要的应用场景就是在重构的时候。虽然设计模式可以提高代码的可扩展性,但是过度不恰当地使用,会增加代码的复杂度,影响代码的可读性。在开发初期,除非特别必须,一定不要过度设计,应用复杂的设计模式。而是当代码出现问题的时候,再针对问题,应用原则和模式进行重构。这样就能有效避免前期的过度设计。

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

五者之间的联系

  • 面向对象编程因其具有丰富的特性,可以实现很多复杂的设计思路,是很多设计原则设计模式等编码实现的基础。
  • 设计原则指导我们代码设计的一些经验总结。
  • 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。相比设计原则更具体更加可执行。
  • 编程规范主要解决代码的可读性问题,相比设计原则、设计模式更具体,更偏重代码细节、更加能落地。持续小重构依赖的理论基础就是编程规范。
  • 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编程规范这些理论。

本周回顾

专栏中所涉及的知识点都在下图中。